如何分析以下两行代码?
w += /* 28 + */ y % 4 == 0 && (y % 100 || y % 400 ==0);
和
w += 30 + (i % 2 ^ i >= 8);
答案 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之前评估
这需要熟悉
运营商关联性
运算符优先级
序列点
留下另一个也在类似的线上进行分析