bool để chuyển đổi int


131

Làm thế nào di chuyển là chuyển đổi này. Tôi có thể chắc chắn rằng cả hai khẳng định đều vượt qua?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

Đừng hỏi tại sao. Tôi biết rằng nó là xấu xí. Cảm ơn bạn.


Tại sao bạn không thay đổi biểu thức đầu tiên? Bạn có thể viết assert(x!=0). Ngay cả khi bool (true) chuyển đổi di động sang int (1), các xác nhận "không sai" có biểu thức dễ đọc hơn.
harper

1
Tại sao không: assert( 4 < 5);assert(!( 4 > 5));
Martin York

4
@harper: Sử dụng giá trị bắt buộc của biểu thức so sánh là hoàn toàn hợp lý.
R .. GitHub DỪNG GIÚP ICE

@ R._ Khi câu hỏi là nếu chuyển đổi bool-to-int cho kết quả hợp lý, tôi sẽ không dựa vào điều này. Khi tác giả nghi ngờ rằng yêu cầu này đã được thực hiện đầy đủ, người đọc có thể gặp vấn đề tương tự. Đặc biệt vì giá trị của x không phải là điều kiện để kiểm tra mà chỉ là kết quả trung gian.
harper

3
Tôi có thể sẽ viết (4 < 5) ? 1 : 0nếu tôi thực sự cần chuyển đổi boolean thành 0 hoặc 1. Một trình biên dịch tốt sẽ có khả năng tạo ra cùng một mã máy và nó rõ ràng hơn cho người đọc.
ollb

Câu trả lời:


205
int x = 4<5;

Hoàn toàn di động. Tiêu chuẩn phù hợp. boolđể intchuyển đổi là ngầm!

§4.7 / 4 từ Tiêu chuẩn C ++ cho biết ( Chuyển đổi tích phân )

Nếu loại nguồn là bool, giá trị falseđược chuyển đổi thành 0 và giá trị trueđược chuyển đổi thành một .


Đối với C, theo như tôi biết thì không có boolC. (trước năm 1999) Vì vậy, boolviệc intchuyển đổi chỉ liên quan đến C ++. Trong C, ước tính 4<5giá inttrị, trong trường hợp này giá trị là 1, 4>5 sẽ đánh giá 0.

EDIT: Jens trong bình luận cho biết, C99 có _Boolloại. boollà một macro được định nghĩa trong stdbool.htệp tiêu đề. truefalsecũng được xác định vĩ mô trong stdbool.h.

§7.16 từ C99 nói,

Macro boolmở rộng thành _Bool.

[..] truemở rộng thành hằng số nguyên 1, false mở rộng thành hằng số nguyên 0, [..]


3
chắc chắn rằng có booltrong C từ năm 1999. Chỉ cần sử dụng tiêu đề "stdbool.h" và điều này nên được bao gồm.
Jens Gustyt

1
Thật vậy, tôi đã kiểm tra nó trên một số trình biên dịch và nó dường như là di động.
pic11

8
Bất kể phiên bản của ngôn ngữ C và tính khả dụng của bool/ _Boolloại, các toán tử quan hệ trong C sản xuất int, không bool. Tức là ngay cả trong C99, các nhà khai thác quan hệ vẫn sản xuất int.
AnT

51

Bạn đã gắn thẻ câu hỏi của bạn [C] và [C ++] cùng một lúc. Kết quả sẽ thống nhất giữa các ngôn ngữ, nhưng cấu trúc của câu trả lời là khác nhau đối với mỗi ngôn ngữ này.

Trong ngôn ngữ C, các ví dụ của bạn không liên quan đến boolbất cứ điều gì (cũng áp dụng cho C99). Trong ngôn ngữ C, toán tử quan hệ không tạo ra boolkết quả. Cả hai 4 > 54 < 5là các biểu thức tạo ra kết quả của loại intcó giá trị 0hoặc 1. Vì vậy, không có "bool to int convert" dưới bất kỳ hình thức nào diễn ra trong các ví dụ của bạn trong C.

Trong các toán tử quan hệ C ++ thực sự tạo ra boolkết quả. boolcác giá trị có thể chuyển đổi thành intloại, với truechuyển đổi thành 1falsechuyển đổi thành 0. Điều này được đảm bảo bởi ngôn ngữ.

Ngôn ngữ PS C cũng có một loại boolean chuyên dụng _Bool(có biệt danh là macro bool) và các quy tắc chuyển đổi tách rời của nó về cơ bản giống như trong C ++. Nhưng tuy nhiên điều này không liên quan đến các ví dụ cụ thể của bạn trong C. Một lần nữa, các toán tử quan hệ trong C luôn tạo ra kết quả int(không bool) bất kể phiên bản của đặc tả ngôn ngữ.


2
Đúng vậy, không có bool trong K & R C. Tôi đã gắn thẻ lại câu hỏi của mình là C99.
pic11

@ pic11: Không cần phải thử lại bất cứ điều gì. Nó không liên quan gì đến K & R hay bất kỳ C. Mặc dù booltrong C99, các nhà khai thác quan hệ vẫn sản xuất inttrong C99, nhưng không bool. Vì vậy, nếu đó là các toán tử quan hệ cụ thể mà bạn quan tâm (như trong ví dụ của bạn), vấn đề vẫn không liên quan bool.
AnT

Giờ thì tôi đã hiểu. Kết quả của toán tử quan hệ ngầm chuyển thành int. Điều này đúng trong C, C99 và C ++. Lại nói chuyện một lần nữa.
pic11

3
@ pic11: Không, bạn không hiểu. Trong C, bao gồm C99, kết quả của toán tử so sánh là một int, không phải a bool. Không có chuyển đổi xảy ra.
R .. GitHub DỪNG GIÚP ICE

Có cách nào tuân thủ tiêu chuẩn mà qua đó một ngôn ngữ có thể có một loại hành xử như thế boolnhưng không cho phép lấy địa chỉ của nó không? Nhiều hệ thống nhúng sử dụng các loại như vậy (thường được khai báo bằng cách sử dụng mã định danh bit). Ví dụ, một PIC tầm trung, if (bitVar1) bitVar2=1;sẽ là hai hướng dẫn; mã hóa tối ưu if (byteVar1) byteVar2=1;sẽ có ít nhất bốn (trên nhiều trình biên dịch, có thể là năm). Những loại như vậy có thể cung cấp một tăng hiệu suất lớn.
supercat

17

Mục 6.5.8.6 của tiêu chuẩn C cho biết:

Mỗi toán tử <(nhỏ hơn),> (lớn hơn), <= (nhỏ hơn hoặc bằng) và> = (lớn hơn hoặc bằng) sẽ mang lại 1 nếu quan hệ được chỉ định là đúng và 0 nếu nó là sai.) Kết quả có kiểu int.


Cảm ơn đã tham khảo. Có vẻ như đúng == 1 vì lý do lịch sử.
pic11

2

Dường như không có vấn đề gì vì dàn diễn viên int to bool được thực hiện hoàn toàn. Điều này hoạt động trong trình biên dịch Microsoft Visual C ++, GCC và Intel C ++. Không có vấn đề trong cả C hoặc C ++.


2
"Nó hoạt động trong một số trường hợp" không phải là một cách tốt để kiểm tra tính chính xác, đặc biệt là với các phiên bản không xác định của các công cụ đó. Tôi thích cách tiếp cận trong các câu trả lời khác; họ không thể đảm bảo việc thực hiện cụ thể là đúng, nhưng họ có thể đảm bảo việc triển khai đúng sẽ làm gì.
Matthew Đọc
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.