++i, i = i + 1 和 i += 1 在 C/C++ 中是否等价?

Rob*_*rtS 0 c c++ memory increment variable-assignment

我真正关心的是++i;,i = i + 1; 和的表达式是否i += 1;彼此等价百分之一百,如果i之前定义。

  1. ++i;-i被立即递增1的语句中,而不是i++;在incremetation通过1表达后完成。
  2. i = i + 1;-在语句中i立即增加1
  3. i += 1;-在语句中i立即增加1

这些表达式之间是否存在*任何类型的差异,或者它们是否 100% 等效?

*“任何”可能指语法和语义,但也指性能和内存管理。

Eri*_*hil 7

C

在C中,i = i+1并且i += 1如果是不等效i是原子类型,因为该化合物分配是用读-修改-写操作memory_order_seq_cst的语义,的每个C 2018 6.5.16.2 3.我还不能说C标准是上的语义完全清楚i = i+1以及i += 1关于 volatile 对象。否则,++i,i = i+1i += 1是等价的,因为它i只是一个标识符,而不是任何更复杂表达式的占位符。

C++

在 C++ 中,这些操作是不等价的。证明:

这个程序:

#include <iostream>


class SensitiveToOperations
{
public:
    SensitiveToOperations operator ++() { std::cout << "Preincrement.\n"; return *this; }
    SensitiveToOperations operator +(int that) const { std::cout << "Addition.\n"; return *this; }
    SensitiveToOperations operator =(SensitiveToOperations that) { std::cout << "Assignment.\n"; return *this; }
    SensitiveToOperations operator +=(int that) { std::cout << "AdditionAssignment.\n"; return *this; }
};


int main(void)
{
    SensitiveToOperations i;
    ++i;
    i = i + 1;
    i += 1;
}
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

预增量。
添加。
任务。
加法赋值。

从而表明不同的操作可能会得到不同的结果。

对于基本类型,操作可能在很大程度上是等效的,但我没有资格谈论 C++ 语义关于原子或易失性。