int m = 5, d = 12, y = 1975, val;
// May 12, 1975
有人可以在下面的代码行中解释逗号运算符的功能/用途:
val = (d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7;
上面的行是由Mike Keith写的,用于计算给定日期的星期几(d = day,m = month,y = year(。其中星期日 = 0,星期一 = 1,星期二 = 2,星期三 = 3,星期四 = 4,星期五 = 5,星期六 = 6。我知道如果 d+=m<3 为真,则执行 y-- ,否则执行 y-2。我不明白的是y-2之后逗号的目的。
语句
val = (d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7;
相当于
val = ( (d+=(m<3?y--:(y-2))), (23*m/9+d+4+y/4-y/100+y/400) ) % 7;
,
此处是逗号运算符(计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(。
逗号运算符的左操作数,即评估(d+=m<3?y--:y-2)
并发生y
副作用。此表达式的值将被丢弃。将计算右操作数(23*m/9+d+4+y/4-y/100+y/400)
,其值是表达式(d+=m<3?y--:y-2), (23*m/9+d+4+y/4-y/100+y/400)
的值。
号运算符将要执行的表达式一个接一个地分隔开来,就像;
一样。但是有了,
它们构成了一个完整的表达式,其计算结果为最后一个子表达式的值。例如
int i = 1;
int j = (++i, i*2);
printf("%i", j)
打印出 4.
例如,它可以用于for
表达式中,其中标题中需要 3 个表达式。例如
for(i = 0, j = 0; i < n; i++, j++)
该行等效于
if ( m < 3 )
{
d = d + y;
y--;
}
else
{
d = d + y - 2;
}
val = (23 * m/9) + d + 4 + y/4 - y/100 + y/400;
val = val % 7;
因为三元运算符的优先级高于赋值+=
,逗号运算符,
。所以第一个动作是m
与3
进行比较。如果m < 3
则调整y
和d
,否则仅调整d
。然后使用更新的y
和d
值来计算一些大的魔法值。最后,取模运算符将该值减少到 0 到 6 之间的数字,这应该是星期几。
引用奥利弗·查尔斯沃思(Oliver Charlesworth(的话,"这段代码是无法维护的胡说八道。
逗号运算符按顺序分隔计算的表达式,然后结果是最后一个表达式的值。 在这种情况下,程序员希望在输入主表达式之前调整 y 和 d 的值。 我同意其他质疑代码清晰度的人。
请参阅维基百科文章 http://en.wikipedia.org/wiki/Comma_operator。