C 三元语句中的逗号

C 三元语句中的逗号,c,operator-keyword,ternary-operator,comma,C,Operator Keyword,Ternary Operator,Comma,请有人在下面的代码行中解释逗号运算符的功能/用途: int m = 5, d = 12, y = 1975, val; // May 12, 1975 val=(d+=m语句 val = (d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7; val=(d+=m逗号运算符将要执行的表达式一个接一个地分开,就像;一样。但是对于,它们构成了一个完整的表达式,计算结果为最后一个子表达式的值。例如 val = ( (d+=(m<3?y--:(

请有人在下面的代码行中解释逗号运算符的功能/用途:

int m = 5, d = 12, y = 1975, val;
    // May 12, 1975
val=(d+=m语句

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

val=(d+=m逗号运算符将要执行的表达式一个接一个地分开,就像
一样。但是对于
它们构成了一个完整的表达式,计算结果为最后一个子表达式的值。例如

val = ( (d+=(m<3?y--:(y-2))), (23*m/9+d+4+y/4-y/100+y/400) ) % 7; 
int i = 1;
int j = (++i, i*2);
printf("%i", j)
打印出4

例如,它可以在
for
表达式中使用,其中头中需要有3个表达式

val = ( (d+=(m<3?y--:(y-2))), (23*m/9+d+4+y/4-y/100+y/400) ) % 7; 
int i = 1;
int j = (++i, i*2);
printf("%i", j)
for(i=0,j=0;i
逗号运算符将按顺序计算的表达式分隔开,然后结果是最后一个表达式的值。在这种情况下,程序员希望在输入主表达式之前调整y和d的值。我同意其他人对代码的清晰度提出的质疑


请参阅维基百科的文章。

这一行相当于

for(i = 0, j = 0; i < n; i++, j++)
if(m<3)
{
d=d+y;
y--;
}
其他的
{
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)的话,“这段代码是无法维护的粗俗废话。”

这段代码是无法维护的粗俗废话。不要用它作为如何编写合理代码的示例。请解释实际发生的情况,因为我从未见过它。我对CSomeone非常陌生。请告诉我这不在生产代码中……非常好的解释!我可以恭敬地建议保留
I
j
在最后一个循环中的相同值没有(i=0,j=n;i那么有说服力。
?实际上,第一个操作数将“d”设置为“y”或“y-2”,这取决于使用的月份(即设置“d”后的一月或二月,然后递减“y”)“d”的计算值这看起来像是一种可以在竞赛中使用的编码,以最大化程序的功能,同时最小化程序中的字符数。我可以看到y/4、y/100和y/400在哪里计算闰年天数。