从左到右的表达评估

5 c# language-agnostic compiler-construction expression expression-evaluation

在C#中,是否保证表达式从左到右进行求值?

例如:

myClass = GetClass();  
if (myClass == null || myClass.Property > 0)  
    continue;
Run Code Online (Sandbox Code Playgroud)

有没有不符合的语言?

Tom*_*lak 14

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

这意味着:当逻辑表达式的结果不再发生变化时,例如,当表达式无论如何都将评估为"真"或"假"时,表达式的剩余部分将不会被评估.

例如,C#,Java或JavaScript就是这样做的,你可以用这些语言来依赖它(回答你的问题).

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

  • MyClass == null 评估为假
  • 因为它是一个"或"表达式,第二部分仍然可以改变结果,所以它被评估
  • myClass.Property > 0 确定最终结果

如果MyClass为null:

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

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


Jon*_*eet 5

C#3.0规范的第7.11节描述了短路:

操作x || y对应于操作x | y,除了仅在x不为真时才计算y.

是的,你很好.

至于其他语言 - 我从不喜欢说所有语言.在VB.NET中,你可以使用OrElse和AndAlso,它们是短路的,但是普通的Or和And不是.