Như bạn đã nói trong một chú thích để @Jack, "6.3.1.1p1 nói rằng cấp bậc chuyển _Bool
là ít hơn so với thứ hạng của tất cả các loại nguyên tiêu chuẩn khác".
Trong một cuộc gọi đến printf
, một char
hoặc short
sẽ được thúc đẩy và thông qua trên stack như một int
(hoặc một unsigned int
), vì vậy tôi sẽ nghĩ rằng việc sử dụng %d
như một specifier định dạng sẽ là tốt. Điều đó cũng có nghĩa là bạn không cần dàn diễn viên rõ ràng để int
, bởi vì điều đó sẽ tự động diễn ra.
Vấn đề duy nhất có thể xảy ra là cách trình biên dịch đại diện cho một
_Bool
, một cái gì đó mà nó có thể thực hiện được xác định và có thể thay đổi từ trình biên dịch này sang trình biên dịch khác. Tôi thấy hai khả năng triển khai - 0 và 1 hoặc 0 và -1.
Để tối ưu hóa tính di động, hãy làm theo câu trả lời của @ user325181 và sử dụng số ba để chọn giữa hai tùy chọn. Hoặc là số nguyên (trình biên dịch có thể tối ưu hóa) hoặc chuỗi.
Edit: Theo báo cáo trong câu trả lời khác, một _Bool
được định nghĩa là một kiểu không thể thiếu unsigned có thể lưu trữ hoặc là 0 hoặc 1. Do đó, và thực tế là nó sẽ được đề bạt lên một
unsigned
int
khi truyền cho printf()
, tôi có thể nói rằng
%u
%d
là trình chỉ định thích hợp nhất.
Tôi không nghĩ rằng bạn cần một dàn diễn viên trước của 'foo':' _Bool' sẽ chuyển sang 'int' theo mặc định. – dasblinkenlight
Bạn không cần. '_Bool' được gõ vào' int' trong C99. – Jack
Plus, ngay cả khi '_Bool' không phải là typedef cho' int', 'printf()' không an toàn kiểu; nếu bạn đẩy một giá trị có cùng kích thước với 'int' vào chồng, và nói' printf() 'để in nó thành' int', bởi golly 'printf()' sẽ in nó thành 'int', không câu hỏi. – steveha