web-dev-qa-db-fra.com

instruction return dans l'opérateur ternaire c ++

J'ai écrit la fonction absolue en utilisant l'opérateur ternaire comme suit

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

Je reçois 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?

32
ameen

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

41

Votre syntaxe est incorrecte. Ça devrait être

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

ou comme vous le vouliez:

return a >=0 ? a : -a;
33
Nandit Tiku

Quelle est la différence entre les deux?

L'une est une syntaxe correcte, l'autre ne l'est pas.

23
Gary Willoughby

?: est un opérateur qui prend trois expressions et les évalue d'une manière ou d'une autre pour produire un résultat. return a n'est pas un expression (c'est un statement), 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 les retours dans les branches séparées, utilisez if à la place:

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

Le retour est une instruction et ne peut pas être utilisé là où une valeur est attendue.

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

7
Jonathan Leffler