2010-10-12 37 views
27

tôi đã viết các chức năng tuyệt đối sử dụng nhà điều hành ternary như sautuyên bố trở lại trong ternary nhà điều hành C++

int abs(int a) { 
a >=0 ? return a : return -a; 
} 

tôi nhận được thông báo lỗi sau

../src/templates.cpp: In function ‘int abs(int)’: 
../src/templates.cpp:4: error: expected primary-expression before ‘return’ 
../src/templates.cpp:4: error: expected ‘:’ before ‘return’ 
../src/templates.cpp:4: error: expected primary-expression before ‘return’ 
../src/templates.cpp:4: error: expected ‘;’ before ‘return’ 
../src/templates.cpp:4: error: expected primary-expression before ‘:’ token 
../src/templates.cpp:4: error: expected ‘;’ before ‘:’ token 
../src/templates.cpp:5: warning: no return statement in function returning non-void 

Nếu tôi viết như thế này

return a>=0 ? a : -a; 

Tôi không nhận được bất kỳ lỗi nào. Sự khác biệt giữa hai yếu tố này là gì?

Trả lời

37

Đối số thứ hai và thứ ba cho toán tử bậc ba là các biểu thức, không phải là câu lệnh.

return a 

là một tuyên bố

+0

Đối số đầu tiên để các nhà điều hành ternary cũng là một biểu hiện, tất nhiên. Tuy nhiên, hai cái sau có thể là biểu thức của kiểu 'void'. –

+0

Vâng, nó chỉ là vấn đề của OP là với hai cuối cùng ... –

5

Trả lại là một tuyên bố và không thể được sử dụng khi có giá trị.

Bạn phải sử dụng các biểu thức (thường mang lại giá trị) trong ba thành phần của toán tử bậc ba.

6

?: là một nhà điều hành mà mất ba biểu thức và đánh giá chúng trong một số cách để tạo ra một kết quả. return a không phải là biểu thức (đó là câu hỏi ), do đó biểu mẫu đầu tiên của bạn không hoạt động. Nó giống như bạn không thể đặt return trong các đối số của các toán tử khác: return a + return b cũng sẽ không hoạt động.

Nếu bạn muốn trở về trong các ngành riêng biệt, sử dụng if thay vì:

if (a >=0) 
    return a; 
else 
    return -a; 
22

sự khác biệt giữa hai là gì?

Một cú pháp đúng, phương pháp kia không đúng.

+11

+1 để nói rõ ràng: D – Vinzenz

23

Cú pháp của bạn không chính xác. Nó phải là

if (a >=0) 
    return a; 
else 
    return -a; 

hoặc theo cách bạn muốn nó:

return a >=0 ? a : -a; 
Các vấn đề liên quan