我已经用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)。
第二个是不合法的,不会编译;逗号不是逗号运算符,应该分隔不同的声明符,但++x
和x += 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。