我有两个表达:
int a=5;
int c=++a;// c=6, a=6
int b=a++;// b=6, a=7在第二指令中,首先计算增量,在第三指令中,在赋值后计算增量。
我知道增量操作符具有更高的优先级。有人能向我解释一下为什么在第三个表达式中赋值后才对其进行评估吗?
发布于 2020-04-19 00:48:49
结果与操作顺序无关,而与前缀++和后缀++的定义有关。
表达式++a的计算值为a的增量值。相反,表达式a++的计算结果是a的当前值,而a作为副作用增加。
C标准的6.5.2.4p2部分说明了关于后缀++的如下内容
后缀
++操作符的结果是操作数的值。副作用是,操作数对象的值增加(也就是说,适当类型的值1被添加到它中)。
第6.5.3.1p2节是关于前缀++的如下内容
前缀
++运算符的操作数的值递增。结果是递增后操作数的新值。表达式++E等价于(E+=1)
发布于 2020-04-19 00:50:54
++a和a++只是不同的运算符,尽管有相同的符号++。一个是前缀增量,一个是后缀增量。与任务相比,这与优先级无关。(就像a - b和-a是不同的运算符,尽管有相同的符号-。)
编辑:有人指出这是关于C而不是C++.糟了。因此,如果您只知道C,下面的解释可能会很混乱;您需要知道的是,int&是对int的引用,因此它就像有一个指针,但不需要取消引用,因此在这些函数中修改a实际上会修改传递给函数的变量。
你可以想象它们就像函数:
int prefixIncrement(int& a) {
return ++a;
}...is与以下内容相同:
int prefixIncrement(int& a) {
a += 1;
return a;
}和:
int postfixIncrement(int& a) {
return a++;
}...is与以下内容相同:
int postfixIncrement(int& a) {
int old = a;
a += 1;
return old;
}对于吹毛求疵者:是的,实际上我们需要对postfixIncrement__的返回值进行移动语义。
https://stackoverflow.com/questions/61298159
复制相似问题