[英]printf conversion specifier for _Bool?
使用printf()
,我可以將%hhu
用於unsigned char
,將%hi
用於short int
,將%zu
用於size_t
,將%tx
用於ptrdiff_t
等。
我對_Bool
使用什么轉換格式說明符? 標准中是否存在一個?
或者我必須像這樣投射:
_Bool foo = 1;
printf("foo: %i\n", (int)foo);
_Bool
類型沒有特定的轉換長度修飾符。
_Bool
是一個無符號整數類型,足以存儲值0
和1
。 你可以這樣打印_Bool
:
_Bool b = 1;
printf("%d\n", b);
由於整數提升規則, _Bool
保證提升為int
。
直到C99,bool不是標准C的一部分,因此不作為printf修飾符存在。 C99,定義_Bool(你正在使用)是一個整數,因此你應該把它作為一個整數來展示(至少從機器的角度來看)。 或者,您可以執行以下操作:
printf("%d",foo?1:0);
正如您在對@Jack的評論中所述,“6.3.1.1p1表示_Bool
的轉換等級小於所有其他標准整數類型的等級”。
在對printf
的調用中, char
或short
將被提升並作為int
(或unsigned int
)傳遞給堆棧,因此我認為使用%d
作為格式說明符會沒問題。 這也意味着你不需要顯式強制轉換為int
,因為這會自動發生。
唯一可能的問題是編譯器如何表示
_Bool
,它可能是實現定義的,並且可能因編譯器而異。
我看到兩種可能的實現 - 0和1或0和-1。
為了獲得最佳的便攜性,請關注@ user325181的答案,並使用三元組在兩個選項之間進行選擇。 整數(編譯器可能優化掉)或字符串。
編輯:正如在其他答案中報告的那樣, _Bool
被定義為可以存儲0或1的無符號整數類型。因此,以及在傳遞給printf()
時它將被提升為
unsigned
int
的事實,我會說
%u
%d
是最合適的說明符。
沒有。 只需使用%d
或%i
說明符處理它就像int
一樣。
在C99中,引入了一個新的關鍵字_Bool作為新的布爾類型。 在許多方面,它的行為很像unsigned int,但是來自其他整數類型或指針的轉換總是被約束為0和1.除了其他無符號類型之外,並且正如人們期望的布爾類型,這樣的轉換為0,如果並且僅當有問題的表達式評估為0並且在所有其他情況下它為1時。 標題stdbool.h提供了宏bool,true和false,分別定義為_Bool,1和0。
實現它的第一種方法是使用char
或( int8_t
) enum
和bit fields
。 但實際上,這取決於。 它可以是int
的typedef
(正如我所提到的,它已被使用,但不建議使用,不受bug影響)或char
或unsigned int
或enum和常用的#define
。
例如, Apple的實現使用int
,如您所見:
#ifndef _STDBOOL_H_
#define _STDBOOL_H_
#define __bool_true_false_are_defined 1
#ifndef __cplusplus
#define false 0
#define true 1
#define bool _Bool
#if __STDC_VERSION__ < 199901L && __GNUC__ < 3
typedef int _Bool;
#endif
#endif /* !__cplusplus */
#endif /* !_STDBOOL_H_ */
其他實施:
我使用%b
作為Java printf()
轉換說明符。 我最近嘗試過,令我驚訝的是它有效。
這是代碼行:
System.out.printf("firstRobot == secondRobot: %b",firstRobot == secondRobot);
這是輸出:
firstRobot == secondRobot: false
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.