purebasic.info
http://purebasic.info/phpBB3ex/

загадка для вундеркиндов
http://purebasic.info/phpBB3ex/viewtopic.php?f=8&t=1217
Страница 1 из 2

Автор:  kvitaliy [ Пт июн 25, 2010 6:43 pm ]
Заголовок сообщения:  загадка для вундеркиндов

Есть такой код:
Код:
1
2
 
x=(y=(z=15))



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

Автор:  22vlad [ Пт июн 25, 2010 11:53 pm ]
Заголовок сообщения: 

по моей логике
сначала z=15, потом y=15, потом x=15
но компилятор со мной не согласен

Автор:  Пётр [ Сб июн 26, 2010 12:16 am ]
Заголовок сообщения: 

Из той же оперы
Код:
1
2
Debug y=100
Debug y

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

Автор:  Angelian [ Сб июн 26, 2010 3:06 am ]
Заголовок сообщения: 

Интересно :-) быть может, изюминка в операторах сравнения/присвоения, и их приоритетах?

Автор:  puremaster [ Сб июн 26, 2010 7:34 am ]
Заголовок сообщения: 

По моему правильно, что все вычисления после первого "=" не сохраняются. Но в случае x=(y=(z=15)) я думал будет 15 15 15 :)

Автор:  kvitaliy [ Сб июн 26, 2010 8:20 am ]
Заголовок сообщения: 

Посмотрел АСМ код:
Код:
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. Т.е. получается, что выполняли не операцию присваивания, а сравнения и присваивания? Или у СМР тут какой то другой смысл?

Автор:  puremaster [ Сб июн 26, 2010 9:03 am ]
Заголовок сообщения: 

CMP здесь вобще левый, а появился он по причине x=(y>(z<>15)) :P

Автор:  mirashic [ Сб июн 26, 2010 11:28 am ]
Заголовок сообщения: 

Наверное всё таки дело в приоритетах операторов "-", "+", "/", "*"
Так как их нет, а "=" и скобки не являются главными в этом случае,
то программа выполняется с лева на право по очереди и равенство присваевается с лева на право к x
Сначало в ячеку памяти записали:
результат x=0, дальше к результату (к x) приравниваем y
результат тоже ноль(y=0 изначально), дальше к общему результату приравниваем z
результат тоже ноль, далее к общему результату присваеваем 15
результат 15
фактически к y и z мы ничего не приравнивали они были 0 так и остаются, а приравнивали к x
x=15


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

Автор:  mirashic [ Сб июн 26, 2010 12:24 pm ]
Заголовок сообщения: 

Наверное не правильно...

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


Debug x
Debug y
Debug z

Автор:  Ынтон [ Сб июн 26, 2010 12:58 pm ]
Заголовок сообщения: 

Программа выполняется также, как и математические выражения - начиная с внутренних скобок.
Вопрос в топ, где присваивание,а где сравнение. Вот поэтому операторы присваиваия и сравнения должны различаться(= и ==)
!)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 ]
Заголовок сообщения: 

хотя, нет. судя по асм коду все как-то не так
ведь CMP не возвращает результат вычитания

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

Автор:  Sp01LeR [ Ср авг 11, 2010 1:57 am ]
Заголовок сообщения: 

22vlad писал(а):
по моей логике

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

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

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

Автор:  Maxus [ Ср сен 01, 2010 12:03 pm ]
Заголовок сообщения: 

x = 15
y = 0
z = 0

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

Автор:  Пётр [ Сб сен 11, 2010 12:01 am ]
Заголовок сообщения: 

Новая задачка.
Догадайтесь что будет в переменных не запуская прогу
Код:
1
2
3
a =1 :b = 20:ab=300
a + b = ab
 


Автор:  haav [ Сб сен 11, 2010 5:58 am ]
Заголовок сообщения: 

a + b = ab
возможно эта строчка высветит ошибку, ведь положено:
ab=a+b

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

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/