C comma in ternary statement

2020-07-17 16:28发布

问题:

int m = 5, d = 12, y = 1975, val;
    // May 12, 1975

Can someone please explain the function/purpose of the comma operator in the line of code below:

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

The above line was written by Mike Keith to calculate the day of the week given the date (d = day, m = month, y = year). Where Sunday = 0, Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6. I understand that the y-- gets executed if d+=m<3 is true, else the y-2 is executed. What I don't understand is the purpose of the comma after y-2.

回答1:

The comma operator separates expressions to be executed one after the other, just like ;. But with , they constitute one whole expression that evaluates to the value of the last sub-expression. For example

int i = 1;
int j = (++i, i*2);
printf("%i", j)

prints out 4.

It can for example be used in for expressions, where 3 expressions need to be in the header. For example

for(i = 0, j = 0; i < n; i++, j++)


回答2:

The statement

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

is equivalent to

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

, is comma operator (evaluates its first operand and discards the result, and then evaluates the second operand and returns this value) here.

Left operand of comma operator, ie., (d+=m<3?y--:y-2) is evaluated and side effect to y take place. Value of this expression is discarded. Right operand (23*m/9+d+4+y/4-y/100+y/400) will be evaluated and its value is the value of expression (d+=m<3?y--:y-2), (23*m/9+d+4+y/4-y/100+y/400).



回答3:

That line is equivalent to

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;

because the ternary operator has higher precedence than the assignment += and the comma operator ,. So the first action is m is compared to 3. If m < 3 then both y and d are tweaked, otherwise only d is tweaked. The updated values of y and d are then used to calculate some large magical value. Finally, the modulo operator reduces that value to a number between 0 and 6, which supposedly is the day of the week.

To quote Oliver Charlesworth, "This code is unmaintainable gross nonsense."



回答4:

The comma operator separates expressions that are evaluated in order and then the result is the value of the last one. In this case, the programmer wants to tweak the value of y and d before entering the main expression. I agree with others who question the clarity of the code.

See the wikipedia article http://en.wikipedia.org/wiki/Comma_operator.