三元语句中的 C 逗号


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;

因为三元运算符的优先级高于赋值+=,逗号运算符,。所以第一个动作是m3进行比较。如果m < 3则调整yd,否则仅调整d。然后使用更新的yd值来计算一些大的魔法值。最后,取模运算符将该值减少到 0 到 6 之间的数字,这应该是星期几。

引用奥利弗·查尔斯沃思(Oliver Charlesworth(的话,"这段代码是无法维护的胡说八道。

逗号运算符按顺序分隔计算的表达式,然后结果是最后一个表达式的值。 在这种情况下,程序员希望在输入主表达式之前调整 y 和 d 的值。 我同意其他质疑代码清晰度的人。

请参阅维基百科文章 http://en.wikipedia.org/wiki/Comma_operator。

相关内容

  • 没有找到相关文章