c-在闰年问题中使用逻辑运算符



我对这个编程世界很陌生,我的问题听起来可能很傻,但有人能解释以下两个代码之间的区别吗。

代码1

int yr;
printf("enter the respective year=n");
scanf("%d", &yr);
if(yr%400==0 || yr%100!=0 && yr%4==0)
printf("It is a leap yearn");
else
printf("It is not a leap yearn");
return 0;

代码2

int yr;
printf("enter the respective year=n");
scanf("%d", &yr);
if((yr%100==0 && yr%400==0) || yr%4==0)
printf("It is a leap yearn");
else
printf("It is not a leap yearn");
return 0;

我认为两者都应该很好地工作,但当我执行它们时,只有代码1给出了正确的答案。

if语句中的条件

if(yr%400==0 || yr%100!=0 && yr%4==0)

可以使用类似的括号等效地重写

if ( ( yr%400==0 ) || ( yr%100!=0 && yr%4==0 ) )

闰年是指既可以被400整除,也可以被4整除,同时又不能被100整除的年份。

例如,年份1900不是闰年,因为它不能被400整除,而另一方面可以被100整除。

此if语句中的条件

if((yr%100==0 && yr%400==0) || yr%4==0)

意味着任何可被4整除的年份都是闰年,这是由于第二子表达式CCD_。因此,第一子表达式(yr%100==0 && yr%400==0)的逻辑结果是什么甚至不重要,因为任何可被100和400整除的数字都可同时被4整除。

所以第二个if语句在逻辑上是错误的。它接受year1900作为闰年。

表达式

(yr%400==0 || yr%100!=0 && yr%4==0)   /* (yr%400==0 || (  yr%100!=0 && yr%4==0))*/

( yr%100!=0 && yr%4==0 || yr%400==0 )   /* ( (yr%100!=0 && yr%4==0) || yr%400==0 )*/

是正确的,但为了避免混淆,最好使用括号。两者的评估(分组进行计算(不同,如注释所示。求值顺序基于运算符优先级规则(&&的优先级高于||(。

存在两种复杂情况的冲突:闰年规则本身和逻辑运算符。&&||结合得更紧密,但这甚至不是更深层次的问题。

一个(嵌套的(if...else可能有些过头了。

条件?:似乎是完美的。我可以省略==0和NOT!=。只需将0/1放在正确的位置即可。这给出了一个规则模式:

int isleap(int y) {
return
y%4 ?            // normal year?
0              // done
: y%100 ?      // Candidate. Not a century?
1           // normal leap
: y%400 ?   // Century. normal one?
0        // 100 normal century   
: 1      // 400 special century
;                     // return's semicolon
}

三元条件表达式位于逻辑表达式和if语句之间。对于逻辑表达式,要安全地收集两个";1〃;案件在一起。

"哦,但这需要更多的台词">

是的。还是要定期复制粘贴一行逻辑表达式?而且它可以放在一条线上,看起来只比&amp||-版本。

(没有人真的问,自言自语(

"哦,这是一个完整的功能;

如果速度很重要,inline是一个官方函数说明符。


我为什么这么说是日志。expr。在这种情况下很棘手。";标准";4-100-400-no-parens-midle-not公式:

return y%4 == 0 && y%100 != 0 || y%400 == 0;

使得编译器在&&部分周围建议parens。但即使使用了错误的parens,你也会得到正确的结果。集合论?反转双重异常?

最新更新