Старый 04.06.2010, 08:08   #1   
FSM follower
 
Аватар для su -o
 
Сообщений: 797
Регистрация: 25.06.2007
Возраст: 47

su -o вне форума Не в сети
Загадки компиляторов

Поиск не курил, так что если что извините за боян

Нашел на просторах интернета интересную задачу:
int i = 5;
i = ++i + ++i;
чему равно i в итоге?
  Ответить с цитированием
Старый 04.06.2010, 10:14   #2   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Так побочный эффект же... Нельзя же использовать операции присваивания переменной в выражении, если она используется в нем более одного раза. А в gcc должно быть по идеи 14, потому что сначала считаем инкременты получаем ++i = 6, ++i = 7 и 7 + 7 = 14
  Ответить с цитированием
Старый 04.06.2010, 10:57   #3   
FSM follower
 
Аватар для su -o
 
Сообщений: 797
Регистрация: 25.06.2007
Возраст: 47

su -o вне форума Не в сети
Действительно есть такое мнение, но некоторые компиляторы все же выдают 13.

Например С++ действительно 14, а С# 13.
  Ответить с цитированием
Старый 04.06.2010, 11:08   #4   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Ну, вообще говоря, так писать нельзя.
  Ответить с цитированием
Старый 04.06.2010, 13:49   #5   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
нервное подергивание:
++i--
  Ответить с цитированием
Старый 04.06.2010, 22:36   #6   
FSM follower
 
Аватар для su -o
 
Сообщений: 797
Регистрация: 25.06.2007
Возраст: 47

su -o вне форума Не в сети
Цитата:
Сообщение от 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 (восем) учтьел!
- правилно гоги, где-то сем, восем.

Последний раз редактировалось su -o; 06.06.2010 в 07:38.
  Ответить с цитированием
Старый 05.06.2010, 14:59   #7   
Fun-Da-Mental
 
Аватар для dr-sm
 
Сообщений: 201
Регистрация: 08.04.2005

dr-sm вне форума Не в сети
читать тут: точки следования
  Ответить с цитированием
Старый 05.06.2010, 17:21   #8   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
dr-sm, спасибо, познавательно. Теперь я могу научными словами объяснить, почему так не надо делать.
  Ответить с цитированием
Старый 07.06.2010, 02:40   #9   
Форумец
 
Сообщений: 2,159
Регистрация: 15.01.2003

Akad вне форума Не в сети
Ежели следовать стандартам, то так естественно можно писать. Но ведь компиляторы пишут люди... Вон в MS компиляторе вообще до сих пор через раз работают сложные битовые операции с участием BYTE при привидении к __int64.
Поэтому если важна корректность работы программы лучше расставлять по больше скобок, а всякие i++ и ++i использовать только отдельно.
dr-sm, девочка практик, со слабым знанием теории.
  Ответить с цитированием
Старый 07.06.2010, 19:23   #10   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Цитата:
Сообщение от Akad Посмотреть сообщение
Ежели следовать стандартам, то так естественно можно писать
Можно, только результат будет неопределенным. Неужто, не хватает более других багов?
  Ответить с цитированием
Старый 07.06.2010, 19:32   #11   
Fun-Da-Mental
 
Аватар для dr-sm
 
Сообщений: 201
Регистрация: 08.04.2005

dr-sm вне форума Не в сети
Akad, мне непонятно, что ты хотел сказать.
какой теории, стандарт это не теория, это стандарт .
про скобки, полностью поддерживаю.
  Ответить с цитированием
Старый 09.06.2010, 20:55   #12   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,625
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Цитата:
Сообщение от su -o Посмотреть сообщение
Поиск не курил, так что если что извините за боян

Нашел на просторах интернета интересную задачу:
int i = 5;
i = ++i + ++i;
чему равно i в итоге?
i=5
Первая итерация ++i = 6
Вторая итерация ++i = 7
Третья итерация 6+7 = 13

