purebasic.info

PureBasic forum
Текущее время: Чт июл 19, 2018 12:59 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: загадка для вундеркиндов
СообщениеДобавлено: Пт июн 25, 2010 6:43 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6322
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
Есть такой код:
Код:
1
2
 
x=(y=(z=15))



Задача: Скажите, чему будут равны переменные
x,y,z после выполнения кода?
Естественно, ответ надо дать до того, как вы подсмотрите их в отладчике.
Ну и естественно, тот кто угадал, объясните, почему именно так и не как иначе.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 25, 2010 11:53 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 931
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
по моей логике
сначала z=15, потом y=15, потом x=15
но компилятор со мной не согласен


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 26, 2010 12:16 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Из той же оперы
Код:
1
2
Debug y=100
Debug y

Когда-то давно читал про это на оф. форуме, но уже не помню как там это объясняли, да и мой английский оставляет желать лучшего.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 26, 2010 3:06 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт фев 26, 2009 1:53 am
Сообщений: 1154
Откуда: Беларусь, Витебск
Благодарил (а): 22 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Интересно :-) быть может, изюминка в операторах сравнения/присвоения, и их приоритетах?

_________________
Ubuntu 10.10, PureBasic 4.61 x86
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 26, 2010 7:34 am 
Не в сети
профессор

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
По моему правильно, что все вычисления после первого "=" не сохраняются. Но в случае x=(y=(z=15)) я думал будет 15 15 15 :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 26, 2010 8:20 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6322
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
Посмотрел АСМ код:
Код:
1
2
3
4
5
6
7
 
; x=(y=(z=15))
  MOV    ebx,dword [v_y]
  MOV    edi,dword [v_z]
  CMP    esi,15
  CMP    edi,15
  MOV    dword [v_x],15



Т.е. насколько я понял, (а Асм я не очень) то вначале в регистры записываются наши переменные, а их значения изначально 0, потом значения переменных сравнивается с числом 15 (?) и потом переменной х присваивается 15. Т.е. получается, что выполняли не операцию присваивания, а сравнения и присваивания? Или у СМР тут какой то другой смысл?

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 26, 2010 9:03 am 
Не в сети
профессор

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
CMP здесь вобще левый, а появился он по причине x=(y>(z<>15)) :P


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 26, 2010 11:28 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн сен 07, 2009 10:00 pm
Сообщений: 1046
Откуда: Николаев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Наверное всё таки дело в приоритетах операторов "-", "+", "/", "*"
Так как их нет, а "=" и скобки не являются главными в этом случае,
то программа выполняется с лева на право по очереди и равенство присваевается с лева на право к x
Сначало в ячеку памяти записали:
результат x=0, дальше к результату (к x) приравниваем y
результат тоже ноль(y=0 изначально), дальше к общему результату приравниваем z
результат тоже ноль, далее к общему результату присваеваем 15
результат 15
фактически к y и z мы ничего не приравнивали они были 0 так и остаются, а приравнивали к x
x=15


Может всё это глупости...

_________________
www.mirashic.narod.ru
Первое знакомство с PB


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 26, 2010 12:24 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн сен 07, 2009 10:00 pm
Сообщений: 1046
Откуда: Николаев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Наверное не правильно...

x=(0=(0=15))
y=(0=(0=(0=15)))
z=(15=(15=15))


Debug x
Debug y
Debug z

_________________
www.mirashic.narod.ru
Первое знакомство с PB


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 26, 2010 12:58 pm 
Не в сети
ассистент

Зарегистрирован: Сб сен 05, 2009 8:37 am
Сообщений: 10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Программа выполняется также, как и математические выражения - начиная с внутренних скобок.
Вопрос в топ, где присваивание,а где сравнение. Вот поэтому операторы присваиваия и сравнения должны различаться(= и ==)
!)z=15 - сравнение. возвращает 15! не изменяет z. (а 15 - это разность между 15 и 0, оператор CMP работает через вычитание)
Debug (z=15)
2)y=15 - сравнение. возвращает 15. не изменяет y.
Debug (y=(z=15))
3)x=15 - присваивание


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 26, 2010 1:23 pm 
Не в сети
ассистент

Зарегистрирован: Сб сен 05, 2009 8:37 am
Сообщений: 10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
хотя, нет. судя по асм коду все как-то не так
ведь CMP не возвращает результат вычитания

сравнение ничего не возвращает,както пурик непонятно разбирает эту строку, он 15 ставит как константу. x и y не зависит от результата (z=15)!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 11, 2010 1:57 am 
Не в сети
док

Зарегистрирован: Вс май 02, 2010 4:54 pm
Сообщений: 117
Откуда: оттуда...
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
22vlad писал(а):
по моей логике

сначала z=15, потом y=15, потом x=15

но компилятор со мной не согласен

Значит логика Cи-шная... :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 01, 2010 12:03 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Вт сен 02, 2008 5:44 pm
Сообщений: 59
Откуда: S.W.A.R.M.
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
x = 15
y = 0
z = 0

Так как последние 2 это условия


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 11, 2010 12:01 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Новая задачка.
Догадайтесь что будет в переменных не запуская прогу
Код:
1
2
3
a =1 :b = 20:ab=300
a + b = ab
 


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 11, 2010 5:58 am 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
a + b = ab
возможно эта строчка высветит ошибку, ведь положено:
ab=a+b

но, если ошибки не будет:
a=1
b=20
ab=21


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB