2013-06-05 36 views
25

Sự hiểu biết của tôi là dấu ngoặc đơn không có sự khác biệt, vì vậy có bất kỳ lý do nào (ngoài việc "cải thiện" mã rõ ràng) mà Clang cảnh báo điều này là mặc định không? Tôi không muốn thêm dấu ngoặc đơn vì tôi không thích thêm mã vì lợi ích của mã.Tại sao Clang cảnh báo: `'&&' trong '||'`?

src/websocket.c:420:43: warning: '&&' within '||' [-Wlogical-op-parentheses] 
     if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) { 
           ~~ ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~ 
src/websocket.c:420:43: note: place parentheses around the '&&' expression to 
     silence this warning 
     if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) { 
           ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~ 
+24

Làm cách nào để thêm mã cho * lợi ích của * clarity? Các dấu ngoặc đơn ở đây sẽ giúp những người không nhớ các quy tắc về quyền ưu tiên của '&&' và '||' (mà không phải tất cả những gì thường xuất hiện). – cHao

+3

Tôi là tất cả để thêm mã để cải thiện độ rõ ràng. Cá nhân tuy nhiên, tôi thấy tiếng ồn trực quan bổ sung của các dấu ngoặc đơn không cần thiết làm giảm độ trong suốt trong trường hợp này. Khi tôi nhìn thấy dấu ngoặc đơn thêm, tôi ngay lập tức quét toàn bộ dòng tìm kiếm lý do cho họ, khi tôi thấy không có gì tôi phải suy nghĩ một lúc nếu tôi đọc sai hoặc nếu mã được đề cập chỉ đơn thuần là cố gắng "giúp đỡ" tôi để hiểu được ưu tiên của nhà điều hành, mà tôi đã biết. Mã này là * chắc chắn * không cho các lập trình viên thiếu kinh nghiệm, hầu hết mọi người đọc nó sẽ ở cấp độ của tôi, và do đó tôi giả định sẽ cảm thấy như vậy. – mxcl

+2

Mặc dù điểm về sự rõ ràng là hợp lệ, nhưng có vẻ lạ khi cảnh báo một mã hoàn toàn hợp pháp theo các quy tắc của ngôn ngữ. –

Trả lời

25

Xu hướng tự nhiên là đọc nó từ trái sang phải và dễ quên điều kiện ưu tiên của toán tử. Điều đó nói rằng, nó chỉ là một cảnh báo, và nếu bạn biết những gì bạn đang làm và phong cách của riêng bạn cho phép nó, cảm thấy tự do để ngăn chặn nó.

+13

Đối với những người muốn ngăn chặn nó, hãy thêm: '-Không hợp lệ-op-dấu ngoặc đơn' vào CFLAGS của hệ thống xây dựng của bạn. – mxcl

20

Tôi đoán vì nó chỉ đơn giản là một chút không rõ ràng, trừ khi người đọc là rất tốt tại C's operator precedence rules.

biểu hiện của bạn là như thế này:

if (A && B || C && D) 

và kể từ && có precendence cao hơn ||, nó có nghĩa là

if ((A && B) || (C && D)) 

mà tôi đoán là những gì bạn có ý nghĩa, nhưng nó không phải là rất rõ ràng khi đọc .

+27

IMHO bất cứ ai nghiên cứu logic cơ bản ít nhất một chút nên nhớ rằng trong toán học, và có ưu tiên cao hơn OR. Tôi nghĩ rằng trình biên dịch là khá hoang tưởng ở đây. (I. e., Điều này chắc chắn không giống với trường hợp 'if (a = 0)'.) –

+12

Hoàn toàn đồng ý - đây là cảnh báo vô dụng nhất mà tôi từng thấy. Tại sao nó cho phép viết 1 + 2 * 3 và không đề xuất thay đổi nó thành 1+ (2 * 3)? –

+6

Có lẽ bởi vì trong thế giới thực, hầu hết các lập trình viên khá chắc chắn những gì '1 + 2 * 3' thực hiện chính xác, trong khi hầu hết chúng không chắc chắn những gì' a && b || c && d' sẽ làm chính xác. – Drax

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