Нашел на просторах интернета интересную задачу:
int i = 5;
i = ++i + ++i;
чему равно i в итоге?
[Ответ]
Shtirliz 10:14 04.06.2010
Так побочный эффект же... Нельзя же использовать операции присваивания переменной в выражении, если она используется в нем более одного раза. А в gcc должно быть по идеи 14, потому что сначала считаем инкременты получаем ++i = 6, ++i = 7 и 7 + 7 = 14
[Ответ]
su -o 10:57 04.06.2010
Действительно есть такое мнение, но некоторые компиляторы все же выдают 13.
нервного подергивания не получиться, т.к. это (ИМХО)-- может выполнится только на следующей итерации, при условии, что все это делается в цикле.
Хотя опять таки все может зависеть от компилятора.
По поводу приоритетов, то выражение, которое я привел в начале топика может интерпретироваться двумя способами:
1)
int i=2;
++i;
++i;
i=i+i;
/*(так получается по замечанию Штирлица (i = 4+4 = 8)), однако есть и другой вариант интерпретации, ниже:
*/
2)
int i=2;
i=++(++i + i);
/*
а вот здесь получается 7, т.е. i = (3+3)+1 =7
*/
, получается как в анекдоте:
- гоги сколько будет 2*2?
- 8 (восем) учтьел!
- правилно гоги, где-то сем, восем.
[Ответ]
dr-sm, спасибо, познавательно. Теперь я могу научными словами объяснить, почему так не надо делать.
[Ответ]
Akad 02:40 07.06.2010
Ежели следовать стандартам, то так естественно можно писать. Но ведь компиляторы пишут люди... Вон в MS компиляторе вообще до сих пор через раз работают сложные битовые операции с участием BYTE при привидении к __int64.
Поэтому если важна корректность работы программы лучше расставлять по больше скобок, а всякие i++ и ++i использовать только отдельно. dr-sm, девочка практик, со слабым знанием теории.
[Ответ]
Part!zan 19:23 07.06.2010
Сообщение от Akad:
Ежели следовать стандартам, то так естественно можно писать
Можно, только результат будет неопределенным. Неужто, не хватает более других багов?
[Ответ]
dr-sm 19:32 07.06.2010
Akad, мне непонятно, что ты хотел сказать.
какой теории, стандарт это не теория, это стандарт .
про скобки, полностью поддерживаю.
[Ответ]
Spectator 20:55 09.06.2010
Сообщение от su -o:
Поиск не курил, так что если что извините за боян
Нашел на просторах интернета интересную задачу:
int i = 5;
i = ++i + ++i;
чему равно i в итоге?
i=5
Первая итерация ++i = 6
Вторая итерация ++i = 7
Третья итерация 6+7 = 13
Сообщение от su -o:
Например С++ действительно 14, а С# 13.
Ерунда)))
Будет 13. Тут все просто, две унарных и одна бинарная операция, сложно только со стороны)))
И никаких 14 в С++ не будет)))
[Ответ]
Shtirliz, ну человек с компом на ВЫ, сделай скидку)
[Ответ]
su -o 08:40 10.06.2010
Ну вот, появился Spectator и тему можно переносить в раздел юмора.
А я надеялся на немного другое развитие темы.
У кого есть еще примеры получения разного результата в завиимости от версии компилятора?
Интересна тема с приведением типов.
[Ответ]
su -o 08:43 10.06.2010
Сообщение от X0R: Shtirliz, ну человек с компом на ВЫ, сделай скидку)
Ага, типа:
-Вы с компютером на ты или на Вы?
-Да я с ним на "*б твою мать"!
[Ответ]
Сообщение от su -o:
Ну вот, появился Spectator и тему можно переносить в раздел юмора.
Я не совсем понимаю отчего обо мне сложилось такое мнение))) Но мне искренне смешно.
Сообщение от su -o:
Интересна тема с приведением типов.
Какое отношение имеет поднятый вопрос с приведением типов?)))
[Ответ]
Spectator 12:34 10.06.2010
Вопрос на самом деле упирается вот во что (и почему он возник):
При компиляции программы переменные сохраняются либо в регистрах процессора, либо в памяти. В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение.
Мораль сей басни такова - не надо писать такой код, я уже обжигался и не раз. Почему - потому что стандартам сегодня строго никто не следует, это несовместимо с понятием оптимизирующего компилятора.
И, если уж и проверять такие фокусы в конкретных компиляторах, нужно ПОЛНОСТЬЮ отключать оптимизацию.
"Мудрецам" от программирования для понимания вышеперечисленного рекомендую изучить хотя бы поверхностно ассемблер, выбрать любой компилятор и посмотреть - как меняется исполняемый код в зависимости от настроек оптимизатора, ужаснуться и запомнить что так писать - НИЗЯ!))))
[Ответ]
Part!zan 19:26 10.06.2010
Сообщение от Spectator:
Я не совсем понимаю отчего обо мне сложилось такое мнение
Свят-свят... Тебе точно в РПЦ надо. Послушай доброго совета. Не губи свою душу в таком бесовском занятии, как программирование.
Сообщение от Spectator:
При компиляции программы переменные сохраняются либо в регистрах процессора, либо в памяти. В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение.
Аффтар, пеши исчо. Только в разделе юмора.
Сообщение от Spectator:
Мудрецам" от программирования для понимания вышеперечисленного рекомендую изучить хотя бы поверхностно ассемблер, выбрать любой компилятор и посмотреть - как меняется исполняемый код в зависимости от настроек оптимизатора
Ты открыл нам глаза, отче. А мы-то все на бейсике, да на бейсике... Про ассемблер только в анекдотах слышали... И еще, вот, от тебя...
[Ответ]
Shtirliz 19:53 10.06.2010
Сообщение от Spectator:
потому что стандартам сегодня строго никто не следует, это несовместимо с понятием оптимизирующего компилятора.
Внезапно, им не следуют потому что его, в данном случае, просто не существует для С (в отличии от Java, кстати говоря) Spectator, вы отлично пересказали содержимое предыдущих постов.
Сообщение от Spectator:
я уже обжигался и не раз.
А я ни разу...
И, да, чуть не забыл, ассемблер нужен очень-очень редко, почему, надеюсь, такому проффессионалу как вы, Spectator, объяснять не нужно.
[Ответ]
X0R 20:08 10.06.2010
Сообщение от Spectator:
В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение.
Spectator, не будет, ну если конечно я совсем из ума не выживу...
[Ответ]
su -o 06:54 11.06.2010
в мемориз
Сообщение от Spectator:
Вопрос на самом деле упирается вот во что (и почему он возник): При компиляции программы переменные сохраняются либо в регистрах процессора, либо в памяти. В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение.
Мораль сей басни такова - не надо писать такой код, я уже обжигался и не раз. Почему - потому что стандартам сегодня строго никто не следует, это несовместимо с понятием оптимизирующего компилятора.
И, если уж и проверять такие фокусы в конкретных компиляторах, нужно ПОЛНОСТЬЮ отключать оптимизацию.
"Мудрецам" от программирования для понимания вышеперечисленного рекомендую изучить хотя бы поверхностно ассемблер, выбрать любой компилятор и посмотреть - как меняется исполняемый код в зависимости от настроек оптимизатора, ужаснуться и запомнить что так писать - НИЗЯ!))))
Сообщение от Shtirliz:
Внезапно, им не следуют потому что его, в данном случае, просто не существует для С (в отличии от Java, кстати говоря) Spectator, вы отлично пересказали содержимое предыдущих постов.
А я ни разу...
И, да, чуть не забыл, ассемблер нужен очень-очень редко, почему, надеюсь, такому проффессионалу как вы, Spectator, объяснять не нужно.