2011-09-29 44 views
5

Chạy qua một số mã đã sử dụng điều này, điều này khiến tôi ngạc nhiên.C++: So sánh logic như câu lệnh có điều kiện?

if(condition) foo = bar(); 

condition && (foo = bar()); 

Hai đoạn mã này có bằng trình biên dịch không? Nếu không, chúng sẽ khác nhau theo cách nào?

+0

Kỹ thuật như vậy được sử dụng ở đây: [Tìm tối đa ba số trong C mà không sử dụng câu lệnh có điều kiện và toán tử bậc ba] (http://stackoverflow.com/questions/7074010/find-maximum-of-three-number-in- c-without-using-conditional-statement-and-ternary) – Nawaz

+0

Nawaz - Một giải pháp thanh lịch cho bài tập về nhà vô dụng như vậy. : P –

Trả lời

1

Trừ && bị quá tải cho sự kết hợp của các loại conditionfoo họ sẽ có hành vi giống hệt nhau - sau này sẽ làm việc theo cách này:

bool result; 
if(!condition) { 
    result = false; 
} else { 
    foo = bar(); 
    result = foo != 0; 
} 
and result gets ignored 

đó là thường ngắn mạch - nếu thành phần đầu tiên của &&false giây không được đánh giá.

IMO biến thể thứ hai ít dễ đọc hơn.

6

Do điều hành precendence, sau này được giải thích như sau:

(condition && foo) = bar(); 

Bên cạnh đó, có một khả năng && bị quá tải, mà có thể gây ra khá nhiều bất cứ điều gì.

Vì vậy, trong ngắn hạn: chúng không bằng nhau chút nào - ít nhất là trong trường hợp chung.

+0

Ah, đúng vậy! Đó là lỗi của tôi, mặc dù dấu ngoặc đơn hiện diện trong đoạn mã tôi thấy. Đã sửa lỗi câu hỏi –

1

Trừ khi condition && foo đánh giá là lvalue, condition && foo = bar(); là vô nghĩa.

+0

Xin lỗi, tôi đã bỏ quên bao gồm dấu ngoặc đơn, nó đã được sửa chữa. –

0

Có lỗi trình biên dịch: giá trị l không hợp lệ. Để có cùng chức năng, bạn phải sử dụng

conticion ? foo = bar() : <other accion>; 
+0

với mã mới, nó có cùng ý nghĩa –

2

Phiên bản đầu tiên chỉ là một câu lệnh đơn giản.

Phiên bản thứ hai là biểu thức sẽ trả lại kết quả của toàn bộ biểu thức. Điều đó có thể cho phép một số cú pháp một dòng khó hiểu, như thường lệ, có khả năng làm cho mã dễ đọc hơn nhưng có nhiều khả năng làm cho việc phân tích nhanh hơn và khó phân tích nhanh hơn do không quen thuộc.

IMO hoặc sử dụng nó ở mọi nơi một cách nhất quán để người đọc mã của bạn quen với nó hoặc không sử dụng nó.

0

Nếu & & không bị quá tải cho không điều kiện cũng không foo:

condition && (foo = bar()); 

sẽ được coi như

(condition.operator bool()) && (foo = bar()); 

if (condition.operator bool()) là không đúng sự thật, (foo = bar()) sẽ không được thực thi và ngược lại.

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