
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
Загадки компиляторов
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
|
Опции темы |
|
|
#2 |
|
Форумец
Сообщений: 248
Регистрация: 17.01.2005
|
Так побочный эффект же... Нельзя же использовать операции присваивания переменной в выражении, если она используется в нем более одного раза. А в gcc должно быть по идеи 14, потому что сначала считаем инкременты получаем ++i = 6, ++i = 7 и 7 + 7 = 14
|
|
|
|
|
#6 |
|
FSM follower
Сообщений: 797
Регистрация: 25.06.2007
Возраст: 47
|
нервного подергивания не получиться, т.к. это (ИМХО)-- может выполнится только на следующей итерации, при условии, что все это делается в цикле.Хотя опять таки все может зависеть от компилятора. По поводу приоритетов, то выражение, которое я привел в начале топика может интерпретироваться двумя способами: 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. |
|
|
|
|
#7 |
|
Fun-Da-Mental
Сообщений: 201
Регистрация: 08.04.2005
|
читать тут: точки следования
|
|
|
|
|
#9 |
|
Форумец
Сообщений: 2,159
Регистрация: 15.01.2003
|
Ежели следовать стандартам, то так естественно можно писать. Но ведь компиляторы пишут люди... Вон в MS компиляторе вообще до сих пор через раз работают сложные битовые операции с участием BYTE при привидении к __int64.
Поэтому если важна корректность работы программы лучше расставлять по больше скобок, а всякие i++ и ++i использовать только отдельно. dr-sm, девочка практик, со слабым знанием теории. |
|
|
|
|
#12 | |
|
Форумец
Сообщений: 44,624
Регистрация: 27.05.2003
Возраст: 48
|
Цитата:
Первая итерация ++i = 6 Вторая итерация ++i = 7 Третья итерация 6+7 = 13 Ерунда))) Будет 13. Тут все просто, две унарных и одна бинарная операция, сложно только со стороны))) И никаких 14 в С++ не будет))) |
|
|
|
|
|
#19 |
|
FSM follower
Сообщений: 797
Регистрация: 25.06.2007
Возраст: 47
|
Ну вот, появился Spectator и тему можно переносить в раздел юмора.
А я надеялся на немного другое развитие темы. У кого есть еще примеры получения разного результата в завиимости от версии компилятора? Интересна тема с приведением типов. Последний раз редактировалось su -o; 11.06.2010 в 09:21. |
|
|
|
|
#21 |
|
Форумец
Сообщений: 44,624
Регистрация: 27.05.2003
Возраст: 48
|
Окончим спор на этом:
http://lurkmore.ru/I++ Я не совсем понимаю отчего обо мне сложилось такое мнение))) Но мне искренне смешно. Какое отношение имеет поднятый вопрос с приведением типов?))) |
|
|
|
|
#22 |
|
Форумец
Сообщений: 44,624
Регистрация: 27.05.2003
Возраст: 48
|
Вопрос на самом деле упирается вот во что (и почему он возник):
При компиляции программы переменные сохраняются либо в регистрах процессора, либо в памяти. В одном и том же компиляторе при разных настройках (или даже при изменении кода рядом с проверяемой строчкой) значение переменной может перейти из регистра в память, и получится другое значение. Мораль сей басни такова - не надо писать такой код, я уже обжигался и не раз. Почему - потому что стандартам сегодня строго никто не следует, это несовместимо с понятием оптимизирующего компилятора. И, если уж и проверять такие фокусы в конкретных компиляторах, нужно ПОЛНОСТЬЮ отключать оптимизацию. "Мудрецам" от программирования для понимания вышеперечисленного рекомендую изучить хотя бы поверхностно ассемблер, выбрать любой компилятор и посмотреть - как меняется исполняемый код в зависимости от настроек оптимизатора, ужаснуться и запомнить что так писать - НИЗЯ!)))) |
|
|
|
|
#23 | |
|
Out There
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47
|
Свят-свят... Тебе точно в РПЦ надо. Послушай доброго совета. Не губи свою душу в таком бесовском занятии, как программирование.
Цитата:
Ты открыл нам глаза, отче. А мы-то все на бейсике, да на бейсике... Про ассемблер только в анекдотах слышали... И еще, вот, от тебя... Последний раз редактировалось Part!zan; 10.06.2010 в 20:21. |
|
|
|
|
|
#24 | |
|
Форумец
Сообщений: 248
Регистрация: 17.01.2005
|
Цитата:
Spectator, вы отлично пересказали содержимое предыдущих постов. А я ни разу... И, да, чуть не забыл, ассемблер нужен очень-очень редко, почему, надеюсь, такому проффессионалу как вы, Spectator, объяснять не нужно. |
|
|
|
|
|
#25 |
|
старый хрыч
Сообщений: 6,334
Регистрация: 17.12.2006
Возраст: 38
|
|
|
|
|
|
#29 | |
|
FSM follower
Сообщений: 797
Регистрация: 25.06.2007
Возраст: 47
|
в мемориз
Цитата:
|
|
|
|
|
|
#30 | |
|
Fun-Da-Mental
Сообщений: 201
Регистрация: 08.04.2005
|
Цитата:
|
|
|
|