您的代码:
a=3;
b=5;
c=a,b;
d=(a,b);
被视为已写入:
a=3;
b=5;
(c=a),b;
d=(a,b);
这就是c == 3 和d == 5 的原因。
一个好的编译器可能会警告您包含对c 的赋值的行; b 的评估对计算状态没有任何影响。对于d 的表达式中a 的评估也是如此。
d=(a,b) 怎么样?它如何在输出中显示d=5?
逗号运算符是 C 中所有运算符中优先级最低的。同样重要的是要记住,函数参数列表中的逗号是 not 逗号运算符。
逗号操作符的行为举例:
x, y;
是对表达式x求值并丢弃结果,然后对表达式y求值(整体结果为y的值)。逗号操作符处有一个序列点;这种改进现在对您来说并不重要,但将来可能会发生。
在你的表达中:
d = (a, b);
表达式a 被求值(它是3)并被忽略;然后表达式b 被求值(它是5),它被用作逗号运算符表达式的结果,因此也是括号表达式的结果,因此值5 被分配给d。
相比之下,在你的表达中:
c = a, b;
逗号运算符的 LHS 是 c = a,所以 a 被评估(它是 3)并分配给 c。然后将其丢弃,并评估 b。因此,整个表达式语句只是将 3 分配给 c。
您可能会问,“为什么逗号操作符有用?”
在某些地方它很有用,例如 for 循环的初始化和增量部分:
for (i = 0, s = p; *s != '\0'; i++, s++)
{
...
}
那里有两个逗号运算符。第一个包含一对作业;第二个包含一对带有副作用的表达式。
另一个有时使用它的地方(虽然我认为它很少是好的风格)是:
if (some_variable == A_VALUE)
p = q++, r = z;
这“节省”了在条件主体周围添加大括号。但是,隐藏这样的分配并不是一种好的风格。代码应该是(给或取大括号的位置,这是有争议的):
if (some_variable == A_VALUE)
{
p = q++;
r = z;
}
如果你喜欢 Obfuscated C,那就是International Obfuscated C Code Contest。
如果您正在编写宏,有时逗号运算符可以成为救命稻草。