java считает, что получается 13 (я с ней согласна... 0) ++i равно 6 1) ++i равно 7 2) 6+7=13) а вот с++ (пользуюсь с++ builder 5) уверен, что 14.
вопрос: это фишка языка или компилятора (то есть что получится при использовании другого с++-ного компилятора)? и откуда, все же, берется 14?
Автор: volvo 21.07.2007 22:33
В С++ такое выражение по Стандарту вызывает UB (Undefined Behavior), и результат зависит от компилятора (но с точки зрения того же Стандарта программа содержащая такое выражение - некорректна).
Автор: мисс_граффити 21.07.2007 22:57
а в чем именно заключается некорректность? в том, что можно рассматривать выражение не как (++i) + (++i) а как ((++i)++) + i ? тогда действительно будет 14...
Автор: volvo 21.07.2007 23:01
Некорректность заключается в изменении одной переменной в пределах одного выражения (если точнее - между Sequence Points) более одного раза. Скобки положения не спасают, они Sequence Point не являются.
Автор: мисс_граффити 23.07.2007 3:06
нашла статейку по этому поводу, разобралась окончательно. спасибо большое!
Автор: hardcase 6.08.2007 22:30
Цитата(мисс_граффити @ 23.07.2007 0:06)
нашла статейку по этому поводу, разобралась окончательно. спасибо большое!
Темка устарела, но в догонку оставлю пост. Вот результат дизассемблирования строки i = ++i + ++i (BDS2006, без какой либо оптимизации)
с оптимизацией всю кухную компилер заменил на инструкцию lea, i находится в eax
Код
i = ++i + ++i; 00401019 lea eax,[eax+eax+4]
в обоих случаях получаем 14
Для C# в той же Vs2005 получим 13, вот листинг дизассемблирования:
Код
int i = 5; 00000027 mov esi,5 i = ++i + ++i; 0000002c inc esi 0000002d mov edi,esi 0000002f inc esi 00000030 add esi,edi
Автор: klem4 11.08.2007 23:58
Юль, а ссылочкой на статью не поделишься ?
Автор: Neznaika 12.08.2007 0:13
i = ++i + ++i; Оператор ++ используется только с ПЕРЕМЕННОЙ и производит ДВА результата: 1) сначала на 1 увеличивается i; 2) результат (++i) равен первоначальному значению i плюс 1. Следовательно исходный оператор можно разделить на 3: temp1 = ++i; temp2 = ++i; i = temp1 + temp2; В каком порядке вычисляются temp1 и temp2 не имеет значения, поэтому, если сначала i = 5, то после (i = ++i + ++i) i должно быть равно 13. Правая часть вычисляется независимо от левой. I увеличивается на 1 всего два раза и далее в последней операции сложения не участвует. Откуда BDS2006 и VS2005 получают 14??? Справа два (++i) зависят друг от друга, но левое i... Это же всего лишь приёмник. Разве не так?
Повторяю для особо внимательных: после Undefined Behavior результат программы будет непредсказуемым. И не надо ничего говорить про средства разработки, ты в зеркале ищи ошибку.
Когда тебе говорят "это нельзя делать, потому что...", а ты на это не обращаешь внимания, и делаешь, потому что ХОЧЕТСЯ, кто ж тебе виноват? Видно, никогда не отлаживал код, который после перехода на новую версию компилятора напрочь отказывался работать как требуется, и как работал на старой версии, а в проекте несколько тысяч файлов, и в одном из них какой-то м...к нарушил Стандарт. И пока ошибка не была найдена - аврал...
<******> к вопросу о вчерашних скриптостраданиях. Только что кодер знакомый прислал, нашёл в коде программы, написанной уволенным коллегой незадолго до ухода: <******> #define TRUE FALSE //счастливой отладки с**и ****** такого извращённого юмора ещё не встречал