您的代码:
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.它所有运营商的优先级最低也必须记住,在函数的参数列表中的逗号不逗号运营商。
通过举例说明的逗号操作的行为:
x, y;
是评估表达x
和丢弃的结果,然后计算表达式y
(和总的结果是的y
的值)。逗号运算符有一个序列点;这是一种对你现在无关紧要的改进,但未来可能会有所改进。
在您的表达:
d = (a, b);
表达a
进行评估(它是3)和忽略;那么对表达式b
进行评估(它是5),并将其用作逗号运算符表达式的结果,因此将其用作括号表达式的结果,因此将值5指定为d
。
相反,在表达式:
c = a, b;
逗号运算的LHS是c = a
,所以a
进行评估(它是3)和分配给c
。然后扔掉,并且b
被评估。因此,整体表达式语句仅将c赋予3。
您可能会问:“为什么逗号运算符有用?”
在有些情况下它是有用的地方,如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;
}
如果你喜欢混淆后的C,还有的International Obfuscated C Code Contest。
如果您正在编写宏,有时候逗号运算符可能会成为生命保护程序。
d =(a,b) 它如何在输出中显示d = 5? – 2012-03-24 20:54:11