三元语句中的C逗号

时间:2015-02-14 21:16:59

标签: c operator-keyword ternary-operator comma

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

4 个答案:

答案 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;

因为三元运算符的优先级高于赋值+=和逗号运算符,。因此,第一个操作m3进行比较。如果m < 3调整了yd,则只调整d。然后使用yd的更新值来计算一些巨大的魔法值。最后,模运算符将该值减少到0到6之间的数字,这应该是一周中的某一天。

引用奥利弗查尔斯沃思的话说,“这段代码是无法维持的严重废话。”

答案 3 :(得分:1)

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

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