簡體   English   中英

(在哪里)C 標准是否定義了加/減兩個布爾值的結果?

[英](Where) does the C standard define the result of adding/subtracting two booleans?

C11 標准_Bool類型(6.2.5.2)定義為標准無符號 integer 類型(6.2.5.6),當我閱讀標准時, _Bool也是一種算術類型(6.2.5.18 通過 6.2.5.7 和 6.2.5.17) .

此外,指定對於+- “兩個操作數都應具有算術類型,或者一個操作數應是指向完整 object 類型的指針,而另一個應具有 integer 類型”(6.5.6.2)。

但是,關於結果,我只能看到“二元 + 運算符的結果是操作數之和”(6.5.6.5)和“二元 - 運算符的結果是第二個操作數減去第一個”(6.5.6.6)。 對於兩個布爾值,“和”可以解釋為邏輯或,但我認為“減法”沒有明確定義的含義。

所以問題是: a+bab (其中ab具有類型_Bool )的結果是 C11 中未定義的行為,還是標准明確定義了這些操作的結果(如果是,在哪里?)?

注意:也許標准只是將_Bool視為 integer 范圍很小。 在這種情況下,我希望true + true0 (1 + 1 模 2)。 但是, GCC 說 1

它來自第 6.3.1.2 節:

當任何標量值轉換為 _Bool 時,如果該值比較等於 0,則結果為 0; 否則,結果為 1)

因此該操作是使用普通的無符號算術完成的,然后將結果轉換為_Bool ,它將任何非零結果映射到1

來自 C 標准(6.5.6 加法運算符)

4 如果兩個操作數都具有算術類型,則對它們執行通常的算術轉換

和(6.3.1.8 常用算術轉換)

1 許多期望算術類型的操作數的運算符會導致轉換並以類似的方式產生結果類型......

否則,對兩個操作數都執行 integer 提升

和(6.3.1.1 Boolean,字符和整數)

  1. ...如果 int 可以表示原始類型的所有值(受寬度限制,對於位域),則該值將轉換為 int; 否則,它將轉換為無符號整數。 這些被稱為 integer 促銷活動。 58) integer 促銷活動未更改所有其他類型。

因此,當兩個操作數的類型_Bool (integer)在執行操作之前提升為int類型時,加法運算的結果的類型為int

請注意,在 C 中沒有 boolean 類型,如 C++ 中的類型。 boolean 類型_Bool是 C 中的標准無符號 integer 類型,可以存儲10

所以如果你會寫例如

_Bool a = 1;
_Bool b = 1;
_Bool c = a + b;

那么變量 c 的值將是 1,因為任何非零值(並且操作的結果是int類型的值 2)都將轉換為 1。

從 C 標准

6.3.1.2 Boolean 型

1 任何標量值轉換為_Bool時,如果值比較等於0則結果為0; 否則,結果為 1。

暫無
暫無

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

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