КИТА unofficial
Ноябрь 22, 2024, 04:23:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: [1]   Вниз
  Печать  
Автор Тема: Sequence point  (Прочитано 5838 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Романыч
Я Романов!
Завкаф
****

Карма: +34/-2
Offline Offline

Пол: Мужской
Награды:
1 место в фотоконкурсе \
Сообщений: 1068


Я Русский!


« : Август 02, 2007, 11:21:02 »

По поводу приколов в стиле
Код: (cpp)
int a = 5, b;
b = ++a + ++a;

Результат:
b = 13 или b = 14
Нашлась статейка откуда же все оно берется: http://en.wikipedia.org/wiki/Sequence_point
« Последнее редактирование: Март 19, 2008, 04:02:24 от Романыч » Записан

Freelance, web designer, front-end & back-end developer, java developer, php developer. A person who enjoys designing software and building programs.
Storm
Верховный
Администратор
Аспирант
*****

Карма: +29/-0
Offline Offline

Пол: Мужской
Сообщений: 484



« Ответ #1 : Август 03, 2007, 08:56:41 »

зависит от кривости компилятора - согласно стандарта должно получиться 14. префиксные операторы имеют более высокий приоритет, чем  бинарные.
Записан

Только две вещи бесконечны: вселенная и тупость, и я еще не уверен по поводу вселенной. (Альберт Эйнштейн)
----------------------------------------------------
"There are two major products that came out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence." (с) Jeremy S. Anderson

Проходит ирландец мимо паба....
LazarusLong
Ирландский доброволец
Проректор
*****

Карма: +181/-7
Offline Offline

Пол: Мужской
Награды:
А может я тоже хочу себе награду?
Сообщений: 6134


Ukrainian by birth, Irish by the grace of God


WWW
« Ответ #2 : Август 03, 2007, 09:14:09 »

Конечно должно быть 14. Сперва дважды выполняются операторы ++, то есть после их выполнения а становится равным 7. Ну а затем а + а = 14.
Записан

Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.

"...Он любил говорить факин щит
Когда что-то не так ему
Принимал он свой самый ирландский вид
И кидался трубкой в жену..."
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #3 : Август 03, 2007, 03:06:32 »

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

Действительно, точки следования - это такие моменты времени, где состояние исполняемой программы соответствует состоянию абстрактной машины, описываемой Стандартом С++.

Читаем что Стандарт говорит о точках следования:
Цитата: Standard for Programming Language C++, Chapter 1
At certain specified points in the execution sequence called sequence points, all side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place.

Стандарт требует чтобы в каждой точке следования все побочные эффекты кода, который уже выполнен, уже произошли, а побочные эффекты для кода, который еще не был выполнен, еще не произошли.

Когда имеют место точки следования:
Цитата: Standard for Programming Language C++, Chapter 1
15 There is a sequence point at the completion of evaluation of each full-expression.
16 When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all
function arguments (if any) which takes place before execution of any expressions or statements in the function body. There is also a sequence point after the copying of a returned value and before the execution of any expressions outside
the function13). Several contexts in C++ cause evaluation of a function call, even though no corresponding function call
syntax appears in the translation unit. [ Example: evaluation of a new expression invokes one or more allocation and
constructor functions; see 5.3.4. For another example, invocation of a conversion function (12.3.2) can arise in contexts
in which no function call syntax appears. -end example ] The sequence points at function-entry and function-exit
(as described above) are features of the function calls as evaluated, whatever the syntax of the expression that calls the
function might be.
17 In the evaluation of each of the expressions
a && b
a || b
a ? b : c
a , b
using the built-in meaning of the operators in these expressions (5.14, 5.15, 5.16, 5.18), there is a sequence point after
the evaluation of the first expression14).

В промежутках между точками следования конкретный компилятор, соответствующий Стандарту, имеет полное право осуществлять любые оптимизации, перегруппировать каким угодно образом любые выражения или изменить порядок их вычисления, если это не меняет исходной семантики кода. При выполнении кода могут быть побочные действия, влияние которых закончится только по достижению очередной точки следования.

Вот что говорит Стандарт о вычислениях между точками следования:
Цитата: Standard for Programming Language C++, Chapter 5
Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions,
and the order in which side effects take place, is unspecified. Between the previous and next sequence point a
scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior
value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for
each allowable ordering of the subexpressions of a full expression; otherwise the behavior is undefined.

[ Example:
i = v[i ++]; / / the behavior is undefined
i = 7 , i++ , i ++; / / i becomes 9
i = ++ i + 1; / / the behavior is undefined
i = i + 1; / / the value of i is incremented
-end example ]

Т.е. любое выражение, изменяющее скалярный объект несколько раз или считывающее его значение после изменения в промежутке времени от одной точки следования к другой при вычислениях приводит к неопределенному поведению ака undefined behavior.

Таким образом, вот здесь
Код: (cpp)
b = ++a + ++а;
мы имеем дело как раз с этим самым undefined behavior. Т.е. согласно С++ поведение неопределено, а значит в результате выполнения b может быть равным как 14 так и 13 так и стать равным абсолютно произвольному значению. И дело совсем не в кривости компилятора, а в криворукости прораммера, генерирующего подобный код.
« Последнее редактирование: Октябрь 07, 2007, 01:00:36 от Романыч » Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
Storm
Верховный
Администратор
Аспирант
*****

Карма: +29/-0
Offline Offline

Пол: Мужской
Сообщений: 484



« Ответ #4 : Август 03, 2007, 10:16:06 »

....., а в криворукости прораммера, генерирующего подобный код.
самое правильное замечание!!!!
За такой код руки надо отрывать вместе с ногами и другими выступающими частями тела, чтобы нечем было клаву тискать.
Записан

Только две вещи бесконечны: вселенная и тупость, и я еще не уверен по поводу вселенной. (Альберт Эйнштейн)
----------------------------------------------------
"There are two major products that came out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence." (с) Jeremy S. Anderson

Проходит ирландец мимо паба....
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.134 секунд. Запросов: 29.