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;
above line由Mike Keith编写,用于计算给定日期的星期几(d =天,m =月,y =年)。星期日= 0,星期一= 1,星期二= 2,星期三= 3,星期四= 4,星期五= 5,星期六= 6。 我知道如果d + = m <3为真,则执行y--否则执行y-2。我不明白的是y-2之后逗号的目的。
答案 0 :(得分:6)
声明
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;
,
是comma operator(计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值)。
评估逗号运算符的左操作数,即(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)
的值。
答案 1 :(得分:5)
逗号运算符将表达式一个接一个地分开,就像;
一样。但是对于,
,它们构成一个整数表达式,其计算结果为最后一个子表达式的值。例如
int i = 1;
int j = (++i, i*2);
printf("%i", j)
打印出4。
例如,它可以用在for
表达式中,其中3个表达式需要位于标题中。例如
for(i = 0, j = 0; i < n; i++, j++)
答案 2 :(得分:3)
该行相当于
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之间的数字,这应该是一周中的某一天。
引用奥利弗查尔斯沃思的话说,“这段代码是无法维持的严重废话。”
答案 3 :(得分:1)
逗号运算符分隔按顺序计算的表达式,然后结果是最后一个的值。在这种情况下,程序员想要在输入主表达式之前调整y和d的值。我同意其他质疑代码清晰度的人。