1

我对 Solidity 中的操作顺序有疑问。在文档中,它说逻辑 NOT 操作优先于逻辑 AND 操作。问题是,当我有这样的if语句时,if(false && !function())我认为由于操作顺序而首先调用该函数,但实际上首先完成了运算符的短路&&。所以我的问题是:为什么?

4

1 回答 1

0

这是因为这两个运算符||应用&&了通用的短路规则,如Solidity 文档中所述:

运营商 || && 应用常见的短路规则。这意味着在表达式 f(x) || g(y),如果 f(x) 计算结果为真,即使 g(y) 可能有副作用,也不会计算 g(y)。

由于常见的短路规则,此处描述的行为与许多其他语言(例如 Java 或 Scala)完全相同。这是一个 Scala REPL 演示:

scala> def foo(x: Int): Boolean = { if (x >= 0) true else ??? }
foo: (x: Int)Boolean

scala> foo(10)
res0: Boolean = true

scala> foo(-10)
scala.NotImplementedError: an implementation is missing
  at scala.Predef$.$qmark$qmark$qmark(Predef.scala:230)
  at .foo(<console>:11)
  ... 32 elided

scala> if (false && !foo(-10)) "boo" else "bar"
res2: String = bar
于 2017-03-23T05:11:21.193 回答