1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
java считает, что получается 13 (я с ней согласна... 0) ++i равно 6 1) ++i равно 7 2) 6+7=13) а вот с++ (пользуюсь с++ builder 5) уверен, что 14.
вопрос: это фишка языка или компилятора (то есть что получится при использовании другого с++-ного компилятора)? и откуда, все же, берется 14?
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
В С++ такое выражение по Стандарту вызывает UB (Undefined Behavior), и результат зависит от компилятора (но с точки зрения того же Стандарта программа содержащая такое выражение - некорректна).
а в чем именно заключается некорректность? в том, что можно рассматривать выражение не как (++i) + (++i) а как ((++i)++) + i ? тогда действительно будет 14...
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
Некорректность заключается в изменении одной переменной в пределах одного выражения (если точнее - между Sequence Points) более одного раза. Скобки положения не спасают, они Sequence Point не являются.
нашла статейку по этому поводу, разобралась окончательно. спасибо большое!
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
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 //счастливой отладки с**и ****** такого извращённого юмора ещё не встречал
Сообщение отредактировано: мисс_граффити -
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!