Цитата:
Сообщение от su -o Посмотреть сообщение
Например С++ действительно 14, а С# 13.
Ерунда)))
Будет 13. Тут все просто, две унарных и одна бинарная операция, сложно только со стороны)))
И никаких 14 в С++ не будет)))
  Ответить с цитированием
Старый 09.06.2010, 20:57   #13   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Spectator, какой же ты умный...
  Ответить с цитированием
Старый 09.06.2010, 21:02   #14   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,625
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Цитата:
Сообщение от Part!zan Посмотреть сообщение
Spectator, какой же ты умный...
А што делать? Жизнь такая))))
  Ответить с цитированием
Старый 09.06.2010, 21:04   #15   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Широкой души человек... С таким апломбом - далеко пойдешь.
  Ответить с цитированием
Старый 09.06.2010, 22:04   #16   
старый хрыч
 
Аватар для X0R
 
Сообщений: 6,334
Регистрация: 17.12.2006
Возраст: 38

X0R вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
И никаких 14 в С++ не будет)))
Spectator, а ты ваще программировать то умеешь?
Миниатюры
Нажмите на изображение для увеличения
Название: sshot_5.png
Просмотров: 7
Размер:	9.6 Кб
ID:	826916  
  Ответить с цитированием
Старый 09.06.2010, 22:59   #17   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Spectator, опять вы и опять странные доводы...
Уж сколько раз написали, что зависит от компилятора, а вы все туда же...
Миниатюры
Нажмите на изображение для увеличения
Название: Terminal.png
Просмотров: 31
Размер:	53.5 Кб
ID:	826972  
  Ответить с цитированием
Старый 09.06.2010, 23:23   #18   
старый хрыч
 
Аватар для X0R
 
Сообщений: 6,334
Регистрация: 17.12.2006
Возраст: 38

X0R вне форума Не в сети
Shtirliz, ну человек с компом на ВЫ, сделай скидку)
  Ответить с цитированием
Старый 10.06.2010, 08:40   #19   
FSM follower
 
Аватар для su -o
 
Сообщений: 797
Регистрация: 25.06.2007
Возраст: 47

su -o вне форума Не в сети
Ну вот, появился Spectator и тему можно переносить в раздел юмора.
А я надеялся на немного другое развитие темы.
У кого есть еще примеры получения разного результата в завиимости от версии компилятора?
Интересна тема с приведением типов.

Последний раз редактировалось su -o; 11.06.2010 в 09:21.
  Ответить с цитированием
Старый 10.06.2010, 08:43   #20   
FSM follower
 
Аватар для su -o
 
Сообщений: 797
Регистрация: 25.06.2007
Возраст: 47

su -o вне форума Не в сети
Цитата:
Сообщение от X0R Посмотреть сообщение
Shtirliz, ну человек с компом на ВЫ, сделай скидку)

Ага, типа:
-Вы с компютером на ты или на Вы?
-Да я с ним на "*б твою мать"!
  Ответить с цитированием
Старый 10.06.2010, 12:14   #21   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,625
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Окончим спор на этом:
http://lurkmore.ru/I++

Цитата:
Сообщение от su -o Посмотреть сообщение
Ну вот, появился Spectator и тему можно переносить в раздел юмора.
Я не совсем понимаю отчего обо мне сложилось такое мнение))) Но мне искренне смешно.

Цитата:
Сообщение от su -o Посмотреть сообщение
Интересна тема с приведением типов.
Какое отношение имеет поднятый вопрос с приведением типов?)))
  Ответить с цитированием
Старый 10.06.2010, 12:34   #22   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,625
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Вопрос на самом деле упирается вот во что (и почему он возник):
При компиляции программы переменные сохраняются либо в регистрах процессора, либо в памяти. В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение.
Мораль сей басни такова - не надо писать такой код, я уже обжигался и не раз. Почему - потому что стандартам сегодня строго никто не следует, это несовместимо с понятием оптимизирующего компилятора.
И, если уж и проверять такие фокусы в конкретных компиляторах, нужно ПОЛНОСТЬЮ отключать оптимизацию.
"Мудрецам" от программирования для понимания вышеперечисленного рекомендую изучить хотя бы поверхностно ассемблер, выбрать любой компилятор и посмотреть - как меняется исполняемый код в зависимости от настроек оптимизатора, ужаснуться и запомнить что так писать - НИЗЯ!))))
  Ответить с цитированием
