难以阅读两行代码

时间:2010-08-22 13:23:44

标签: c++ c

如何分析以下两行代码?

w += /* 28 + */ y % 4 == 0 && (y % 100 || y % 400 ==0);

 w += 30 + (i % 2 ^ i >= 8);

4 个答案:

答案 0 :(得分:11)

第一个寻找闰年,如果是,则增加1到w。 (每四年除了可被100整除的除了可以被400整除的那些。)

第二个查找31天的月份。 (每月除每月超过8个月,重复一个月。)

编写此代码的人只是试图让人感到困惑和幻想。你应该重写它以使其更具可读性。

答案 1 :(得分:1)

第一个似乎必须对格里高利历做点什么。

答案 2 :(得分:0)

考虑闰年的某一天的某种计算?

答案 3 :(得分:0)

以下是分析方法

int main(){
    int w = 0;
    int y = 400;

    w += /* 28 + */ y % 4 == 0 && (y % 100 || y % 400 ==0); 

    int t1 = y % 100;
    int t2 = y % 400;

    int t3 = t1 | t2;

    bool t4 = (y % 4);

    int w1 = t3 & t4;
}

请注意,t1和t2可以按任何顺序进行评估 t3将在t1和t2之后进行评估 t4可以在t1或t2之前评估

这需要熟悉

  

运营商关联性

     

运算符优先级

     

序列点

留下另一个也在类似的线上进行分析