Несколько операций preincrement для переменной в C ++ (C?)
Почему следующая компиляция в C ++?
int phew = 53; ++++++++++phew ;
Тот же код не работает в C, почему?
- Почему компиляторы C ++ не определяют operator == и operator! =?
- В чем разница между оператором dot (.) И -> в C ++?
- Разница между & и && в Java?
- Java: что означает ~
- Что значит !! (двойной восклицательный знак) означает?
- В чем разница между оператором «=» и «==» в Bash?
- Сделать оператор << виртуальным?
- Вопросительный знак и двоеточие в JavaScript
- Какие псевдооператоры существуют в Perl 5?
- Что означает $ mean / do в Haskell?
- Поддержка языков для операторов цепного сравнения (x <y <z)
- Оператор тильды в C
- Оператор «&&» и «и» в C
Это потому, что в C++
оператор pre-increment возвращает lvalue
и требует, чтобы его операнд был lvalue
.
++++++++++phew ;
в интерпретации как ++(++(++(++(++phew))))
Однако ваш код вызывает Undefined Behaviour
потому что вы пытаетесь изменить значение phew
более одного раза между двумя точками последовательности .
В C
оператор pre-increment возвращает rvalue
и требует, чтобы его операнд был lvalue
. Таким образом, ваш код не компилируется в режиме C.
Примечание. Два отчета о дефектах DR # 637 и DR # 222 важны для понимания обоснования поведения ниже.
Для объяснения в C ++ 0x есть value computations
и side effects
. Например, побочным эффектом является привязка, и вычисление значения определяет, что означает lvalue или считывает значение из lvalue. Обратите внимание, что C ++ 0x больше не имеет точек последовательности, и этот материал сформулирован в терминах «sequenced before» / «sequenced after». И сказано, что
Если побочный эффект скалярного объекта не влияет на какой-либо другой побочный эффект на один и тот же скалярный объект или вычисление значения, используя значение одного и того же скалярного объекта, поведение не определено.
++v
эквивалентно v += 1
что эквивалентно v = v + 1
(кроме того, что v оценивается только один раз). Это дает ++ (v = v + 1)
который я напишу как inc = inc + 1
, где inc
ссылается на результат lvalue от v = v + 1
.
В C ++ 0x ++ ++v
не является неопределенным поведением, так как при a = b
присваивание упорядочивается после вычисления значения b и a, но до вычисления значения выражения присваивания. Из этого следует, что присваивание в v = v + 1
секвенировано перед вычислением значения inc
. И назначение в inc = inc + 1
секвенируется после вычисления значения inc
. В итоге оба назначения будут, таким образом, секвенированы, и нет неопределенного поведения.