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之后逗号的目的.
该声明
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)
.
逗号运算符将表达式分开,一个接一个地执行,就像;
.但是,
它们构成了一个整体表达式,它评估了最后一个子表达式的值.例如
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)