【发布时间】:2020-03-09 11:29:30
【问题描述】:
让我们考虑以下代码:
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)。这是确切的渲染: error with gcc
Clang x86-64 9.0.0 有一个完全不同的消息: error with clang
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
使用 GCC,您会觉得问题出在后缀运算符上,然后您可以徘徊为什么++i 可以,而i 不行,这就是我的问题。使用 Clang 可以更清楚地看出问题出在前缀运算符上。
【问题讨论】:
-
这最初是用 C 标记的,它肯定不是有效的 C。
-
真的很抱歉!我认为 C 中的行为是相同的...
标签: c++ operators lvalue post-increment pre-increment