Большой Воронежский Форум
Страница 1 из 2
1 2 >
» Программирование>Загадки компиляторов
su -o 08:08 04.06.2010
Поиск не курил, так что если что извините за боян

Нашел на просторах интернета интересную задачу:
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.

Например С++ действительно 14, а С# 13.
[Ответ]
Shtirliz 11:08 04.06.2010
Ну, вообще говоря, так писать нельзя. [Ответ]
MadFish 13:49 04.06.2010
нервное подергивание:
++i-- [Ответ]
su -o 22:36 04.06.2010

Сообщение от MadFish:
нервное подергивание:
++i--

нервного подергивания не получиться, т.к. это (ИМХО)-- может выполнится только на следующей итерации, при условии, что все это делается в цикле.
Хотя опять таки все может зависеть от компилятора.


По поводу приоритетов, то выражение, которое я привел в начале топика может интерпретироваться двумя способами:
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 14:59 05.06.2010
читать тут: точки следования [Ответ]
Part!zan 17:21 05.06.2010
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 в С++ не будет))) [Ответ]
Part!zan 20:57 09.06.2010
Spectator, какой же ты умный... [Ответ]
Spectator 21:02 09.06.2010

Сообщение от Part!zan:
Spectator, какой же ты умный...

А што делать? Жизнь такая)))) [Ответ]
Part!zan 21:04 09.06.2010
Широкой души человек... С таким апломбом - далеко пойдешь. [Ответ]
X0R 22:04 09.06.2010

Сообщение от Spectator:
И никаких 14 в С++ не будет)))

Spectator, а ты ваще программировать то умеешь?
Изображения
Нажмите на изображение для увеличения
Название: sshot_5.png
Просмотров: 5
Размер:	9.6 Кб
ID:	826916  
[Ответ]
Shtirliz 22:59 09.06.2010
Spectator, опять вы и опять странные доводы...
Уж сколько раз написали, что зависит от компилятора, а вы все туда же...
Изображения
Нажмите на изображение для увеличения
Название: Terminal.png
Просмотров: 30
Размер:	53.5 Кб
ID:	826972  
[Ответ]
X0R 23:23 09.06.2010
Shtirliz, ну человек с компом на ВЫ, сделай скидку) [Ответ]
su -o 08:40 10.06.2010
Ну вот, появился Spectator и тему можно переносить в раздел юмора.
А я надеялся на немного другое развитие темы.
У кого есть еще примеры получения разного результата в завиимости от версии компилятора?
Интересна тема с приведением типов. [Ответ]
su -o 08:43 10.06.2010

Сообщение от X0R:
Shtirliz, ну человек с компом на ВЫ, сделай скидку)


Ага, типа:
-Вы с компютером на ты или на Вы?
-Да я с ним на "*б твою мать"!
[Ответ]
Spectator 12:14 10.06.2010
Окончим спор на этом:
http://lurkmore.ru/I++

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

то ли 0 то ли 2, то ли хyй, толи пи3да! [Ответ]
Spectator 22:16 10.06.2010

Сообщение от X0R:
то ли 0 то ли 2, то ли хyй, толи пи3да!

Именно так))) [Ответ]
Spectator 22:17 10.06.2010

Сообщение от Shtirliz:
А я ни разу...

)))))))))))))) Всё будет. Быть может. [Ответ]
Shtirliz 23:01 10.06.2010
Spectator, не будет, ну если конечно я совсем из ума не выживу... [Ответ]
su -o 06:54 11.06.2010
в мемориз

Сообщение от Spectator:
Вопрос на самом деле упирается вот во что (и почему он возник):
При компиляции программы переменные сохраняются либо в регистрах процессора, либо в памяти. В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение.
Мораль сей басни такова - не надо писать такой код, я уже обжигался и не раз. Почему - потому что стандартам сегодня строго никто не следует, это несовместимо с понятием оптимизирующего компилятора.
И, если уж и проверять такие фокусы в конкретных компиляторах, нужно ПОЛНОСТЬЮ отключать оптимизацию.
"Мудрецам" от программирования для понимания вышеперечисленного рекомендую изучить хотя бы поверхностно ассемблер, выбрать любой компилятор и посмотреть - как меняется исполняемый код в зависимости от настроек оптимизатора, ужаснуться и запомнить что так писать - НИЗЯ!))))

отсыпь чуть, а? [Ответ]
dr-sm 07:17 11.06.2010

Сообщение от Shtirliz:
Внезапно, им не следуют потому что его, в данном случае, просто не существует для С (в отличии от Java, кстати говоря)
Spectator, вы отлично пересказали содержимое предыдущих постов.

А я ни разу...

И, да, чуть не забыл, ассемблер нужен очень-очень редко, почему, надеюсь, такому проффессионалу как вы, Spectator, объяснять не нужно.

ВНЕЗАПНО О_о 5.1.2.3 [Ответ]
Страница 1 из 2
1 2 >
Вверх