2012-03-08 32 views
7

Bằng cách thử, tôi đã biết rằng cần phải đặt dấu ngoặc xung quanh toán tử điều kiện trong câu lệnh cout. Dưới đây là một ví dụ nhỏ:Toán tử điều kiện được sử dụng trong câu lệnh cout

#include <iostream> 

int main() { 
    int a = 5; 
    float b = (a!=0) ? 42.0f : -42.0f; 
    // works fine 
    std::cout << b << std::endl; 
    // works also fine 
    std::cout << ((a != 0) ? 42.0f : -42.0f) << std::endl; 
    // does not work fine 
    std::cout << (a != 0) ? 42.0f : -42.0f; 

    return 0; 
} 

Đầu ra là:

42 
42 
1 

Tại sao khung này cần thiết? Kiểu kết quả của toán tử điều kiện được biết trong cả hai trường hợp, phải không?

Trả lời

13

Toán tử ?: có mức ưu tiên thấp hơn so với toán tử <<. Tức là, trình biên dịch diễn giải câu lệnh cuối cùng của bạn là:

(std::cout << (a != 0)) ? 42.0f : -42.0f; 

Đầu tiên sẽ truyền giá trị boolean (a!=0) tới cout. Sau đó, kết quả của biểu thức đó (ví dụ, tham chiếu đến cout) sẽ được đúc thành kiểu thích hợp để sử dụng trong toán tử?: (Cụ thể là void*: xem http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/) và tùy thuộc vào giá trị đó có đúng hay không (ví dụ: không có cờ lỗi nào được đặt), nó sẽ lấy giá trị 42 hoặc giá trị -42. Cuối cùng, nó sẽ ném giá trị đó đi (vì không có gì sử dụng nó).

+0

Chỉ cần lưu ý, 'cout <<' trả về 'cout', không phải bất kỳ điều gì về trạng thái hợp lệ. failbit/badbit sẽ được thiết lập, nhưng '(std :: cout << (a! = 0))' luôn trả về một tham chiếu đến 'std :: cout'. '-42.0f' sẽ không bao giờ được trả về, vì tham chiếu đó luôn luôn nên boolean đánh giá là true. –

+0

cảm ơn, thậm chí không nghĩ về tiền lệ – m47h

+1

@SamDeHaan: vâng. Xin lỗi, tôi có lẽ hơi cẩu thả trong lời giải thích của tôi. Biểu thức "cout << x" trả về cout. Nhưng để biểu thức "cout? A: b" được đánh giá, cout đầu tiên phải được truyền tới một giá trị nào đó là toán hạng hợp lệ cho toán tử?:. Trong trường hợp này, nó là (toán tử void *) thực hiện công việc. Toán tử đó trả về NULL iff một cờ lỗi được thiết lập. Xem:

4

<< có mức độ ưu tiên cao hơn ?.

tập thể dục Fun:

float ftest = std::cout << (a != 0) ? 42.0f : -42.0f; 

Đi mà, Coding Horror !!!

Mã của bạn là tương đương với:

if (std::cout << (a != 0)) 
    42.0f; 
else 
    -42.0f; 

Nó ra 1 vì, tốt, (a != 0) == true;

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