Về loại boolean trong C
Một kiểu boolean được giới thiệu khá muộn trong ngôn ngữ C, vào năm 1999. Trước đó, C không có kiểu boolean mà thay vào đó được sử dụng int
cho tất cả các biểu thức boolean. Do đó, tất cả các toán tử logic như > == !
vv trả int
về giá trị 1
hoặc0
.
Nó đã được tùy chỉnh cho các ứng dụng để sử dụng các loại sản xuất tại nhà, chẳng hạn như typedef enum { FALSE, TRUE } BOOL;
cũng có int
các loại kích cỡ.
C ++ có loại boolean rõ ràng và tốt hơn nhiều, bool
không lớn hơn 1 byte. Trong khi các kiểu boolean hoặc biểu thức trong C sẽ có 4 byte trong trường hợp xấu nhất. Một số cách tương thích với C ++ đã được giới thiệu trong C với tiêu chuẩn C99. C sau đó có một kiểu boolean _Bool
và tiêu đề stdbool.h
.
stdbool.h
cung cấp một số khả năng tương thích với C ++. Tiêu đề này xác định macro bool
(cùng cách viết với từ khóa C ++) mở rộng ra _Bool
, một loại là loại số nguyên nhỏ, có khả năng lớn 1 byte. Tương tự, tiêu đề cung cấp hai macro true
và false
cùng một cách viết với từ khóa C ++, nhưng có khả năng tương thích ngược với các chương trình C cũ hơn . Do đó true
và false
mở rộng đến 1
và 0
trong C và loại của họ làint
. Các macro này không thực sự thuộc loại boolean như các từ khóa C ++ tương ứng.
Tương tự, đối với các mục đích tương thích ngược, các toán tử logic trong C vẫn trả về int
cho đến ngày nay, mặc dù ngày nay C có kiểu boolean. Trong khi ở C ++, toán tử logic trả về a bool
. Do đó, một biểu thức như sizeof(a == b)
sẽ cho kích thước của một int
trong C, nhưng kích thước của một bool
trong C ++.
Về toán tử điều kiện ?:
Toán tử điều kiện ?:
là một toán tử kỳ lạ với một vài quirks. Đó là một sai lầm phổ biến để tin rằng nó tương đương 100% if() { } else {}
. Không hẳn.
Có một điểm thứ tự giữa việc đánh giá toán hạng 1 và 2 hoặc 3. Các ?:
nhà điều hành được đảm bảo chỉ đánh giá hệ 2 hoặc toán hạng thứ 3, vì vậy nó không thể thực hiện bất kỳ tác dụng phụ của các toán hạng không được đánh giá. Mã như true? func1() : func2()
sẽ không thực thi func2()
. Càng xa càng tốt.
Tuy nhiên , có một quy tắc đặc biệt nói rằng toán hạng thứ 2 và thứ 3 phải được loại hoàn toàn được thăng cấp và cân bằng với nhau bằng các chuyển đổi số học thông thường . ( Quy tắc quảng cáo ngầm định trong C được giải thích ở đây ). Điều này có nghĩa là toán hạng thứ 2 hoặc thứ 3 sẽ luôn lớn nhất bằng một int
.
Vì vậy, nó không thành vấn đề true
và tình false
cờ thuộc loại int
C vì biểu thức sẽ luôn cung cấp ít nhất kích thước của một int
vấn đề.
Ngay cả khi bạn viết lại biểu thức thành nó vẫn sẽ trả về kích thước của một !sizeof(a ? (bool)true : (bool)false)
int
Điều này là do quảng cáo kiểu ngầm thông qua các chuyển đổi số học thông thường.
sizeof(true)
vàsizeof(false)
cũng là 4: ide.geekforgeek.org/O5jvuN