在 C# 中,是否保证表达式从左到右计算?

例如:

myClass = GetClass();  
if (myClass == null || myClass.Property > 0)  
    continue;

是否存在不符合规定的语言?

有帮助吗?

解决方案

您实际上指的是一种称为“短路逻辑表达式”的语言功能:

这意味着什么:当逻辑表达式的结果不能再改变时,例如当很明显表达式无论如何都会计算为“true”或“false”时,表达式的其余部分将不会被计算。

例如,C#、Java 或 JavaScript 可以做到这一点,您可以在这些语言中依赖它(来回答您的问题)。

在您的情况下,如果 MyClass 不为空:

  • MyClass == null 评估结果为假
  • 由于它是一个“或”表达式,第二部分仍然可以改变结果,所以它被评估
  • myClass.Property > 0 决定了最终的结果

如果 MyClass 为空:

  • MyClass == null 评估结果为真
  • 因为它是一个“或”表达式,所以后面的内容并不重要
  • 不再进行评估,最终结果为true

有些语言不会短路逻辑表达式。经典 VB 就是一个例子,如果 MyClass 为 null(在 VB 中称为“Nothing”),则“myClass.Property > 0”将被评估并产生错误。

其他提示

的短路在节中的C#3.0规范的7.11中描述:

  

运算x || y对应于   操作X | Y,不同之处在于y是   评价仅当x是不正确的。

所以,是的,你的罚款。

至于其他的语言 - 我从来不喜欢的的所有的语言说话。在VB.NET,你可以使用OrElse运算和AndAlso其短路,但普通或和,而不是。

但要小心:

如果您有类似

的sprintf(buf中, “%S%S”,func1的(VAR),FUNC2(VAR));

与变种的副作用,所以不限定(在C,我不知道,如果所述评价顺序是在其他语言中定义的),其中为了func1的()和FUNC2()被执行(这取决于,在什么样的顺序(左或右)的参数被放置在堆栈上和评估从那里。

求值顺序取决于运算符,在本例中为布尔值或 (||) 被定义为通常所说的 短路, ,使这样的结构发挥作用。

在和/或运营商等阿达时,Visual Basic,和Pascal语言不短路。他们提供额外的运营商允许的功能,如“然后”和“否则” Ada中。

我不知道,你为了还是真的有意短路评价?

我不是100%肯定,但据我所知评价的顺序总是会在C#中相同的(我假设大多数如果不是所有的.NET语言)。短路评价工作在以前的答案的相同。

然而,在C#你不能选择使用简单的运算符(&代替&&)短路。通常情况下,你要短路,但它可能是要在其中执行所有评估的情况下。

Python有短路orand运算符。

在爪哇和Haskell &&和||短路为好。

有趣的一边:在Haskell这个与语言顺其自然(你可以定义自己的运算符做到这一点),而在Java和C#是的具体的那两个运营商

其实短路是一部分,但你还需要知道是否左到右的语言保证这些评价。例如C(ANSI,ISO,C99)不保证左到右的评价。在示例代码有可能检查NULL之前检查属性的值,或同时进行这两种...大多数编译器不这样做,但没有什么阻止它这样做,并且是与规范完全兼容。它甚至会告诉你不要写,因为这这样的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top