[英]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.