Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
++i、i=i+1和i++=1在C/C++中是否等效?_C++_C_Memory_Variable Assignment_Increment_Language Lawyer - Fatal编程技术网

++i、i=i+1和i++=1在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保证只计算一次

我真正关心的是++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++中,操作不等价。证明:

该计划:

#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的使用进一步意味着一个整数类型,但我想用不同的行为重写这些运算符也有一些用途。不过,我希望在整数上不会遇到这种自定义行为。