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?
Trả lời
Trong C99 §6.5.8 Relational Operators, mục 6 (<
, >
, <=
và >=
):
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 (==
và !=
):
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 0
và 1
giá trị càng tốt. (Trừ khi tôi bỏ lỡ một số.)
Và thuận tiện stdbool.h xác định đúng và sai là 1 và 0 (C99 7.16) – Lundin
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 '
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
.
+1 để đề cập đến Luật của Postel – glglgl
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 (&
và |
) 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.
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)) ...
và 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.)
- 1. python NameError: name '<anything>' không được xác định (nhưng đúng vậy!)
- 2. Không có kết quả xác định cho các hành động và kết quả đầu vào
- 3. PageMethods trả về kết quả không xác định?
- 4. BaseGameUtils Lỗi không xác định, onConnectionFailed: kết quả 4
- 5. Xác định xem ASP.Net có được đăng ký đúng cách
- 6. HTML - Tại sao không xác định = "không xác định | đúng" được tôn trọng?
- 7. Double.Parse không cho kết quả chính xác
- 8. Hành vi của một biểu thức: Được xác định hoặc Không xác định?
- 9. Kết quả không đúng arrow (góc) để định vị địa lý
- 10. anh chị em jquery không trả lại kết quả đúng?
- 11. (ColdFusion) So sánh hai ngày, sử dụng kết quả để xác định nội dung hiển thị
- 12. Lưu trữ Danh sách <String> với XStream với những cái tên được xác định
- 13. Cách truy cập đúng các kết quả truy vấn được tạo trong chuỗi nền?
- 14. Kết quả của truy vấn LINQ luôn được đảm bảo theo đúng thứ tự?
- 15. Bạn có thể xác định <=> trong Ruby và sau đó có ==,>, <, > = và <= được xác định tự động không?
- 16. JavaScript - Xác định liệu một tài sản được xác định và thiết lập để 'undefined', hoặc không xác định
- 17. hộp kiểm nhập đúng hoặc được chọn hoặc có
- 18. kết quả xét nghiệm VHDL vào JUnit (hoặc khác Jenkins công nhận) định dạng
- 19. Kết quả Java khác nhau đối với (int) Math.pow (2, x) và 1 << x
- 20. Giá trị hoặc hàm tạo không được xác định
- 21. ISODate không được xác định
- 22. Nhiều kết quả chính xác với Hamcrest (có hoặc không khớp?)
- 23. Android WebView: Xác định <a> target = "_ blank"
- 24. rails tìm kiếm giới hạn tổng số kết quả tìm kiếm/nhận được số kết quả cố định
- 25. defaultdict không được xác định
- 26. Làm thế nào để xác định vị trí của hàng trong tập kết quả sql?
- 27. Truy vấn LINQ trả về kết quả không chính xác
- 28. Xác định xem một IQueryable <T> đã được đặt hàng hay không
- 29. Làm thế nào để bạn xác định thứ tự kết quả nút bằng XPath?
- 30. Xác định loại được xác định
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
@TRD: Sai. Biểu thức C '7> 1' cho kết quả của kiểu' int' với giá trị '1'. –