2011-10-07 27 views
19

Khi tôi viết ví dụ 7>1 trong C (nói C99 nếu đây không phải là một tính năng luôn luôn), tôi có thể mong đợi kết quả sẽ chính xác 1 hoặc chỉ một số giá trị khác không? Điều này có giữ cho tất cả các toán tử bool không?Kết quả "đúng" của>, <,!, &&, || hoặc == được xác định?

+3

Nó rất có thể là một bản sao, nhưng tôi đã không có thể tìm thấy nó :-( – mbq

+3

@TRD: Sai. Biểu thức C '7> 1' cho kết quả của kiểu' int' với giá trị '1'. –

Trả lời

35

Trong C99 §6.5.8 Relational Operators, mục 6 (<, >, <=>=):

Mỗi phòng trong số các nhà khai thác < (ít 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 nếu mối quan hệ xác định là đúng và nếu nó là false) kết quả có kiểu int .

Đối với các nhà khai thác bình đẳng, đó là một chút hơn nữa trong §6.5.9 (==!=):

Các == (bằng) và = (không bằng) khai thác được tương tự cho các toán tử quan hệ ngoại trừ mức ưu tiên thấp hơn) Mỗi ​​toán tử mang lại nếu quan hệ được chỉ định là và nếu sai. Kết quả có loại int. Đối với bất kỳ cặp nào của các toán hạng , chính xác một trong các quan hệ là đúng.

Các logic AND và logic OR Chưa một chút nữa trong §6.5.13 (&&)

Nhà điều hành & & sẽ mang lại nếu cả hai toán hạng của nó so sánh không công bằng 0; nếu không, nó sản lượng . Kết quả có loại int.

... và §6.5.14 (||)

Các || toán tử phải mang lại nếu một trong hai toán hạng của nó so sánh không bằng nhau với 0; nếu không, nó sản lượng . Kết quả có loại int.

Và ngữ nghĩa của các toán tử số học unary ! hơn tại §6.5.3.3/4:

Kết quả của các nhà điều hành phủ định logic! là nếu giá trị toán hạng của nó so sánh không bằng 0, nếu giá trị của toán hạng của nó so với 0. Kết quả có loại int. Biểu thức E tương đương với (0 == E).

Loại kết quả là int trên diện rộng, với 01 giá trị càng tốt. (Trừ khi tôi bỏ lỡ một số.)

+6

Và thuận tiện stdbool.h xác định đúng và sai là 1 và 0 (C99 7.16) – Lundin

+0

Tốt, đặc biệt là vì && và || hoạt động khác nhau trong các ngôn ngữ khác (trả lại giá trị được đánh giá cuối cùng) .Nếu các toán tử chuẩn không liên quan, việc kẹp có thể được thực hiện bằng cách sử dụng '!!' hoặc [truyền tới ' '' bool'] (http://www.jacquesf.com/2011/04/in-defense-of-the-c99-boolean-type/). – Tobu

14

C theo sau Postel's Law cho các toán tử logic của nó: bảo thủ trong những gì bạn làm, được tự do trong những gì bạn chấp nhận từ những người khác. Nó sẽ xử lý bất kỳ giá trị khác không đúng trong các biểu thức boolean, nhưng nó sẽ luôn tạo ra một hoặc 0 hoặc 1 chính nó. 2 != 3 luôn là 1.

+0

+1 để đề cập đến Luật của Postel – glglgl

6

Từ tiêu chuẩn ISO C99, phần 6.5.8:

6 Mỗi phòng trong số các nhà khai thác < (ít hơn),> (lớn hơn), < = (nhỏ hơn hoặc bằng), và > = (lớn hơn hoặc bằng) sẽ thu được 1 nếu quan hệ được chỉ định là đúng và 0 nếu nó sai. Kết quả có loại int.

Từ phần 6.5.9:

3 Các == (bằng) và = (không bằng) khai thác được tương tự như các nhà khai thác quan hệ trừ ưu tiên thấp hơn của họ. Mỗi của các toán tử 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. Đối với bất kỳ cặp toán hạng nào, chính xác một trong các quan hệ là đúng.

Điều tương tự xảy ra với các toán tử logic (&&) và ngắt kết nối (||).

PS: Ngẫu nhiên, đây là lý do tại sao các toán tử bitwise (&|) thường có thể được sử dụng làm phiên bản không ngắn mạch của các toán tử logic.

4

Tất cả C khai thác đó mang lại giá trị logic true/false luôn mang lại một kết quả của loại int với giá trị 0 cho sai sự thật, 1 cho đúng.

Đó không phải là trường hợp cho tất cả các biểu thức C cho giá trị đúng/sai hợp lý. Ví dụ: is*() chức năng phân loại ký tự được khai báo trong <ctype.h> (isdigit(), isupper(), v.v.) trả lại 0 nếu điều kiện là sai, nhưng có thể trả về giá trị khác 0 nếu điều kiện là đúng.

Chừng nào bạn sử dụng kết quả trực tiếp như một điều kiện:

if (isdigit(c)) ... 
if (!isdigit(c)) ... 
if (isdigit(c) || islower(c)) ... 

không nỗ lực để so sánh nó với một cái gì đó:

if (isdigit(c) == 1) ... /* WRONG */ 
if (isdigit(c) == true) ... /* ALSO WRONG */ 

này không nên gây ra bất kỳ vấn đề .

(Bạn thể một cách an toàn so sánh kết quả để 0 hoặc false, nhưng không có lý do chính đáng để làm như vậy, đó là những gì các nhà điều hành ! là cho.)

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