鱼C论坛

 找回密码
 立即注册
查看: 1472|回复: 12

[已解决]问一个关于运算符优先级的问题

[复制链接]
发表于 2019-10-25 18:41:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请用最快速度说出答案:not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9

我的疑问是这道题目里,优先级高的运算符真的是先做了相应的运算吗?

按照小甲鱼给的答案:

我们按照优先级给它们加上括号:(not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
== 0 or 0 or 4 or 6 or 9
== 4

看起来是优先级高的运算符先做了相应的运算
但是按照下面这段代码以及输出来看,并不是优先级高的运算符先运算了
是因为短路逻辑打破了优先级吗?
  1. def a():
  2.     print('A')
  3.     return 0
  4. def b():
  5.     print('B')
  6.     return 4
  7. def c():
  8.     print('C')
  9.     return 3
  10. def d():
  11.     print('D')
  12.     return 2
  13. def e():
  14.     print('E')
  15.     return 0

  16. a() or not(b()) or c() or d() and e()
复制代码
  1. A
  2. B
  3. C
复制代码


(我的这个问题不影响课后练习的答案,只是好奇代码的运行逻辑)
最佳答案
2019-10-25 19:21:02
确实是的

  1. def a():
  2.     print('A')
  3.     return 0
  4. def b():
  5.     print('B')
  6.     return 4
  7. def c():
  8.     print('C')
  9.     return 3
  10. def d():
  11.     print('D')
  12.     return 2
  13. def e():
  14.     print('E')
  15.     return 0

  16. a() or not b() or c() or d() and e()
  17. # == 0 or not 4 or 3 or d() and e()
  18. # == 0 or 0 or 3 or d() and e()
  19. # == 3
  20. # 不管 d() 和 e() 的值
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-25 18:46:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-25 19:21:02 | 显示全部楼层    本楼为最佳答案   
确实是的

  1. def a():
  2.     print('A')
  3.     return 0
  4. def b():
  5.     print('B')
  6.     return 4
  7. def c():
  8.     print('C')
  9.     return 3
  10. def d():
  11.     print('D')
  12.     return 2
  13. def e():
  14.     print('E')
  15.     return 0

  16. a() or not b() or c() or d() and e()
  17. # == 0 or not 4 or 3 or d() and e()
  18. # == 0 or 0 or 3 or d() and e()
  19. # == 3
  20. # 不管 d() 和 e() 的值
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-25 20:09:06 | 显示全部楼层

为什么不打印 D 和 E 呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-25 20:10:13 | 显示全部楼层
dragov 发表于 2019-10-25 20:09
为什么不打印 D 和 E 呢?

因为 0 or 0 or 3 已经出现了一个 3,根据短路逻辑,不会再计算 d() 和 e() 的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-25 20:11:24 | 显示全部楼层

那是不是小甲鱼的答案写的有点问题啊?
有点让人感觉所有优先级高的运算符都会先进行运算
但其实并不是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-25 20:12:14 | 显示全部楼层
__mrsq__ 发表于 2019-10-25 20:11
那是不是小甲鱼的答案写的有点问题啊?
有点让人感觉所有优先级高的运算符都会先进行运算
但其实并不是 ...

那样可能更易于理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-25 20:14:38 | 显示全部楼层
zltzlt 发表于 2019-10-25 20:10
因为 0 or 0 or 3 已经出现了一个 3,根据短路逻辑,不会再计算 d() 和 e() 的值。

0 or 0 or 3 or 2 and 0
我认为是这样啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-25 20:16:13 | 显示全部楼层
dragov 发表于 2019-10-25 20:14
0 or 0 or 3 or 2 and 0
我认为是这样啊?

它只是当有必要时才计算函数的返回值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-25 20:17:31 | 显示全部楼层
zltzlt 发表于 2019-10-25 20:16
它只是当有必要时才计算函数的返回值。

嗯,谢谢,似乎明白啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-25 20:39:30 | 显示全部楼层
zltzlt 发表于 2019-10-25 20:12
那样可能更易于理解

我也是这么想的,的确第一眼看上去是有助于理解
但感觉也潜在地引入了一些误解,虽然对结果没有产生影响
我以为的短路逻辑是这么一个过程
4 or 6 or 9
4 or 9
4
但好像实则不然
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-25 20:42:16 | 显示全部楼层
__mrsq__ 发表于 2019-10-25 20:39
我也是这么想的,的确第一眼看上去是有助于理解
但感觉也潜在地引入了一些误解,虽然对结果没有产生影响 ...

0 or 0 or 4 or 6 or 9

在 or 中,遇到第一个为 True 的值(在这里是 4)Python 就会停止运算,直接返回那个为 True 的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-25 20:51:02 | 显示全部楼层
zltzlt 发表于 2019-10-25 20:42
0 or 0 or 4 or 6 or 9

在 or 中,遇到第一个为 True 的值(在这里是 4)Python 就会停止运算,直接返 ...

嗯,对的,我已经理解了。我的意思小甲鱼能不能做一点修改,这样大家可能就不会产生像我有的这样的误解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 08:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表