C++中的逗号运算符

5
int main() {
   int x = 6;
   x = x+2, ++x, x-4, ++x, x+5;
   std::cout << x;
}

// Output: 10

int main() {
   int x = 6;
   x = (x+2, ++x, x-4, ++x, x+5);
   std::cout << x;
}

// Output: 13

请解释。

5
请告诉我,为什么你让代码变得难以阅读和理解?我不希望(实际上我希望)在几年后你必须维护它!C++以及其他编程语言给了你足够的绳索来绞死自己。 - Ed Heal
2
@Ed:鉴于它什么也不做,显然这是关于操作符行为的问题,而不是实际服务于进一步目的的代码问题。 - Lightness Races in Orbit
1
@Ed:有些人(包括我自己)更喜欢知道这些东西为什么会起作用,而不管代码的可读性如何。仅仅因为有人问了这个问题,并不意味着他打算在真实世界的代码中使用它。 - Ken Wayne VanderLinde
1
@Ed Heal - 由于问题提出者询问逗号运算符的含义,我认为很明显他们不是代码的作者。当然可以评论说,像示例中使用逗号这样的方式难以阅读和理解,而不必人身攻击问题提出者。 - borrible
2
这个问题只有七个赞,因为我让它变得如此漂亮。 - Lightness Races in Orbit
1个回答

15
由于逗号操作符的优先级低于等号操作符,实际上逗号操作符是所有操作符中优先级最低的。 第一个案例:
x=x+2,++x,x-4,++x,x+5;

这相当于

(x=x+2),(++x),(x-4),(++x),(x+5);

因此,x变为6+2 = 8,然后增加并变为9。下一个表达式是一个无操作,即计算并丢弃x-4的值,然后再次增加,现在x为10,最后又是一个无操作。x为10第二个案例:
x=(x+2,++x,x-4,++x,x+5);

这相当于

x=((x+2),(++x),(x-4),(++x),(x+5));

"x+2"被计算,然后x被递增并变为7,接着x-4被计算,然后x再次递增并变为8,最后计算x+5,结果为13。这个操作数是最右边的,被视为整个逗号表达式的结果。这个值被赋给x
x的值为13。希望已经清楚了。正如评论中所建议的一样 -

永远不要编写这样的代码

。"

3
不行,因为逗号操作符引入了一个序列点。虽然如此,我仍然永远不会编写这样的代码。 - Mark B
1
“lower precedence”的意思是优先级较低。这对于挪威程序员来说非常令人恼火,因为他们可能会写例如x = 3,14;的代码。嘿嘿。 - Cheers and hth. - Alf
@MarkB:好的。 :) 我从来不确定。 - Lightness Races in Orbit
1
@omnifarious:虽然你所写的字面上是正确的,但它与传达我所写的内容以外的任何事情都毫无关系,只会给人一种错误、负面的印象。所以我直截了当地问你:你到底是什么意思? - Cheers and hth. - Alf
1
@gautam:考虑一下这个问题: int x = 5; x+2; x+2 是一个空操作,它并不会执行任何操作。另一方面,x+=2 不是一个空操作,因为它会改变 x 的值。 - Armen Tsirunyan
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接