逗号在C/C++中的工作方式有些混乱

Some confusion with how commas work in C/C++

本文关键字:方式 工作 混乱 C++      更新时间:2023-10-16

我已经用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;

或者两者都没有?有人能解释一下逗号运算符是如何工作的吗?特别是对于没有赋值的语句?

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

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

上下文:

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

相当于:

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

除了总值是CCD_ 1的结果之外。

假设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)。

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

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

那么它将是合法的。第一个术语是:

y = x++

其将16分配给CCD_ 6并且将CCD_。第二项将CCD_ 8递增到18;第三项将CCD_ 9改变为36。

逗号运算符对第一个操作数求值,丢弃它,然后将求值为第二个操作数,求值之间有一个序列点。

在你的情况下,这意味着你有这个表达式序列评估

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 += x;0递增到17。第二个将x递增到18,并计算为该数字。第三个将x的值增加18,并计算为x,即计算为36。

相关文章: