首页 > 解决方案 > 为什么`0--3//2`和`--3//2`之间有区别?

问题描述

我正在弄清楚如何在没有math模块的情况下进行地板/天花板操作。我通过使用 floor division 解决了这个问题//,并发现否定“给出了天花板”。所以这有效:

>>> 3//2
1
>>> -3//2
-2

我希望答案是肯定的,所以首先我尝试--3//2了 ,但这给出了 1。我推断这是因为 Python 的计算结果--+。所以为了解决这个问题,我发现我可以使用-(-3//2)),问题解决了。

但是我找到了另一个解决方案,即(我包含了前面的示例进行比较):

>>> --3//2  # Does not give ceiling
1
>>> 0--3//2  # Does give ceiling
2

我无法解释为什么包括 0 有帮助。我已阅读有关部门的文档,但在那里没有找到任何帮助。我认为这可能是因为评估顺序:

如果我用--3//2这个例子作为例子,从我所拥有的文档Positive, negative, bitwise NOT中,这个例子中最严格的,我猜这评估--+. 接下来是Multiplication, division, remainder,所以我猜这是+3//2评估为 的1,我们完成了。我无法从文档中推断出为什么 include0应该改变结果。

参考:

标签: pythonoperator-precedence

解决方案


Python 使用该符号-作为一( -x) 和二元( x-y) 运算符。这些具有不同的运算符优先级

具体来说,顺序//是:

  • 一元-
  • 二进制//
  • 二进制-

通过引入0as 0--3//2,第一个-二进制文件 -,最后应用。没有前导0as --3//2,两者-都是一元的并且一起应用。

对应的评估/语法树大致是这样的,先评估底部的节点,然后在父节点中使用它们:

 ---------------- ---------------- 
|     --3//2     |    0--3//2     |
|================|================|
|                |    -------     |
|                |   | 0 - z |    |
|                |    -----+-     |
|                |         |      |
|     --------   |     ----+---   |
|    | x // y |  |    | x // y |  |
|     -+----+-   |     -+----+-   |
|      |    |    |      |    |    |
|  ----+    +--  |   ---+    +--  |
| | --3 |  | 2 | |  | -3 |  | 2 | |
|  -----    ---  |   ----    ---  |
 ---------------- ---------------- 

因为一元-是一起应用的,所以它们抵消了。相反,一元和二元-分别在除法之前之后应用。


推荐阅读