2015-12-02 14 views
8

Giả sử tôi có hai biểu thức bên trái/bên phải của toán tử ||. Tôi thấy nếu biểu thức trái là đúng, toán tử bên phải sẽ không bao giờ được gọi. Ví dụ: trong mã bên dưới của tôi, khi getRand trả về true, tôi thấy Foo sẽ không bao giờ được gọi. Tôi đã thử nghiệm trên XCode trên Mac OSX, và tự hỏi nếu nó là một tính năng đáng tin cậy của C++, chúng ta có thể dựa vào - nếu phần còn lại của || là đúng, phần bên phải sẽ không bao giờ được gọi, hoặc nó là một tính năng đặc biệt chỉ dành cho nền tảng cụ thể (ví dụ: OSX với XCode)? Đăng mã của tôi dưới đây, cảm ơn.nhầm lẫn bởi C++ toán tử OR (||) logic

bool Foo() 
{ 
    std::cout << "I am called!\n"; 
    return false; 
} 

bool getRand() 
{ 
    int random_variable = std::rand(); 
    std::cout << random_variable << '\n'; 

    return random_variable % 2 == 1; 
} 

int main(int argc, const char * argv[]) { 

    if (getRand() || Foo()) 
    { 
     std::cout<<"Hello World \n"; 
    } 

    return 0; 
} 

cảm ơn trước, Lin

+2

'tự hỏi nếu nó là một tính năng đáng tin cậy của C++, chúng tôi có thể dựa vào 'Có, đúng vậy. – Matt

+2

&& cũng có đánh giá ngắn mạch, nếu đối số đầu tiên là sai – sp2danny

+2

Đánh giá ngắn mạch là một tính năng đáng tin cậy _most của time_. Nó sẽ không hoạt động nếu kiểu được sử dụng có toán tử && overload. Các kiểu nguyên thủy như 'bool' là an toàn. – kolrabi

Trả lời

10

Vâng, đó là một tính năng được bảo đảm gọi short circuit evaluation.

Tương tự, biểu thức false && expression sẽ không bao giờ đánh giá đúng biểu thức.

+0

Cảm ơn wallyk! Đánh dấu là đã trả lời. :) –

8

tự hỏi đây có phải là tính năng đáng tin cậy của C++ mà chúng tôi có thể dựa vào - nếu phần còn lại của || là đúng, phần bên phải sẽ không bao giờ được gọi?

Có, đối với nhà điều hành nội tuyến.

Từ tiêu chuẩn, $ 5.15/1 logic OR [expr.log.or] (đậm bởi tôi)

Các || nhóm nhà điều hành từ trái sang phải. Các toán hạng đều là được chuyển đổi theo ngữ cảnh thành bool (Điều 4). Nó trả về true nếu các toán hạng của nó là đúng, và ngược lại sai. Không giống | | || đảm bảo đánh giá từ trái sang phải; hơn nữa, toán hạng thứ hai không phải là được đánh giá nếu toán hạng đầu tiên ước tính là đúng.

Và lưu ý rằng quá tải operator|| sẽ mất thuộc tính đặc biệt này.

Logical operators (đậm bởi tôi)

Built-in khai thác & & và || thực hiện đánh giá ngắn mạch (không đánh giá toán hạng thứ hai nếu kết quả được biết sau khi đánh giá đầu tiên), nhưng toán tử quá tải hoạt động như chức năng thông thường cuộc gọi và luôn đánh giá cả hai toán hạng.

+0

Cảm ơn songyuanyao, trả lời tuyệt vời. Bỏ phiếu lên. :) –

1

Vì lựa chọn này hay lựa chọn khác không cần đánh giá phần thứ hai, không phụ thuộc nền tảng là tính năng ngôn ngữ.

+1

Cảm ơn Daniel, trả lời tuyệt vời. Bỏ phiếu lên. :) –