koreabao 发表于 2022-1-12 23:03:08

第011讲 短路逻辑和运算符优先级课后测试题问题

>>> 3 and 5 + True or False

解释为解析:基于“短路逻辑”(从左往右,只有当第一个操作数的值无法确定逻辑运算的结果时,才对第二个操作数进行求值),3 and 5 的结果为 5。另外,True 和 False 参与运算是是作 1 和 0 使用的,所以结果为 6。!

个人答案解释 . 3 and 5 + True or False

   优先级+ - 比 not , and, or 优先,所以5+1

   3 and 6 or False
   and 比 or 优先,所以
    6 or False答案为6
都是6 ,数字和 True False不能加减吗?

大马强 发表于 2022-1-12 23:45:18

可以的,当成 0 1 就好
>>> True + 1
2
>>> True - 1
0
>>> 2 - False
2
>>> 2 + False
2
>>>

koreabao 发表于 2022-1-14 12:02:35

大马强 发表于 2022-1-12 23:45
可以的,当成 0 1 就好

谢谢回答,那我想问下,就是对于运算优先级,
是参考答案对呢
还是我的对呢?
谢谢

Stubborn 发表于 2022-1-14 15:22:41

The operator priority or precedence is important to evaluate arithmetic expression involving many operators. The order of evaluation of arithmetic operators is from left to right.

‎运算符优先级或优先级对于计算涉及许多运算符的算术表达式非常重要。算术运算符的计算顺序是从左到右。‎
题主的这里涉及到,算数运算符,和逻辑运算符


对于可以知道的结果,例如1 or 0 。在左侧为真的情况下,程序可以直接发回,所以你的 1 or 2 + d 这里不会产生报错,因为后面不会处理。
对于不知道的结果,例如 1 and 2 ,在左侧为真的情况下,程序必须处理完右侧才能知道结果。


题主这样的3 and 5 + True or False   测试: 3 and 5 + True or 3 + d 并未报错。
我比较倾向的解释流程是。从左到右,有结果就出结果。 expression1 and expression2 or expression3 not expression4
处理 3 是真,处理右侧
处理 5 + True 是 6,也是真 返回 6
这里就变成了 6 or False 直接返回6


如果觉得解释器看起来比较麻烦,可以看下更加简单一些的,计算器程序:https://fishc.com.cn/thread-170706-1-1.html
原则上这个就和处理计算一串字符串的算式一样

也有优先级 + - / *() 但是从程序的角度来说,总是左到右。优先也只是说我需要它的结果,所以才优先处理。

譬如这个算数式2 + 2 * 3 - 5   看做2 and 2 * 3 or 5

Stubborn 发表于 2022-1-14 15:28:21

koreabao 发表于 2022-1-14 12:02
谢谢回答,那我想问下,就是对于运算优先级,
是参考答案对呢
还是我的对呢?


你的优先级是不对的。 你可以尝试False and5 + d   代码,此时d是没有定义的,但是程序不会报错。

优先是指相对。就好像 5 + 1 + 6 * 7 。对程序而言,他处理的是6 + 6 * 7 而不是5 + 1 + 42
从左到右,有结果就出结果。 expression1 and expression2 or expression3 not expression4
看楼上具体的解答,有疑问在回帖



koreabao 发表于 2022-1-15 10:15:56

Stubborn 发表于 2022-1-14 15:28
你的优先级是不对的。 你可以尝试False and5 + d   代码,此时d是没有定义的,但是程序不会报错。

...

题目 :3 and 5 + True or False

答案的意思就是从左到右
3 and 5 所以 是5, 然后算后面 Ture or False =>1 or 0答案为1
所以 5+1 为 6
(3 and 5) + (True or False)
我想说的意思,我看视频说 运算符号 +/- 优先于 notand. or
所以我觉得应该题目 3 and 5 + True or False
变为 3 and (5+True) or False
3 and 6 or 0
然后判断答案为6 。我说的是这个意思

False and5 + d
确实没有报错,那就是说计算机的计算顺序是
(0 and 5) + d
这样结果才是 False

那算数运算(+ ,-)运算优先级 低于逻辑运算优先级 但是我尝试了下
False and 5*d ,就报错说d is not defined
那我可以理解为         算数运算 + ,- < 逻辑运算 < 算数运算 */ '/'吗

Stubborn 发表于 2022-1-15 11:37:08

koreabao 发表于 2022-1-15 10:15
题目 :3 and 5 + True or False

答案的意思就是从左到右


expression1 and expression2 or expression3 not expression4

3 and 5 + True or False
35+TrueFalse 这是三个表达式(expression)

False and5 + d
确实没有报错,那就是说计算机的计算顺序是
(是说明表达式可以确定值之后,是直接返回结果的,如and左侧是Flase, or的左侧是True,都会直接返回结果)
(0 and 5) + d
这样结果才是 False
(如果是你这样算,那么Flase + d呢,肯定会产生错误的。
验证你最上面的连等式, 和你的想法,用这个:False and d + 3 or 2
如果先处理 d + 3 为什么不会报错?
另外False and 5*d是不会报错的,你的IDE测试会报错?

koreabao 发表于 2022-1-15 20:17:01

Stubborn 发表于 2022-1-15 11:37
expression1 and expression2 or expression3 not expression4

3 and 5 + True or False


对, 这个解释回答的我的疑惑
3(expression1)5+True(expression2)False(expression3) 这是三个表达式(expression)

但是网站的解释
解析:基于“短路逻辑”(从左往右,只有当第一个操作数的值无法确定逻辑运算的结果时,才对第二个操作数进行求值),3 and 5 的结果为 5。另外,True 和 False 参与运算是是作 1 和 0 使用的,所以结果为 6。

让我觉得是
3 and 5 (expression1) True and False(expression2)
所以我就不理解了,这次明白了,那我觉得网站的参考答案容易让初学者造成误解

False and 5*d是不会报错的,你的IDE测试会报错?
确实不报错,应该是失误了

谢谢,终于清晰了
页: [1]
查看完整版本: 第011讲 短路逻辑和运算符优先级课后测试题问题