2016-11-24 13 views
8

Tôi đã viết một chương trình liệt kê lỗi trong một tập hợp các công cụ và trả về giá trị boolean ở cuối (trả về true nghĩa là không tìm thấy lỗi).Bitwise AND với hàm trả về bool trong C++

Dưới đây là một bản tóm tắt của mã của tôi:

bool checkStuff1() {/*...*/} 
bool checkStuff2() {/*...*/} 
// ... 
bool checkStuffN() {/*...*/} 

bool checkAllStuff() 
{ 
    bool result = true; 
    result &= checkStuff1(); 
    result &= checkStuff2(); 
    // ... 
    result &= checkStuffN(); 
    return result; 
} 

Tôi có niềm tin giá trị của result sẽ là một trong những quyền ở cuối. Tuy nhiên, tôi muốn chắc chắn rằng tất cả các chức năng checkStuffX() được gọi (vì chúng in thông báo lỗi khi thất bại, và tôi muốn tất cả các thông báo lỗi được in).

Tôi biết rằng nếu tôi đã viết theo cách này, nó sẽ bỏ qua tất cả checkStuffX() sau khi người đầu tiên thất bại:

result = result && checkStuffX(); // Will not call checkStuffX() if result is already false 

Tôi cũng biết rằng nếu tôi đã viết theo cách này, nó sẽ gọi tất cả checkStuffX() chức năng:

result = checkStuffX() && result; // Will always call checkStuffX() even if result is false 

Nhưng tôi đã tự hỏi liệu hành vi của mã tôi đang sử dụng, với so sánh bitwise, đã được xác định và đảm bảo theo tiêu chuẩn chưa?

Hoặc có rủi ro về hành vi không xác định, tùy thuộc vào trình biên dịch được sử dụng và tối ưu hóa của trình biên dịch không?

+1

Bạn cũng có thể sử dụng 'bool failed = false; không thành công | =! checkStuff1(); không thành công | =! checkStuff2(); ... failed | =! checkStuffN(); return! failed; '. Điều này tuân theo quy tắc đơn giản của (A && B) =! (! A ||! B) –

Trả lời

9

Điều này hoàn toàn ổn.

Đánh giá ngắn mạch, mà bạn đang đề cập đến, chỉ áp dụng cho các toán tử &&||.

+0

Liên quan: http://stackoverflow.com/questions/2488406/why-doesnt-c-have-or-for-booleans –

+0

Có cái gì đó đảm bảo sẽ không có đánh giá ngắn mạch (hoặc tối ưu hóa tương tự) trong mọi trường hợp với toán tử & =? Ý tôi là, X & = Y với X == 0 sẽ luôn kết thúc với X == 0 bất kể giá trị của Y. Tôi muốn chắc chắn rằng, bất kỳ trình biên dịch nào được sử dụng, hành vi sẽ giống nhau ở mọi nơi, và Y() sẽ được gọi nếu nó là một hàm. Có điều gì đó trong các tiêu chuẩn đảm bảo không? – teupoui

+0

Có, nó được đảm bảo bởi định nghĩa của đại số boolean. Nếu tất cả các bit trong một toán hạng là 0, kết quả của toán tử bit và '&' được đảm bảo là 0. –

0

Nó sẽ hoạt động, mặc dù chuyển đổi int < -> bool có thể vấn đề hiệu suất, nếu bạn có nhiều kiểm tra. Oh, bạn có thể tận dụng các con trỏ hàm và vòng lặp, nếu tất cả các hàm đều có cùng kiểu.

bool (*checks[])(void)= {checkStuff1, checkStuff2 ... checkStuffN}; 

bool result = true; 
for (int i = 0; i < sizeof(checks)/sizeof(checks[0]); result = checks[i++]() && result); 

Mã sẽ đơn giản hơn nếu bạn có thể sử dụng dao động cho() - như for(auto i : checks). Lợi thế của điều đó nếu bạn có quy trình đó được khai báo ở nơi khác trong mã, cần phải loại bỏ hoặc thêm một bước, bạn chỉ cần sửa đổi khai báo mảng (hoặc chương trình của bạn có thể thay đổi nó, thay đổi hiệu quả luồng công việc!). Nhược điểm - bạn không thể sử dụng nó với các kiểm tra có các nguyên mẫu khác nhau.

+0

Điều đó sẽ không giúp tôi nhiều trong trường hợp của tôi ...Tôi đã đơn giản hóa câu hỏi của tôi: các chức năng kiểm tra có các tham số khác nhau mỗi lần. Nhưng dù gì cũng cảm ơn ! – teupoui

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