2013-06-18 37 views
8

Tôi cố gắng để gia tăng giá trị bool với nhau, nói:thêm hai giá trị bool trong c/C++

bool i = 0, j = 0, k = 0;
cout << sizeof(i + j + k) << endl;

Kết quả là 4, có nghĩa là, kết quả được chuyển thành một 'int' giá trị.

Tôi muốn hỏi: Đây có phải là hoạt động chuẩn C/C++ không? trình biên dịch luôn đảm bảo rằng giá trị tạm thời được chuyển đổi thành loại lớn hơn nếu nó tràn? Cảm ơn!

Cảm ơn câu trả lời, người ta theo dõi câu hỏi: nói, nếu tôi làm: unsigned short i = 65535, j = 65535; cout << sizeof(i + j) << endl; Kết quả là 4. Tại sao nó được thăng 'int'?

+0

int không phải là loại lớn hơn bool – aaronman

+1

Trình biên dịch có luôn đảm bảo rằng giá trị tạm thời được chuyển thành loại lớn hơn nếu nó tràn không? Không, nó không bao giờ chuyển đổi một giá trị thành loại lớn hơn cho đến khi một diễn viên được yêu cầu. – Tushar

+3

@aaronman: Trong hầu hết các hiện thực 'sizeof (bool)

Trả lời

16

Nó không phải là tràn gây ra chuyển đổi, đó là thực tế rất bạn đã làm số học ở tất cả. Trong C++ (và C trong đó hành vi có nguồn gốc), toán hạng của toán tử số học cơ bản trên các kiểu dựng sẵn đi qua một tập hợp các chương trình khuyến mãi được xác định trước khi tính toán được thực hiện. Phần lớn các quy tắc cơ bản của các quy tắc này (được đơn giản hóa) là bất kỳ loại nào nhỏ hơn int được thăng cấp thành int.

Câu hỏi tiếp theo của bạn có cùng câu trả lời - số short của bạn nhỏ hơn int, vì vậy nó được thăng cấp thành int trước khi việc bổ sung diễn ra.

This StackOverflow question có một số câu trả lời mô tả quảng cáo chi tiết hơn.

+0

bool không phải lúc nào cũng là kích thước 1 – aaronman

+1

Tôi đã không nói nó đúng không? Tôi đoán tôi có thể tiền tố câu trả lời của tôi với "nếu có một chuyển đổi". –

+0

Rất tuyệt! Cảm ơn bạn. – JASON

1

Đầu tiên, sizeof không cho bạn biết rằng kết quả được chuyển đổi thành giá trị int. Nó được cho phép, và thực sự không phổ biến, rằng bool có cùng kích thước với int.

Tuy nhiên, bạn thực sự sẽ nhận được int ở đây, nhưng không liên quan đến giá trị (thực tế, loại không thể phụ thuộc vào giá trị vì nói chung các giá trị sẽ không được biết cho đến khi thời gian chạy, trong khi loại phải được xác định tại thời gian biên dịch).

Điều gì xảy ra trước khi thêm, các bool giá trị được thăng tiến để intbool được định nghĩa là một kiểu số nguyên, và các loại số nguyên nhỏ hơn inttất cả được thăng tiến để int. Sau đó, bạn thêm ba giá trị int (một hoạt động không bị tràn bất kể giá trị bool mà bạn sử dụng, bởi vì INT_MAX được đảm bảo lớn hơn 3).

+0

Vâng, nếu bạn đếm đồng hồ đeo tay và bộ điều khiển vi điều khiển 8 bit được nhúng khác. Tôi tính đến tất cả các trình biên dịch và nền tảng hiện đại mà tôi đã thấy nó là một byte đơn. Vì vậy, một bool có thể là kích thước của một int chỉ trên nền tảng 8 bit. – dtech

+0

Ngay cả trên vi 8 bit, 'int' phải có ít nhất 16 bit. Tôi đoán thậm chí họ không có cùng kích cỡ. –

+0

@ddriver: Điểm không phải là 'int' có thể là 8 bit (không thể), nhưng' bool' đó có thể lớn hơn một byte. Và đó không chỉ là vấn đề lý thuyết: http://stackoverflow.com/a/6935286/1032073 – celtschk

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