2010-10-12 21 views
27

napisałem funkcję absolutną stosując operator potrójny następującoreturn w trójskładnikowych operatora C++

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

dostaję następujące komunikaty o błędach

../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 

Jeśli piszę jak ten

return a>=0 ? a : -a; 

Nie otrzymuję żadnego błędu. Jaka jest różnica między tymi dwoma?

Odpowiedz

37

Drugi i trzeci argument operatora trójargumentowego to wyrażenia, a nie wyciągi.

return a 

jest stwierdzenie

+0

Pierwszym argumentem operatora potrójnego jest również wyrazem, oczywiście. Te dwa ostatnie mogą być wyrażeniami typu "void". –

+0

Tak, chodzi o to, że problem z OP dotyczył dwóch ostatnich ... –

5

Zwrot jest instrukcją i nie można go używać tam, gdzie spodziewana jest wartość.

Musisz używać wyrażeń (które zwykle dają wartość) w trzech komponentach operatora trójskładnikowego.

6

?: jest operatorem, który trwa trzy wyrażenia i ocenia je w jakiś sposób do uzyskania rezultatu. return a nie jest wyrażeniem (jest to oświadczenie), więc twój pierwszy formularz nie działa. Jest tak samo, jak nie można umieścić return w argumentach innych operatorów: return a + return b również nie będzie działać.

Jeśli chcesz powraca w odrębnych oddziałów, zamiast używać if:

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

Jaka jest różnica między tymi dwoma?

Jedna to poprawna składnia, a druga nie.

+11

+1 za stwierdzenie oczywistości: D – Vinzenz

23

Twoja składnia jest nieprawidłowa. Należy

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

lub sposób chciałeś to:

return a >=0 ? a : -a;