孤不冷cing 发表于 2021-11-17 13:01:47

S1E10 课后作业问题求助

题目:
8. 请用一个逻辑表达式来判断某一年是否为闰年。

某一年份如果符合下边 A 或 B 其中一个,我们称之为闰年:
A. 能被 4 整除,但不能被 100 整除;
B. 能被 400 整除。

我的答案:
                ' y % 4 + y % 100 && y % 400 == 0 '

小甲鱼的答案:
                        ' (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) '

请问我的答案对不对呀?

番杰 发表于 2021-11-17 13:24:58

本帖最后由 番杰 于 2021-11-17 13:37 编辑

不对,首先你需要清楚 “ && ”与 “ == ”的运算优先级,
我没记错的话应该是后者高于前者,
所以你这个表达式的逻辑就是:
(y % 4 + y % 100 )&&( y % 400 == 0)
就相当于先算(y % 4 + y % 100 ),在判断( y % 400 == 0),最后取&&

1.先说:(y % 4 + y % 100 )
只要这个Y不为4和100的公倍数,那么这个结果肯定是大于等于1的,即逻辑真。
换而言之,y为4和100的公倍数,那么结果就为0,即逻辑假。

2.再说:( y % 400 == 0)
只要y是400的倍数,那么该表达式就为逻辑真。

3.整体来看:(y % 4 + y % 100 )&&( y % 400 == 0)
结合1和2所述,y只有两种取值方法。

1)y为4和100的公倍数(同样可以看成是400的倍数)
那么,(y % 4 + y % 100 )的结果为0,根据&&短路判断法(好像是这个名字),不用进行( y % 400 == 0)的判断,
即可得出该表达式的结果为假、

2)y不为4和100的公倍数(同样可以看成不是400的倍数)
那么,(y % 4 + y % 100 )的结果为大于等于1的数值,即逻辑真。
( y % 400 == 0)的结果,为假。
真 && 假,为假。
即可得出该表达式的结果为假、

所以综上所述,无论y取什么值,你的表达式的结果都为假。


孤不冷cing 发表于 2021-11-17 19:58:41

番杰 发表于 2021-11-17 13:24
不对,首先你需要清楚 “ && ”与 “ == ”的运算优先级,
我没记错的话应该是后者高于前者,
所以你这个 ...

噢噢
我题都没审清,题目说的或,我看成了与
我也没注意到 4,100 和 400 之间的关系

突然感觉我就应该直接翻译这两选项,不瞎想八想。。。看是不是闰年直接 ' y % 4 == 0 ' 是不是就行了{:9_229:}

番杰 发表于 2021-11-18 09:04:39

孤不冷cing 发表于 2021-11-17 19:58
噢噢
我题都没审清,题目说的或,我看成了与
我也没注意到 4,100 和 400 之间的关系


可以,小甲鱼之所以写成:
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
是因为他这里把闰年分成了“普通闰年”和“世纪闰年”,

“世纪闰年”的意思就是一个可以整除100的闰年,像2000年,1600年这种的,
除此之外的闰年都是“普通闰年”。

你直接写为y % 4 == 0,就相当于直接判断是不是闰年,不管它是普通的还是世纪的。

孤不冷cing 发表于 2021-11-18 12:41:59

番杰 发表于 2021-11-18 09:04
可以,小甲鱼之所以写成:
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
是因为他这里 ...

噢噢,原来如此,蟹蟹
页: [1]
查看完整版本: S1E10 课后作业问题求助