2012-01-26 23 views
7

tôi stumbled khi việc xây dựng sau trong C++:Điều Hành | = cho một boolean trong C++

bool result = false; 
for(int i = 0; i<n; i++){ 
    result |= TryAndDoSomething(i); 
} 

Tôi cho rằng |= đây là một phím tắt cho các toán tử OR, và rằng result sẽ bằng true vào cuối nếu ít nhất một trong các cuộc gọi này đến TryAndDoSomething đã trả lại true.

Nhưng bây giờ tôi tự hỏi nếu có nhiều hơn một cuộc gọi thực sự có thể trở lại true. Thật vậy, nếu chúng ta mở rộng các hoạt động như:

result = result || TryAndDoSomething(i); 

Sau đó, phương pháp này sẽ được gọi là chỉ khi trở lại đánh giá để false, đó là, nếu không có cuộc gọi khác trước khi trở true. Do đó, sau khi một cuộc gọi trở về true, sẽ không có cuộc gọi nào khác được thực hiện.

Đây có phải là cách giải thích đúng không?

+1

Bạn có thể kiểm tra dễ dàng. Tôi đã làm, và có vẻ như tất cả các cuộc gọi được thực hiện, không chỉ là các cuộc gọi đầu tiên. –

Trả lời

7

Trên các phép toán, | cho kết quả tương tự như ||, nhưng không ngắn mạch. Toán hạng bên phải của |= luôn được đánh giá.

+0

@MooingDuck: Câu hỏi này chỉ hỏi về booleans. Tôi không biết OP có biết về bitwise-OR hay không, và nó không có vẻ quan trọng đối với những gì anh ta đang làm. –

+0

Id sẽ vui hơn với câu trả lời nếu bạn nói chúng khác nhau như thế nào với các boolean vì OP rõ ràng không biết về bitwise hoặc (sửa lỗi đánh máy) –

13

Đó là phân bổ bitwise OR, không phải là đánh giá HOẶC được đoản mạch. Nó tương đương với:

result = result | TryAndDoSomething(i); 

không

result = result || TryAndDoSomething(i); 
2

Sự khác biệt duy nhất trong bối cảnh này giữa x |= f() (bitwise OR) và x = x || f() (logic OR) là sau này là chập điện. Trước đây, f() sẽ được thực thi n lần — trừ khi tất nhiên f() ném ngoại lệ, nhưng đó là một câu chuyện khác.

Trong phiên bản ||, f() sẽ không còn được gọi sau khi x trở thành true. C++ không có toán tử ||=, nhưng điều quan trọng là phải hiểu rằng |=||= (nếu nó tồn tại) sẽ có ngữ nghĩa khác nhau vì điều này. |= không chỉ là sự thay thế cho số thiếu ||=.

Như một mặt lưu ý, miễn là bạn đang sử dụng bool, hoạt động Bitwise là an toàn, bởi vì tiêu chuẩn quy định rằng truefalse chuyển sang số nguyên 10, tương ứng. Vì vậy, sự khác biệt duy nhất trong trường hợp này là háo hức so với đánh giá lười biếng.

+0

@MooingDuck: True. Đã chỉnh sửa để hạn chế ngữ cảnh của OP. –

+0

Tất cả những gì bạn phải nói với anh ấy là cách giải thích của anh ấy không hợp lệ. | = là bitwise HOẶC như bạn chỉ ra. Vì vậy x | = 1 giống như x = x | 1. X || = 1; sẽ không biên dịch. –

+0

@Ramhound: Đọc lại câu hỏi. –

0

result |= Try() viết tắt là result = result | Try();. Toán tử || bạn có vẻ hiểu, nhưng toán tử | thì hoàn toàn khác. Tên của nó là bitwise hoặc (trái ngược với logic hoặc). Nó có ảnh hưởng tương tự như khi nó thực hiện a=a||b trên mỗi bit của toán hạng và không có điều tiết kiệm nhanh hợp lý và/hoặc có. (Nó cũng là điên nhanh; nhanh hoặc nhanh hơn so với bổ sung). Các hoạt động bitwise khác là & (bitwise và: a=a&&b trên mỗi bit) và ^ (bitwise xor: a=(a!=b) trên mỗi bit).

+0

@BenVoigt: Sao chép-dán FTL! Cảm ơn! Fix'd. –