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

Jos*_*gan 5 c c++ comma operator-precedence operator-keyword

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

我们现在正在课堂上覆盖操作员,而我似乎无法理解逗号操作符在语句中的工作方式.一个例子是类的在线部分的示例问题,即使我编写C程序并使用GDB获取结果,我仍然会出错.问题是:

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

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

我对正确答案不感兴趣,以至于如何得到正确的答案.我已经阅读了类似问题的几个答案,例如这里的问题,但似乎我错过了当实际上没有分配运算符时这是如何适用的.这跟说的一样吗

int y = (x++, ++x, x+=x);
Run Code Online (Sandbox Code Playgroud)

要么

int y = x++, ++x, x+=x;
Run Code Online (Sandbox Code Playgroud)

还是两个?有人可以解释逗号运算符的工作原理,特别是与没有赋值的语句有关吗?

Jon*_*ler 8

逗号操作符很简单 - 很容易很难.它具有所有运营商的最低优先级; 它的优先级甚至低于赋值运算符.请注意,函数的参数不由逗号运算符分隔.

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

在上下文中:

x++, ++x, x += x;
Run Code Online (Sandbox Code Playgroud)

相当于:

x++;
++x;
x += x;
Run Code Online (Sandbox Code Playgroud)

除了整体价值是结果x += x;.

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

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

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

for (i = 0, j = n; i < j; ++i, --j)
Run Code Online (Sandbox Code Playgroud)

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


在这个问题中,有两个样本:

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

int y = x++, ++x, x+=x;
Run Code Online (Sandbox Code Playgroud)

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

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

y = x++, ++x, x+=x;
Run Code Online (Sandbox Code Playgroud)

那么这是合法的.第一个任期是:

y = x++
Run Code Online (Sandbox Code Playgroud)

分配16到17 y,增量x为17.第二个x增加到18; 第三个词x改为36.