Bkt*_*ero 14 c++ operators lvalue pre-increment post-increment
让我们考虑以下代码:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Run Code Online (Sandbox Code Playgroud)
编译时出现以下错误:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Run Code Online (Sandbox Code Playgroud)
这对我来说听起来很公平。后缀增量的优先级高于前缀增量的优先级,因此代码被解析为int b = ++(i++);,i是右值。因此,错误。
现在让我们考虑带有括号的此变体,以覆盖默认优先级:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Run Code Online (Sandbox Code Playgroud)
该代码将编译并返回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++;
^ ~~~
Run Code Online (Sandbox Code Playgroud)
使用GCC,您会感觉到问题出在postfix运算符上,然后您可以在为什么可以行进++i而i不是在行进行之间徘徊,因此是我的问题。使用Clang可以清楚地知道问题出在前缀运算符上。
Bri*_*ian 21
i和++i都是左i++值,但都是右值。
++(i++)不能有效,因为将前缀++应用于i++,这是一个右值。但是(++i)++很好,因为++i是左值。
请注意,在C中,情况有所不同。i++和++i都是右值。(这是为什么人们应该停止假设C和C ++具有相同规则的示例。人们将这些假设插入他们的问题中,然后必须予以驳斥。)