运算符优先级在长语句中令人困惑

Operator precedence is confusing on long statement

我使用一个简单的 C 程序来查找给定日期的日期。为此,我写了很多行来计算日期和月份并找到给定年份的种类。在冲浪时,我开始了解单行代码来查找给定日期的日期。代码如下

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

它给出了所有输入的正确答案,但我无法理解这个表达式中使用的值。

  1. 为什么检查日月之和小于3
  2. 为什么年减一,条件不成立,年减二。
  3. 为什么这个表达式中使用了数字 3、23 和 9。

我对这个语句的运算符优先级感到困惑。谁能解释一下这是如何工作的?

到目前为止我发现了什么: 23 * m / 9 结果

 1  2 3
 2  5 2
 3  7 3
 4 10 2
 5 12 3
 6 15 2
 7 17 3
 8 20 3
 9 23 2
10 25 3
11 28 2
12 30 3

此表达式将 超过 一个月的 28 天。

表达式 y / 4 - y / 100 + y / 400 结果为:

1995 483 0
1996 484 1
1997 484 1
1998 484 1
1999 484 1
2000 485 2
2001 485 2

加上结果,每4年加一天(闰年除外)

因为每年有 365 天 (mod 7 == 1) 工作日增加 1,所以年份会加到天数上。

表达式d + (m < 3 ? y --: y- 2)用于更正闰年计算。如果我们有闰年,只有一个月 >= 三月,我们才能更正一天。