让我们考虑以下代码:
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
是一个rvalue。因此出现了错误。
现在让我们考虑使用括号来覆盖默认优先级的这个变体:
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编译器,你会发现问题出在后缀运算符上,然后你可以想知道为什么++i
是可以的而i
不行,因此有了我的这个问题。而使用Clang编译器,更清楚地表明问题出在前缀运算符上。