【发布时间】:2017-08-12 18:57:42
【问题描述】:
我对 Solidity 中的操作顺序有疑问。在文档中,它说逻辑 NOT 操作优先于逻辑 AND 操作。问题是,当我有一个像 if(false && !function()) 这样的 if 语句时,我认为由于操作顺序而首先调用该函数,但实际上首先完成了 && 运算符的短路。所以我的问题是:为什么?
【问题讨论】:
标签: operator-precedence solidity
我对 Solidity 中的操作顺序有疑问。在文档中,它说逻辑 NOT 操作优先于逻辑 AND 操作。问题是,当我有一个像 if(false && !function()) 这样的 if 语句时,我认为由于操作顺序而首先调用该函数,但实际上首先完成了 && 运算符的短路。所以我的问题是:为什么?
【问题讨论】:
标签: operator-precedence solidity
这是因为|| 和&& 这两个运算符应用了常见的短路规则,如Solidity document 中所述:
运算符 || && 应用常见的短路规则。这 表示在表达式 f(x) || g(y),如果 f(x) 计算结果为真, 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
【讨论】: