2011-08-01 37 views
8

Có toán tử logic & trong C++ không? ví dụ. một toán tử hoạt động giống như & & ngoại trừ việc nó cũng đánh giá các đối số sau ngay cả khi một số đối số trước đó đã được đánh giá là false? Nhà điều hành & là bitwise và toán tử tôi hiểu.C++ hợp lý & toán tử

+6

Tại sao bạn cần điều đó? Đối với tất cả các trường hợp sử dụng tôi có thể tưởng tượng, bạn chỉ nên sửa chữa mớ hỗn độn đó pha trộn các điều kiện hợp lý với các tác dụng phụ bắt buộc. – delnan

+0

@Ziyao Wei - đọc lại :) tại delnan - Tôi đồng ý với bạn. –

+0

@Kiril: Noticed;) –

Trả lời

21

Nhà điều hành & thực sự là toán tử bitwise. Tôi giả sử bạn có một số thông tin như

if (f() && g()) { /*do something*/ } 

và bạn muốn cả hai() và g() thực thi, bất kể một trong số chúng được đánh giá là sai. Thay vào đó, tôi đề nghị bạn nên làm điều gì đó khác:

bool bF = f(); 
bool bG = g(); 

if (bF && bG) { /*do something*/ } 

Điều này cũng cung cấp khả năng đọc tốt hơn và không gây nhầm lẫn cho các lập trình viên khác cố gắng duy trì mã của bạn. Về lâu dài, nó đáng giá.

+1

Đó là cách tốt nhất để làm điều đó. –

+0

Người ta có thể thay đổi 'if (f() && g())' thành 'if ((int) f() + (int) g() == 2)' sẽ buộc cả hai toán hạng phải đánh giá. – Nawaz

+3

Nếu f() và g() trả về int thì sao? nếu f() trả về -1 và g() trả về 1, f() && g() sẽ mang lại giá trị đúng, trong khi điều kiện của bạn mang lại giá trị sai ... –

1

Không hợp lý &, chỉ một chút &.

nếu bạn muốn tránh ngắn mạch các câu lệnh logic, bạn cần sử dụng proxy sẽ không được trình biên dịch tối ưu hóa để đạt được nó (chẳng hạn như mẫu meta variadic).

0

Nếu bạn quá tải toán tử & &, nó sẽ không bị đoản mạch.

struct Bool { 
    bool val; 
    Bool(bool f): val(f) {} 
    operator bool() { 
    return val;  
    } 
}; 


bool operator&&(Bool a, Bool b) { 
    return (bool)a && (bool)b; 
} 

ref: điểm 19, mục 13.9 trong C++ FAQ lite

Mặc dù như đã đề cập ở đó, đây là một ý tưởng rất xấu và lẫn lộn người. Bạn có thể muốn làm điều đó một cách rất hạn chế mặc dù nếu bạn có một trường hợp rất đặc biệt.

+2

Đó là một điều khủng khiếp để làm. –

+0

Tôi sẽ không khuyên bạn nên cho bất cứ ai: D –

+1

Wow. Điều này làm tôi sợ hãi từ tất cả các hiệu ứng phụ sôi nổi mà nó có thể giới thiệu từ tất cả các mã giả định (chính xác) rằng mạch ngắn là bắt buộc. (ví dụ: nếu ((a! = null) && (a.foo = 123)) ...) – Joe

4

Không có toán tử "luôn thực hiện" như vậy trong C++.

Độ nghiêng đầu tiên của tôi là thay vì tìm kiếm toán tử mới, bạn nên đánh giá lại phương pháp của mình để loại bỏ bất kỳ tác dụng phụ nào bắt buộc phải thực thi. Nó có thể có thể theo cách này chỉ đơn giản là có thể sử dụng && và được hạnh phúc.

Tuy nhiên, nếu bạn thực sự muốn thực hiện tất cả các thao tác theo trình tự và sau đó xem tất cả chúng có thành công hay không, có lẽ câu trả lời của Luchian Grigore sẽ là tốt nhất. Nó phân định rõ ràng rằng đó là các bước tuần tự luôn cần thực thi. Có một tùy chọn khác có thể hoặc không thể rõ ràng hơn:

// Each method needs to execute in sequence but we use "success" to track overall success. The order of operands to `operator&&` shouldn't be changed. 
bool success = f1(); 
success = f2() && success; 
success = f3() && success; 

if(success) ... 
+1

+1 Kỹ thuật hữu ích để tìm hiểu. Mặc dù tôi luôn bắt đầu với 'bool success = true;' Bằng cách đó tất cả các đánh giá có điều kiện đều giống nhau. –

+0

Tôi sử dụng 'success & = f2();' – MSalters