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