Tôi có thể giả sử (bool) true == (int) 1 cho bất kỳ trình biên dịch C ++ nào không?


118

Tôi có thể giả sử (bool)true == (int)1cho bất kỳ trình biên dịch C ++ nào không?


3
Các phôi trong câu hỏi của bạn là thừa, chúng có nên được đảo ngược không?
GManNickG

9
Ông không có nghĩa là họ được dàn diễn viên, anh có nghĩa làbool t = true; int n = 1; if (t == n) {...} ;
egrunin

7
@egrunin: Ơ, nhưng true là bool và dù sao thì 1 cũng là int. :)
GManNickG

1
Đúng vậy, tôi muốn nói rõ loại giá trị.
Petruza

2
(int) true1một giá trị số nguyên, nhưng một cái gì đó if (pointer)đi qua phần then nếu pointer != 0. Điều duy nhất bạn có thể giả định là đúng là false == 0, và true != 0(và trueđánh giá lại để 1khi dàn diễn viên đến int)
Luis Colorado

Câu trả lời:


134

Đúng. Các phôi là thừa. Trong cách diễn đạt của bạn:

true == 1

Chương trình khuyến mãi tích hợp được áp dụng và giá trị bool sẽ được thăng hạng thành int và khuyến mại này phải mang lại 1.

Tham chiếu: 4.7 [chuyển đổi liên kết] / 4: Nếu loại nguồn là bool... trueđược chuyển đổi thành một.


9
@Joshua: truelà từ khóa được định nghĩa bởi ngôn ngữ. Nó không thể được xác định lại bởi một thư viện. #defines không được phép xác định lại từ khóa.
jalf

21
@jalf: # define thực sự được phép xác định từ khóa hệ thống. Giai đoạn tiền xử lý của quá trình biên dịch C hoàn toàn là văn bản và không biết gì về từ khóa hoặc cú pháp C nói chung. Tuy nhiên, tất nhiên, hầu như luôn luôn là một ý tưởng tồi khi xác định lại các từ khóa ngôn ngữ.
Dale Hagglund

2
@jalf. Họ không? Hãy xem gcc.gnu.org/onlineocs/cpp/Macros.html và ít nhất một trong các bài dự thi trong Cuộc thi viết mã C Obfuscated Quốc tế, đã từng hỏi "Khi nào thì whilekhông mất một lúc?" (Trả lời: khi nó có hai tham số, bởi vì khi đó mục nhập #definedđó có nó printf.)
Ken Bloom

3
C99, §6.10.1 / 1 cho biết: "Biểu thức kiểm soát việc đưa vào có điều kiện sẽ là một biểu thức hằng số nguyên ngoại trừ rằng: nó không được chứa một chuỗi; các số nhận dạng (bao gồm cả những từ ngữ giống hệt với từ khóa) được giải thích như mô tả bên dưới;" Mặc dù không được tuyên bố là quyền trực tiếp, điều này rõ ràng là khả năng có một macro "giống hệt từ vựng" với một từ khóa.
Jerry Coffin

2
Ồ và #defines được phép xác định lại từ khóa. C ++ 1x gây ra quá nhiều vấn đề với các từ khóa mới của nó, do đó yêu cầu đó phải được loại bỏ.
Joshua

18

Câu trả lời của Charles Bailey là đúng. Cách diễn đạt chính xác từ tiêu chuẩn C ++ là (§4.7 / 4): "Nếu loại nguồn là bool, giá trị false được chuyển thành 0 và giá trị true được chuyển thành một."

Chỉnh sửa: Tôi thấy anh ấy cũng đã thêm tài liệu tham khảo - Tôi sẽ xóa nó ngay thôi, nếu tôi không bị phân tâm và quên ...

Chỉnh sửa2: Sau đó, một lần nữa, có lẽ đáng chú ý là mặc dù bản thân các giá trị Boolean luôn chuyển đổi thành 0 hoặc một, một số hàm (đặc biệt là từ thư viện chuẩn C) trả về các giá trị "về cơ bản là Boolean", nhưng được biểu diễn dưới dạng ints thông thường chỉ yêu cầu bằng 0 để biểu thị sai hoặc khác 0 để cho biết đúng. Ví dụ, hàm is * trong<ctype.h> chỉ yêu cầu 0 hoặc khác 0, không nhất thiết là 0 hoặc 1.

Nếu bạn truyền giá trị đó thành bool, số 0 sẽ chuyển thành false và khác 0 thành true (như bạn mong đợi).


9

Theo tiêu chuẩn, bạn nên an toàn với giả định đó. Kiểu C ++ boolcó hai giá trị - truefalsevới các giá trị 1 và 0 tương ứng.

Điều cần chú ý là trộn các boolbiểu thức và biến với BOOLbiểu thức và biến. Giá trị thứ hai được định nghĩa là FALSE = 0TRUE != FALSE, điều này khá thường xuyên trong thực tế có nghĩa là bất kỳ giá trị nào khác 0 đều được xem xét TRUE.

Rất nhiều trình biên dịch hiện đại thực sự sẽ đưa ra cảnh báo đối với bất kỳ mã mà ngầm cố gắng cast từ BOOLđể boolnếu BOOLgiá trị là khác nhau hơn 0 hoặc 1.


3

Tôi đã tìm thấy các trình biên dịch khác nhau trả về các kết quả khác nhau trên true. Tôi cũng nhận thấy rằng người ta hầu như luôn tốt hơn nếu so sánh bool với bool thay vì int. Những int đó có xu hướng thay đổi giá trị theo thời gian khi chương trình của bạn phát triển và nếu bạn giả sử đúng là 1, bạn có thể bị ảnh hưởng bởi một thay đổi không liên quan ở nơi khác trong mã của bạn.


3
Đây là một câu trả lời không chính xác cho C ++, cũng như truemột từ khóa ngôn ngữ có hành vi được xác định. Nếu bạn tham chiếu đến một macro thường được xác định chẳng hạn TRUE, thì nó đúng.
David Thornley

1
Có thể là kinh nghiệm của tôi với trình biên dịch C - tôi đã dành nhiều thời gian với chúng trong nhiều năm. Tuy nhiên, quan điểm của tôi về việc sử dụng trực tiếp các biểu thức toán học trong câu lệnh if. Chúng tôi đã có mã để xem nếu một bit shift là khác 0 trong một if, thì ai đó sẽ lấy cùng một giá trị khác 0 đó và giả định nó là 1 và làm nổ tung mọi thứ. Một chuyển đổi đơn giản thành true / 1 sẽ ngăn chặn điều đó.
Michael Dorgan

Tôi cũng đã thấy hành vi của loại này. Phải thừa nhận rằng lần cuối tôi nhìn thấy nó là vào khoảng năm 1999. Tôi đang sử dụng GCC. Ngôn ngữ là C. Tuy nhiên, tôi thực sự đã thấy hành vi như vậy.
thb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.