Несколько операций preincrement для переменной в C ++ (C?)

Почему следующая компиляция в C ++?

int phew = 53; ++++++++++phew ; 

Тот же код не работает в 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 . В итоге оба назначения будут, таким образом, секвенированы, и нет неопределенного поведения.

  • Возможно ли создать новый оператор в c #?
  • Перегрузка оператора в C ++ как int + obj
  • Что означает «| =»? (оператор равных труб)
  • в чем разница между оператором == и equals ()? (с hashcode () ???)
  • Что означает оператор?? =?
  • Оператор Pipe (|) в Java
  • Есть ли разница в производительности между ++ i и i ++ в C #?
  • Оператор копирования и оператор присваивания
  • Операция XOR с двумя строками в java
  • В чем разница между «или» и «|» при программировании в xslt?
  • Java: Что делает оператор двоеточия (:)?
  • Давайте будем гением компьютера.