为什么 false ÷ true 的计算结果为 false?

sj9*_*126 9 boolean julia

Julia 中的布尔值在计算中使用时具有数值(false= 0true= 1)。

\n

以下所有内容均达到预期结果:

\n
true + false        #  1\nfalse - true        #  -1\nfalse / true        # 0.0\ntrue \xc3\xb7 false        # DivideError: integer division error\n0 \xc3\xb7 1               # 0\n
Run Code Online (Sandbox Code Playgroud)\n

除了:

\n
false \xc3\xb7 true        # false\n
Run Code Online (Sandbox Code Playgroud)\n

那么为什么false \xc3\xb7 true评估为false, 而不是0like0 \xc3\xb7 1呢?

\n
\n

更新:看来乘法具有相同的行为:

\n
false * true        # false\n
Run Code Online (Sandbox Code Playgroud)\n

我可以理解,类型的行为可能Bool与其他数字类型不同,但奇怪的是,加法和减法的行为与乘法和除法不同。

\n

数学运算文档指出:

\n
\n

请注意,Bool 是整数类型,所有常用的提升规则和数字运算符也都在其上定义。

\n
\n

因此,它没有在所有算术上下文中将布尔值视为整数,这有点令人惊讶。

\n

sj9*_*126 2

正如@DNF 指出的,该div()决策是用布尔逻辑实现的。

具体方法定义位于 Julia 源代码树的基本代码中 ( julia/base/bool.jl)。

加法和减法转换BoolInt

+(x::Bool, y::Bool) = Int(x) + Int(y)
-(x::Bool, y::Bool) = Int(x) - Int(y)
Run Code Online (Sandbox Code Playgroud)

但除法不会:

div(x::Bool, y::Bool) = y ? x : throw(DivideError())
Run Code Online (Sandbox Code Playgroud)

我仍然觉得有点奇怪,并非所有Bool操作都被视为数字类型,但显然它就是这样的。