让我们考虑以下代码:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
编译时出现以下错误:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
这对我来说听起来很公平。后缀递增的优先级高于前缀递增的优先级,因此代码被解析为int b = ++(i++);
,i
是一个右值。因此,错误。
现在,让我们考虑带有括号的此变体,以覆盖默认优先级:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
该代码将编译并返回3。对我来说,这听起来很公平,但似乎与第一个代码矛盾。
问题:为什么(++i)
是lvalue
当i
不成?
谢谢!
更新:上面显示的错误消息来自gcc(x86-64 9.2)。这是确切的渲染: gcc错误
Clang x86-64 9.0.0有一个完全不同的消息: clang错误
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
使用GCC,您会感觉到问题出在postfix运算符上,然后您可以在为什么可以确定的++i
同时i
又可以在为什么不可以的情况中徘徊,因此是我的问题。使用Clang可以清楚地知道问题出在前缀运算符上。