2011-07-07 26 views
6

Tôi đã gặp lỗi biên dịch lạ khi sử dụng toán tử điều kiện.Toán tử điều kiện khác trong C++ làm gì cho tôi?

a,b là giá trị int và biểu thức sau đây nhận được lỗi biên dịch.

(a>b)?(std::cout << a) : (b=MAX); 
16 (b <unknown operator> 5)' 

(a>b)?(a=MAX) : (std::cout<<b); 
16 (&std::cout)->std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](b)' 

Nhưng biểu hiện này hoạt động tốt, đó là số lẻ ..

(a>b)?(std::cout << a) : (std::cout<<b); 

Tôi không có ý tưởng những gì làm cho một sự khác biệt như vậy, và không biết tại sao những lỗi biên dịch đứng cho. Dưới đây là thông tin gcc của tôi:

Reading specs from ./../lib/gcc/mingw32/3.4.2/specs 
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host= 
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable 
-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --e 
nable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-ja 
va-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchroniz 
ation --enable-libstdcxx-debug 
Thread model: win32 
gcc version 3.4.2 (mingw-special)` 
+1

Đặt câu lệnh có hiệu ứng phụ trong biểu thức điều kiện có vẻ khá xấu. Tại sao không sử dụng câu lệnh if truyền thống? –

+0

@Johannes: Tôi đã gắn cờ nhận xét của bạn là không có cấu trúc. Tại sao không phải là một bình luận giải thích tại sao bạn không thích câu hỏi quá nhiều, thay vì chỉ đơn giản là thô lỗ? –

+0

@Brennan Tôi nghĩ rằng người hỏi biết rất rõ. Tôi đã cố sửa nó bằng cách chỉnh sửa nó, nhưng nó không thể hiểu được. Tôi đã không bao giờ nhìn thấy một 16 được gọi là một chức năng, và không bao giờ nhìn thấy một được sử dụng trong C + + (và đó không phải là một chẩn đoán GCC hoặc). Nếu bạn không định dạng câu hỏi của mình đúng cách, đang ở chế độ SE trong hơn một năm, bạn cần phải nêu rõ câu hỏi đó ở định dạng cho phép người khác định dạng câu hỏi đó. Đó là lý do tại sao tôi -1'ed. Tôi đã xóa nhận xét khác của mình vì tôi thấy thực tế là không hữu ích. –

Trả lời

14

Toán tử điều kiện phải luôn luôn trả về cùng một loại. Trong ví dụ đầu tiên của bạn,

(a > b) ? (std::cout << a) : (b = MAX); 

chi nhánh đầu tiên mang kiểu std::ostream và chi nhánh thứ hai mang kiểu b (đó là khả năng một số nguyên, do bối cảnh của nó). Ví dụ thứ hai của bạn,

(a > b) ? (std::cout << a) : (std::cout << b); 

không có vấn đề như vậy vì cả hai nhánh trở về cùng loại, std::ostream. Trong cả hai trường hợp, nó có thể sẽ sạch hơn để xử lý các điều kiện này với tuyên bố đơn giản if - else. Các nhà điều hành có điều kiện có xu hướng làm tổn thương khả năng đọc và thường chỉ hữu ích khi có điều kiện gán cho một biến:

int a = (a > b) ? a : b; 
std::cout << a; 
+5

Chỉ cần một nit (vì trên toàn cầu, câu trả lời của bạn được thể hiện tốt hơn so với tôi), nhưng các quy tắc cho các loại 'b' và' c' trong 'a? b: c' phức tạp hơn một chút. Về cơ bản, trình biên dịch phải có khả năng chuyển đổi một trong các kiểu này sang kiểu khác.Vì vậy, bạn có thể có 'long' và' int', hoặc 'Base *' và 'Derived *' (nhưng không phải 'Derived1 *' và 'Derived2 *'). Ngoài ra, một trong các biểu thức có thể là biểu thức 'throw', trong trường hợp này, loại biểu thức là loại khác. –

+0

Thực tế, 'void * p = 0; (a> b)? (std :: cout << a): (p = malloc (1)); 'sẽ là hoàn toàn tốt đẹp, ví dụ. –

+6

Một cách khác để khắc phục điều này là sử dụng toán tử dấu phẩy: '(a> b)? ((std :: cout << a), a): (b = MAX); 'Điều này có thêm lợi ích khi làm cho mã càng mơ hồ hơn. ;) –

4

các ?: là toán tử trong một biểu thức (hoặc sub-expression). Biểu thức có loại. Loại (a > b) ? (std::cout << a) : (b = MAX) là gì. Các loại trong C++ được đánh giá tĩnh, và không có cách nào trình biên dịch có thể xác định loại chung cho std::cout << a (loại std::ostream&) và b = MAX (loại int).

+0

Có, khóa ở đây là phần _ "Biểu thức có loại" _. –

2

Nhà điều hành điều kiện khác trong C++ làm gì cho tôi?

Vâng, nó khớp loại đối số thứ hai và thứ ba, và điều đó có thể khá hữu ích như một cách để trích xuất các loại từ biểu thức. Để biết thêm thông tin về cách sử dụng tính năng đó của toán tử có điều kiện, hãy đọc here

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