簡體   English   中英

從左到右的表達評估

[英]Left to right expression evaluation

在C#中,是否保證表達式從左到右進行求值?

例如:

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

有沒有不符合的語言?

您實際上是指一種稱為“短路邏輯表達式”的語言功能:

這意味着:當邏輯表達式的結果不再發生變化時,例如,當表達式無論如何都將評估為“真”或“假”時,表達式的剩余部分將不會被評估。

例如,C#,Java或JavaScript就是這樣做的,你可以用這些語言來依賴它(回答你的問題)。

在您的情況下,如果MyClass不為null:

  • MyClass == null計算結果為false
  • 因為它是一個“或”表達式,第二部分仍然可以改變結果,所以它被評估
  • myClass.Property > 0確定最終結果

如果MyClass為null:

  • MyClass == null計算結果為true
  • 因為它是一個“或”表達式,所以后面的內容並不重要
  • 不再進行評估,最終結果是真的

有些語言不會使邏輯表達式短路。 經典VB就是一個例子,如果MyClass為null(在VB中稱為“Nothing”),將評估“myClass.Property> 0”,並產生錯誤。

C#3.0規范的第7.11節描述了短路:

操作x || y對應於操作x | y,除了僅在x不為真時才計算y。

是的,你很好。

至於其他語言 - 我從不喜歡說所有語言。 在VB.NET中,你可以使用OrElse和AndAlso,它們是短路的,但是普通的Or和And不是。

不過要小心:

如果你有類似的東西

sprintf(buf,“%s%s”,func1(&var),func2(&var));

對於var的sideeffects,它沒有定義(在C中,我不確定評估順序是否在其他語言中定義),執行func1()和func2()的順序(它取決於,以什么順序(左或右)將參數放在堆棧上並從那里進行評估。

實際上,短路是其中的一部分,但您還需要知道該語言是否能保證對這些語言進行從左到右的評估。 例如,C(ANSI,ISO,C99)不保證從左到右的評估。 在示例代碼中,可以在檢查NULL之前檢查Property的值,或者同時執行兩者...大多數編譯器都沒有,但是沒有什么能阻止它執行此操作並完全符合規范。 它甚至告訴你不要因為這個而編寫這樣的代碼。

評估順序取決於運算符,在這種情況下,布爾值或( || )被定義為通常稱為短路的 ,以使這樣的結構起作用。

我不確定,您對訂單或短路評估真的感興趣嗎?

我不是百分百肯定,但據我所知,評估的順序在C#中總是相同的(我假設大多數(如果不是全部.net語言))。 短路評估的工作原理如前面的答案所述。

但是,在C#中,您可以選擇不使用簡單的運算符(而不是&&)進行短路。 通常您想要短路,但可能是您想要執行所有評估的情況。

Ada,Visual Basic和Pascal等語言中的和/或運算符不會短路。 它們確實提供了額外的操作符來允許該功能,例如Ada中的“然后”和“或者”。

Python有短路or and運營商。

在Java和Haskell &&和||中 短路也是如此。

有趣的是:在Haskell中,這自然與語言(您可以定義自己的運算符來實現),而在Java和C#中,它是特定於這兩個運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM