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?
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
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;
Quelle est la différence entre les deux?
L'une est une syntaxe correcte, l'autre ne l'est pas.
?:
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;
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.