Это глупый вопрос. :)
[РЕДАКТИРОВАТЬ: глупо или нет, вопрос об особенностях C ++, см. UPDATE_2]
Предположим, у нас есть:
int a = 0; // line 1
int b = ++a; // line 2
В строке 2 происходит следующее ( обратите внимание, числа являются просто маркерами и не указывают точный порядок ):
= [1: write result of (3) to result of (2)]
/\
[2: take "b" l-value] [3: convert result of (4) to an r-value ]
|
[4: take "a" l-value, "increment" and return it]
«Запись» в (4) «упорядочивается» перед «чтением» в (3), и поскольку между ними нет последовательностей, побочный эффект не гарантируется до (3) (есть также "read" внутри (4), но упорядоченный перед"write", так что не дает UB).
Так где же ошибка в вышеприведенном?
[ОБНОВЛЕНИЕ, предназначенное для неопытных юристов, занимающихся секвенированием:)]
Другими словами, проблема в следующем:
Похоже, существует "конкуренция", независимо от того, имеет ли место побочный эффект преобразования l-значения в r-значение ("чтение") или приращения ("запись").
В C это даст UB , в соответствии с JTC1 / SC22 / WG14 N926 "Анализ точки последовательности" * (см., Например, ПРИМЕР 5: int x,y; (x=y) + x; // UB
).
Обратите внимание, что это не будет иметь место, если постинкремент будет использоваться, так как (3) и (4) будут составлять единственное [(3): возьмите l-значение l, преобразуйте его к r-значению и возвращают это r-значение] с побочным эффектом «записи», отложенным до тех пор, пока где-то до следующей точки последовательности
_
(*) Это выглядит как самое чистое систематическое обоснование темы, заданной членами Комитета по стандартам C99.
[UPDATE_2]
Извлеченный урок: никогда не судите C ++ по правилам C :)). Я сделал именно это, задаваясь вопросом, почему N926 (который четко описывает образ вещей C99) был «недостаточно ясен» по теме предварительных инкрементов, дающих l-значения.
Возникает вопрос: как построить аналогичное обоснование для C ++, если его нет, поскольку даже в случае C просто интерпретировать стандарт довольно сложно, а стандарт языка C ++ гораздо сложнее? и неясный.
[UPDATE_3]
Существует обсуждение, касающееся некоторых соответствующих тем (по крайней мере, в ~ более новой половине) на "Неопределенность общего выражения". , плюс вопрос обсуждается членами комитета здесь (см. «222. Точки последовательности и операторы, возвращающие значение»).