2010-10-12 19 views
27

j'ai écrit la fonction absolue utilisant l'opérateur ternaire comme suitde retour dans l'opérateur ternaire C++

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

-je obtenir les messages d'erreur suivants

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

Si j'écris comme ça

return a>=0 ? a : -a; 

Je ne reçois aucune erreur. Quelle est la différence entre les deux?

Répondre

37

Les deuxième et troisième arguments de l'opérateur ternaire sont des expressions et non des instructions.

return a 

est une déclaration

+0

Le premier argument de l'opérateur ternaire est aussi une expression, bien sûr. Les deux derniers pourraient être des expressions de type 'void', cependant. –

+0

Oui, c'est juste que le problème de l'OP était avec les deux derniers ... –

5

Le retour est une instruction et ne peut pas être utilisé lorsqu'une valeur est attendue.

Vous devez utiliser des expressions (qui génèrent généralement une valeur) dans les trois composants de l'opérateur ternaire.

6

?: est un opérateur qui prend trois expressions et les évalue en quelque sorte à produire un résultat. return a n'est pas une expression (c'est une instruction), donc votre premier formulaire ne fonctionne pas. C'est la même chose que vous ne pouvez pas mettre return dans les arguments des autres opérateurs: return a + return b ne fonctionnera pas non plus.

Si vous voulez que les rendements dans les branches distinctes, utilisez if à la place:

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

Quelle est la différence entre les deux?

Une syntaxe est correcte, l'autre ne l'est pas.

+11

+1 pour avoir déclaré l'évidence: D – Vinzenz

23

Votre syntaxe est incorrecte. Il devrait être

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

ou la façon dont vous le voulait:

return a >=0 ? a : -a;