2011-10-05 47 views
6

Cân nhắc C++ mã bên dưới:Tổng giá trị bool trong C/C++

bool a = 5; 
bool b = 6; 
int c = (int)a + (int)b; 

Khi tôi biên dịch & chạy mã này, c có giá trị 2. Liệu các bảo đảm tiêu chuẩn, trong bất kỳ trình biên dịch/nền tảng, bool giá trị được khởi tạo bằng false (0) hoặc true (không nhất thiết 1) sẽ là 1 trong hoạt động và mã ở trên sẽ luôn dẫn đến c là 2?

Và trong C99, bao gồm stdbool.h, vẫn còn hợp lệ?

+1

tôi đoán bạn câu trả lời là ở đây: http://stackoverflow.com/questions/2725044/can-i-assume-booltrue-int1-for-any-c-compiler –

+2

IMO, nếu bạn gán một cái gì đó khác hơn true/false cho một biến bool nó nên được xem xét lại mã cho bạn. – Max

+0

Tôi chỉ có một từ: TẠI SAO? –

Trả lời

10

Mục 4.7 (phiên bản số nguyên) của chuẩn C++ nói:

Nếu loại nguồn là bool, giá trị sai được chuyển thành zero và giá trị đúng được chuyển thành một.

Mục 4.9 đảm bảo cùng một chuyển đổi điểm động.

+0

Cảm ơn, câu trả lời này cho C++, nhưng nó có hợp lệ cho C99 (với stdbool) không? – fbafelipe

1

Đối với trình biên dịch, quy tắc thường là false là 0 và mọi thứ khác sẽ đúng. Tuy nhiên, xử lý bool như nó là một loại số nguyên thường được coi là hình thức xấu. Tuy nhiên, tiêu chuẩn bao gồm một quy tắc để chuyển đổi thành int và giả định của bạn là đúng false = 0 và true = 1 miễn là trình biên dịch tuân theo tiêu chuẩn!

Trong mọi trường hợp, tại sao số học với các loại bool?

Hope trợ giúp này

+0

Số học với các kiểu bool có thể hữu ích khi viết ít mã hơn, vì vậy bạn có thể viết x + = a ;, thay vì x + = (a? 1: 0) ;. – fbafelipe

+0

Tại sao không sử dụng x | = a; hoặc thậm chí x = x || a; tất cả đều tốt đẹp và tôn trọng các loại cơ bản – Martin

+0

Và nếu x là một int, đếm bao nhiêu (của một tập hợp các bools) là đúng? Tôi biết có nhiều cách xung quanh, nhưng vì điều này có vẻ đơn giản hơn, tôi hỏi câu hỏi để biết nếu nó sẽ luôn luôn làm việc. – fbafelipe

1

Theo tiêu chuẩn:

  • true chuyển tới 1
  • false chuyển thành 0

Và ông đúc để int là không cần thiết như việc chuyển đổi đến int là ẩn.

1

David Schwartz đã trả lời cho C++. Đối với tiêu chuẩn C99, chúng tôi có 6.3.1.4:

Khi bất kỳ giá trị vô hướng nào được chuyển thành _Bool, kết quả là 0 nếu giá trị so với 0; cách khác, kết quả là 1.

Kể từ 6.3.1.1 của tiêu chuẩn cũng làm cho nó rõ ràng rằng _Bool là tùy thuộc vào chương trình khuyến mãi số nguyên thì rõ ràng rằng một _Bool sẽ luôn là 0 hoặc 1.

Các vấn đề liên quan