簡體   English   中英

C ++ if(func1()&& func2()),是否必須在func2之前調用func1?

[英]c++ if (func1() && func2()), does func1 have to be called before func2?

在C ++中,如果我編寫以下if語句。 潛在的問題是什么? 行為定義明確嗎? 謝謝。

int i = 0;
// func1 will return the updated value for i.
// func2 will use the new value of i.
if (func1(i) && func2(i)) { ...}

或者,可能將&&更改為||,調用仍然有效嗎?

是的, &&||的第一個操作數 總是先評估。

僅在需要時根據第二個操作數的值評估第二個操作數; 有時稱為短路 對於&& ,只有在第一個為true時才被調用; 用於|| ,前提是第一個為假。

func1將在func2之前返回。 func2如果將不會被調用func1返回false。

對於|| func2如果將不會被調用func1返回true。 這稱為短路。

是的,除非符合常規規則。

func1() && func2()表示if (func1()) return true; else return func2()!=false; if (func1()) return true; else return func2()!=false; 粗略的(這里的return不是真正的“返回”,而是全部一個表達式,因此僅是粗略的)。 func1()?true:func2()更接近其含義。

C ++具有短路規則。 &&評估左側,然后返回false ,然后評估右側。

但是,總是有例外。

如果有人對兩個參數都覆蓋了&& ,則在傳遞給&&之前將對雙方進行評估。 這是不覆蓋&&一個很好的理由。

其次,按條件規則意味着,如果func1()返回true ,編譯器可以自由評估func2()如果func1()返回true ,則編譯器可以自由評估;如果func1()返回false則其行為相同如果它被稱為第二。 即,如果無法“注意到”對func2()的調用,則直至未定義的行為

這種情況的一個例子是嚴格的別名,其中func1()更改一些值,對於func2()沒有定義行為的方式來檢測該值。 但是func2()通過未定義的行為(例如,違反嚴格的別名)可以檢測到更改。

如果func2()func1()沒有其他交互作用,並且沒有副作用,則可以按照as-if優化規則在func1()之前或之后評估func2() 這可能很有用,因為現代處理器一次只能執行一件事情(即使在單個“線程”執行中)。

如果實際對其進行了評估,則func2()的結果可能會有所不同,但是由於該依賴性取決於未定義的行為,因此允許編譯器進行時間旅行,而不會產生預期的結果。

它的長短是對C ++的理解,就像它是可移植的匯編一樣。 因此,盡管func1()之前必須叫func2()邏輯在C ++運行在抽象的機器,這並不意味着它必須在你的程序實際上編譯為硬件這么做。

暫無
暫無

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

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