三元语句中的 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;
因为三元运算符的优先级高于赋值运算符+=
和逗号运算符,
。所以第一个动作是 m
与 3
进行比较。如果 m < 3
那么 y
和 d
都会被调整,否则只有 d
被调整。 y
和 d
的更新值然后用于计算一些大的魔法值。最后,模运算符将该值减小为 0 到 6 之间的数字,这应该是星期几。
引用 Oliver Charlesworth,"This code is unmaintainable gross nonsense."
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;
因为三元运算符的优先级高于赋值运算符+=
和逗号运算符,
。所以第一个动作是 m
与 3
进行比较。如果 m < 3
那么 y
和 d
都会被调整,否则只有 d
被调整。 y
和 d
的更新值然后用于计算一些大的魔法值。最后,模运算符将该值减小为 0 到 6 之间的数字,这应该是星期几。
引用 Oliver Charlesworth,"This code is unmaintainable gross nonsense."