簡體   English   中英

_Bool的printf轉換說明符?

[英]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是一個無符號整數類型,足以存儲值01 你可以這樣打印_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的調用中, charshort將被提升並作為int (或unsigned int )傳遞給堆棧,因此我認為使用%d作為格式說明符會沒問題。 這也意味着你不需要顯式強制轉換為int ,因為這會自動發生。

唯一可能的問題是編譯器如何表示 _Bool ,它可能是實現定義的,並且可能因編譯器而異。 我看到兩種可能的實現 - 0和1或0和-1。

為了獲得最佳的便攜性,請關注@ user325181的答案,並使用三元組在兩個選項之間進行選擇。 整數(編譯器可能優化掉)或字符串。

編輯:正如在其他答案中報告的那樣, _Bool被定義為可以存儲0或1的無符號整數類型。因此,以及在傳遞給printf()時它將被提升為 unsigned int的事實,我會說 %u %d是最合適的說明符。

沒有。 只需使用%d%i說明符處理它就像int一樣。

_Bool

在C99中,引入了一個新的關鍵字_Bool作為新的布爾類型。 在許多方面,它的行為很像unsigned int,但是來自其他整數類型或指針的轉換總是被約束為0和1.除了其他無符號類型之外,並且正如人們期望的布爾類型,這樣的轉換為0,如果並且僅當有問題的表達式評估為0並且在所有其他情況下它為1時。 標題stdbool.h提供了宏bool,true和false,分別定義為_Bool,1和0。

實現它的第一種方法是使用char或( int8_tenumbit fields 但實際上,這取決於。 它可以是inttypedef (正如我所提到的,它已被使用,但不建議使用,不受bug影響)或charunsigned 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_ */

其他實施:

typedef int8_t _Bool;

typedef enum { false = 0, true = 1 } bool;

typedef unsigned char Boolean; typedef _Bool Boolean;

我使用%b作為Java printf()轉換說明符。 我最近嘗試過,令我驚訝的是它有效。

這是代碼行:

System.out.printf("firstRobot == secondRobot: %b",firstRobot == secondRobot);

這是輸出:

firstRobot == secondRobot: false

暫無
暫無

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

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