我有必要代碼的形式爲什麼C沒有邏輯賦值運算符?
a = a || expr;
其中expr
應評估和結果分配給a
當且僅當a
沒有設置的聲明。這依賴於邏輯OR的短路能力。
寫上面會,當然是
a ||= expr;
但較短的方式(讓我吃驚的)C沒有邏輯賦值運算符。
所以我的問題是雙重的。首先,在標準C中寫出第一條語句的方法更短(三元運算符更糟糕 - a = a ? a : expr
要求我拼出a
三倍)。
其次,爲什麼C中沒有邏輯賦值?我能想到的可能原因有:
- 它使語法難以解析?
- 處理這些情況下的短路有一些微妙之處嗎?
- 它被認爲是多餘的(但不是反對所有運營商分配的爭論?)
編輯
請解開這個問題,因爲:
它被連接到的問題(作爲所謂的重複)尚未得到答覆。該問題的(接受的)答案指出
||=
不存在,因爲重複了|=
的功能。這是錯誤的答案。|=
不會短路。C和C++不是相同的語言。我想知道爲什麼C沒有它。事實上,像C++這樣的派生語言,特別是Java(它沒有像Edmund的答案中提到的遺留代碼的問題)的事實使得這個問題更加有趣。
EDIT 2
現在好像我的原意是錯誤的。在聲明a = a || expr
(其中a
是整數,expr
返回一個整數值,首先將a
和expr
隱式轉換爲「布爾值」,然後將「布爾值」值分配給a
。這將不正確 - 整數價值將會喪失。謝謝,延斯和埃德蒙。
因此,對於問題的第一部分,正確的方式,而不是替代品:),編寫我的意圖是:
if (!a) a = expr;
或
a = a ? a : expr;
他們應該優化相同(我認爲)雖然個人我寧願第一個(因爲它有一個a
鍵入)。
但是,問題的第二部分仍然存在。 Jens和Edmund關於a ||= expr
中含糊不清的論點同樣適用於a = a || expr
。分配情況下,可以簡單地被視爲正常之一:
- 轉換
a
爲布爾 - 如果這是真的,則整個表達式的值變爲等於
a
- 布爾值否則評估
expr
,將結果轉換爲布爾值,分配給a
,並將其返回
以上步驟似乎對於賦值和正常情況都是相同的。
此問題*不是*上述「可能重複」的確切副本。那個問題問爲什麼沒有'|| ='的語法縮寫,等等。這個問題詢問爲什麼C不允許通過布爾運算符來攜帶非布爾運算符。 – Edmund 2010-08-17 09:41:43
我打算髮表一個答案:如果那些短路工作會很好。 有一個選項'if(!a)a = expr;'這個選項很清楚簡潔。 至於技巧,請注意,布爾的加法和乘法分別產生OR和AND函數,只要你不需要短路或強制轉換爲'bool','+ ='和'* ='分別執行'|| ='和'&& ='。 – Potatoswatter 2010-08-17 09:43:10
由於這是過早關閉,我在評論中回答。我認爲這不存在,因爲它的解釋是不明確的。在'a | = expr'中應該賦值'expr'的結果還是其邏輯值? 「a | = expr」的整體類型,「int」,「a」的類型或者「a」和「expr」的結果應該是什麼?我不認爲這些問題有一個直接的解決方案,所以任何可能已經考慮過這個問題的人都已經很快放棄了。我個人會選擇'a =(a?a:expr)'並讓編譯器優化分配。 – 2010-08-17 12:44:57