Старый 10.06.2010, 19:26   #23   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
Я не совсем понимаю отчего обо мне сложилось такое мнение
Свят-свят... Тебе точно в РПЦ надо. Послушай доброго совета. Не губи свою душу в таком бесовском занятии, как программирование.

Цитата:
Сообщение от Spectator Посмотреть сообщение
При компиляции программы переменные сохраняются либо в регистрах процессора, либо в памяти. В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение.
Аффтар, пеши исчо. Только в разделе юмора.

Цитата:
Сообщение от Spectator Посмотреть сообщение
Мудрецам" от программирования для понимания вышеперечисленного рекомендую изучить хотя бы поверхностно ассемблер, выбрать любой компилятор и посмотреть - как меняется исполняемый код в зависимости от настроек оптимизатора
Ты открыл нам глаза, отче. А мы-то все на бейсике, да на бейсике... Про ассемблер только в анекдотах слышали... И еще, вот, от тебя...

Последний раз редактировалось Part!zan; 10.06.2010 в 20:21.
  Ответить с цитированием
Старый 10.06.2010, 19:53   #24   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

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

И, да, чуть не забыл, ассемблер нужен очень-очень редко, почему, надеюсь, такому проффессионалу как вы, Spectator, объяснять не нужно.
  Ответить с цитированием
Старый 10.06.2010, 20:08   #25   
старый хрыч
 
Аватар для X0R
 
Сообщений: 6,334
Регистрация: 17.12.2006
Возраст: 38

X0R вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение.
то ли 0 то ли 2, то ли хyй, толи пи3да!
  Ответить с цитированием
Старый 10.06.2010, 22:16   #26   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,625
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Цитата:
Сообщение от X0R Посмотреть сообщение
то ли 0 то ли 2, то ли хyй, толи пи3да!
Именно так)))
  Ответить с цитированием
Старый 10.06.2010, 22:17   #27   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,625
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
А я ни разу...
)))))))))))))) Всё будет. Быть может.
  Ответить с цитированием
Старый 10.06.2010, 23:01   #28   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Spectator, не будет, ну если конечно я совсем из ума не выживу...
  Ответить с цитированием
Старый 11.06.2010, 06:54   #29   
FSM follower
 
Аватар для su -o
 
Сообщений: 797
Регистрация: 25.06.2007
Возраст: 47

su -o вне форума Не в сети
в мемориз
Цитата:
Сообщение от Spectator Посмотреть сообщение
Вопрос на самом деле упирается вот во что (и почему он возник):
При компиляции программы переменные сохраняются либо в регистрах процессора, либо в памяти. В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение.
Мораль сей басни такова - не надо писать такой код, я уже обжигался и не раз. Почему - потому что стандартам сегодня строго никто не следует, это несовместимо с понятием оптимизирующего компилятора.
И, если уж и проверять такие фокусы в конкретных компиляторах, нужно ПОЛНОСТЬЮ отключать оптимизацию.
"Мудрецам" от программирования для понимания вышеперечисленного рекомендую изучить хотя бы поверхностно ассемблер, выбрать любой компилятор и посмотреть - как меняется исполняемый код в зависимости от настроек оптимизатора, ужаснуться и запомнить что так писать - НИЗЯ!))))
отсыпь чуть, а?
  Ответить с цитированием
Старый 11.06.2010, 07:17   #30   
Fun-Da-Mental
 
Аватар для dr-sm
 
Сообщений: 201
Регистрация: 08.04.2005

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

А я ни разу...

И, да, чуть не забыл, ассемблер нужен очень-очень редко, почему, надеюсь, такому проффессионалу как вы, Spectator, объяснять не нужно.
ВНЕЗАПНО О_о 5.1.2.3
  Ответить с цитированием
Поиск в теме: 


Опции темы

Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind