++i、i=i+1和i++=1在C/C++中是否等效?
我真正关心的是++i;,的表达式;,i=i+1;i+=1;如果我之前被定义的话,它们是100%等价的 ++i、 -在语句中,i立即递增1,而不是i++;其中,在表达式之后执行递增1。 i=i+1;-我在语句中立即递增1。 i+=1;-我在语句中立即递增1。 这些表达之间有什么区别吗?或者它们是100%等价的 *任何语言都可能涉及语法和语义,但也可能涉及性能和内存管理。在C中,++i相当于i++=1 : 表达式++E等价于E+=1 表达式i+=1相当于i=i+1,但在第一种情况下,i保证只计算一次。在函数调用中,i+=1将导致一次计算 : 形式为E1 op=E2的复合赋值等于 简单赋值表达式E1=E1 op E2,除了左值 E1仅评估一次,并且与 不确定顺序的函数调用,复合函数的操作 作业是一个单一的评估。如果E1具有原子类型,则为化合物 分配是一种具有内存顺序的读-修改-写操作 内存顺序语义 考虑到在这个表达式中只对i求值一次,您可能期望++i的性能稍微好一点,但这实际上取决于实现细节和编译器的优化程度。性能和内存管理问题超出了标签的权限。C 在C中,如果i是原子类型,则i=i+1和i+=1是不等价的,因为根据C 2018 6.5.16.2 3,复合赋值是具有内存顺序顺序cst语义的读-修改-写操作。我也不能说C标准完全清楚关于易失性对象的I=I+1和I+=1的语义。否则,++i、i=i+1和i++=1是等价的,因为i只是一个标识符,而不是任何更复杂表达式的占位符 C++ 在C++中,操作不等价。证明: 该计划:++i、i=i+1和i++=1在C/C++中是否等效?,c++,c,memory,variable-assignment,increment,language-lawyer,C++,C,Memory,Variable Assignment,Increment,Language Lawyer,我真正关心的是++i;,的表达式;,i=i+1;i+=1;如果我之前被定义的话,它们是100%等价的 ++i、 -在语句中,i立即递增1,而不是i++;其中,在表达式之后执行递增1。 i=i+1;-我在语句中立即递增1。 i+=1;-我在语句中立即递增1。 这些表达之间有什么区别吗?或者它们是100%等价的 *任何语言都可能涉及语法和语义,但也可能涉及性能和内存管理。在C中,++i相当于i++=1 : 表达式++E等价于E+=1 表达式i+=1相当于i=i+1,但在第一种情况下,i保证只计算一次
#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;
}
生成此输出:
Preincrement.
Addition.
Assignment.
AdditionAssignment.
因此,对于不同的操作,可以获得不同的结果
基本类型,操作可能相当大,但我不具备对原子或易失性的C++语义的资格。
它们对于非基本类型来说不是等价的。次要的修正:I++i也立即增加1,但是,表达式返回一个临时值,具有前C或C++的值?答案是不同的。@ ExnsiLo,这个评论应该回答两个问题。你的问题是针对C++的int类型吗?看看这里,整数类型的递增和递减运算符的规范实现是赋值和加法/减法的使用,因此我们假设x=++i等于i=i+1;x=i。i的使用进一步意味着一个整数类型,但我想用不同的行为重写这些运算符也有一些用途。不过,我希望在整数上不会遇到这种自定义行为。