三元语句中的C逗号

010*_*001 4 c ternary-operator comma operator-keyword

int m = 5, d = 12, y = 1975, val;
    // May 12, 1975
Run Code Online (Sandbox Code Playgroud)

有人可以在下面的代码行中解释逗号运算符的功能/目的:

val = (d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7;
Run Code Online (Sandbox Code Playgroud)

上述行写由麦克·基思来计算给定日期(d =天,M =月,Y =年)一周中的一天.其中星期日= 0,星期一= 1,星期二= 2,星期三= 3,星期四= 4,星期五= 5,星期六= 6.我知道如果d + = m <3,则y--执行,否则y -2执行.我不明白的是y-2之后逗号的目的.

hac*_*cks 6

该声明

val = (d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7;  
Run Code Online (Sandbox Code Playgroud)

相当于

val = ( (d+=(m<3?y--:(y-2))), (23*m/9+d+4+y/4-y/100+y/400) ) % 7; 
Run Code Online (Sandbox Code Playgroud)

,逗号运算符(计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值).

(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).


tml*_*len 5

逗号运算符将表达式分开,一个接一个地执行,就像;.但是,它们构成了一个整体表达式,它评估了最后一个子表达式的值.例如

int i = 1;
int j = (++i, i*2);
printf("%i", j)
Run Code Online (Sandbox Code Playgroud)

打印4.

例如,它可以用在for表达式中,其中3个表达式需要在标题中.例如

for(i = 0, j = 0; i < n; i++, j++)
Run Code Online (Sandbox Code Playgroud)