gpt4 book ai didi

c++ - 为什么 "++i++"无效而 (++i)++ 有效?

转载 作者:行者123 更新时间:2023-12-03 02:40:02 26 4
gpt4 key购买 nike

让我们考虑以下代码:

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)左值,而 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 可以更清楚地看出问题出在前缀运算符上。

最佳答案

i++i 都是左值,但 i++ 是右值。

++(i++) 无效,因为前缀 ++ 应用于 i++,它是一个右值。但是 (++i)++ 没问题,因为 ++i 是左值。

注意,在C中,情况有所不同; i++++i 都是右值。 (这是为什么人们应该停止假设 C 和 C++ 具有相同规则的一个例子。人们将这些假设插入到他们的问题中,然后这些假设必须被反驳。)

关于c++ - 为什么 "++i++"无效而 (++i)++ 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58840973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com