5

我已经使用 SO 一段时间作为参考,但之前从未问过问题。我目前正在上大学的 C++ 课程,并且还在阅读Bjarne Stroutstrup 的《编程:原则与实践》 ,只是为了我自己的利益,因为我在这里看到了一个真正推荐它的问题的答案。

我们目前正在课堂上讨论运算符,我似乎无法理解逗号运算符在语句中的工作方式。一个例子是课程在线部分的一个示例问题,即使我编写了一个 C 程序并使用 GDB 来获得结果,我也会一直出错。问题是:

假设在下面的表达式之前x==16,那么下面的表达式的值是多少(不一定是x的值)?

x++, ++x, x+=x

我对正确答案不感兴趣,而是对如何获得正确答案感兴趣。我已经阅读了类似问题的几个答案,例如这里的这个,但似乎我错过了当实际上没有赋值运算符时这是如何应用的。这和说的一样吗

int y = (x++, ++x, x+=x);

或者

int y = x++, ++x, x+=x;

或者都不是?有人可以解释一下逗号运算符是如何工作的,特别是与没有赋值的语句有关吗?

4

2 回答 2

8

逗号操作符很简单——很简单很难。它在所有算子中优先级最低;它的优先级甚至低于赋值运算符。请注意,函数的参数不由逗号运算符分隔。

逗号运算符计算其左侧操作数,生成一个序列点并丢弃结果,然后计算右侧操作数。

在上下文中:

x++, ++x, x += x;

相当于:

x++;
++x;
x += x;

除了总价值是 的结果x += x;

假设 x 从 16 开始,它会递增到 17,然后是 18,然后加倍到 36。因此,总值是 36。

请注意,由于序列点,它不会违反关于在序列点之间不多次增加同一变量的规则。

使用逗号运算符的唯一原因实际上是在某些上下文中您不能使用单独的语句,但可以使用逗号运算符。例如:

for (i = 0, j = n; i < j; ++i, --j)

您不能使用分号代替这些逗号。


在问题中,有两个样本:

int y = (x++, ++x, x+=x);

int y = x++, ++x, x+=x;

第一个是合法的(尽管不必要地扭曲),并初始化y为 36(并设置x为 36)。

第二个是不合法的,不会编译;逗号不是逗号运算符,应该分隔不同的声明符,但++xandx += x不是声明符。但是,如果更改为:

y = x++, ++x, x+=x;

那么这将是合法的。第一项是:

y = x++

它将 16 分配给 17y并递增x到 17。第二项递增x到 18;第三任期变为x36。

于 2015-02-09T08:07:58.530 回答
4

逗号运算符计算第一个操作数,将其丢弃,然后计算第二个操作数,计算之间有一个序列点。

在您的情况下,这意味着您已经评估了这个表达式序列

x++   // evaluates to 16, increments x to 17
++x   // increments x to 18, evaluates to 18
x+=x  // increments x by x, i.e. by 18, evaluates to 36.

完整的表达式计算为第三个子表达式。第一个表达式的计算结果为 16,但增量x为 17。第二个表达式的计算结果x为 18 并计算为该数字。第三个x以 18 的值递增,计算结果为x,即计算结果为 36。

于 2015-02-09T08:08:03.233 回答