的C11標準定義了_Bool作為一種型別(6.2.5.2)標準的無符號整數型別(6.2.5.6)和作為我讀標準,_Bool是則也是一個算術型別(通過6.2.5.7和6.2.5.17 6.2.5.18)。
此外,還規定 for 和-“兩個運算元都應具有算術型別,或者一個運算元應是指向完整物件型別的指標,另一個應具有整數型別”(6.5.6.2)。
但是,關于結果,我只能看到“二進制 運算子的結果是運算元的總和”(6.5.6.5)和“二進制 - 運算子的結果是從第一個”(6.5.6.6)。對于兩個布林值,“sum”可能被解釋為邏輯或,但我認為“減法”沒有明確定義的含義。
所以問題是:是C11中a b和a-b(wherea和bhave type _Bool)未定義行為的結果還是標準明確定義了這些操作的結果(如果是,在哪里?)?
注意:也許標準只是將其_Bool視為范圍很小的整數。在那種情況下,我希望true true是0(1 1 模 2)。然而,海灣合作委員會說 1。
uj5u.com熱心網友回復:
它來自第 6.3.1.2 節:
當任何標量值轉換為 _Bool 時,如果值比較等于 0,則結??果為 0;否則,結果為 1)
所以操作是使用正常的無符號算術完成的,然后結果被轉換為_Bool,將任何非零結果映射到1。
uj5u.com熱心網友回復:
來自 C 標準(6.5.6 加法運算子)
4 如果兩個運算元都是算術型別,則對它們執行通常的算術轉換
和(6.3.1.8 通常的算術轉換)
1 許多期望算術型別運算元的運算子會以類似的方式導致轉換并產生結果型別......
否則,將在兩個運算元上執行整數提升。
And(6.3.1.1 布林值、字符和整數)
- ...如果 int 可以表示原始型別的所有值(受寬度限制,對于位域),則將該值轉換為 int;否則,它被轉換為無符號整數。這些被稱為整數提升。58) 所有其他型別都被整數提升不變。
因此,int當兩個運算元的型別_Bool都被提升為int執行運算之前的型別時,加法運算的結果具有該型別。
請注意,在 C 中沒有像 C 那樣的布爾型別。boolean 型別_Bool是 C 中的標準無符號整數型別,可以存盤1或0。
所以如果你會寫例如
_Bool a = 1;
_Bool b = 1;
_Bool c = a b;
那么變數 c 的值將是 1,因為任何非零值(并且操作的結果是型別 2 的值int)都被轉換為 1。
來自 C 標準
6.3.1.2 布爾型別
1 任何標量值轉換為_Bool 時,如果值比較等于0,則結果為0;否則,結果為 1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/364020.html
