三元语句中的 C 逗号

C comma in ternary statement

int m = 5, d = 12, y = 1975, val;
    // May 12, 1975

谁能解释一下下面代码行中逗号运算符的 function/purpose:

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之后逗号的用途。

声明

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计算它的第一个操作数并丢弃结果,然后计算第二个操作数和returns这个值 ) 这里。

逗号运算符的左操作数,即 (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) 的值。

逗号运算符将要执行的表达式分开,就像;一样。但是对于 ,,它们构成了一个完整的表达式,计算结果为最后一个 sub-expression 的值。例如

int i = 1;
int j = (++i, i*2);
printf("%i", j)

打印出 4。

它可以例如用在for表达式中,其中3个表达式需要在header中。例如

for(i = 0, j = 0; i < n; i++, j++)

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

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

那一行相当于

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,"This code is unmaintainable gross nonsense."