En C, il est légal d'écrire quelque chose comme :
int foo = +4;
Cependant, pour autant que je sache, le plus unaire ( +
) en +4
n'est pas une option. C'est le cas ?
En C, il est légal d'écrire quelque chose comme :
int foo = +4;
Cependant, pour autant que je sache, le plus unaire ( +
) en +4
n'est pas une option. C'est le cas ?
Vous pouvez également convertir une valeur d'énumération en sa valeur entière de cette façon.
Ces citations de la norme montrent que le + unaire n'est pas simplement un no-op. Il effectue une promotion intégrale sur l'opérande. Et, peut-être plus important encore, il transforme une valeur l en valeur r.
Eh bien, c'est théoriquement possible que sizeof(short) == sizeof(int)
mais un short
a un remplissage, et théoriquement, sur un tel système, le remplissage pourrait devoir être mis à zéro ou le signe étendu. En théorie.
Il y a une utilisation très pratique de l'opérateur unaire plus que je connais : dans les macros. Supposons que vous vouliez faire quelque chose comme
#if FOO > 0
Si FOO
est indéfini, le langage C exige qu'il soit remplacé par 0 dans ce cas. Mais si FOO
a été défini avec une définition vide, la directive ci-dessus entraînera une erreur. A la place, vous pouvez utiliser :
#if FOO+0 > 0
Et maintenant, la directive sera syntaxiquement correcte si FOO
est indéfini, défini comme vide, ou défini comme une valeur entière.
Bien sûr, la question de savoir si cela produira la sémantique souhaitée est totalement différente, mais dans certains cas utiles, ce sera le cas.
Edit : Notez que vous pouvez même l'utiliser pour distinguer les cas de FOO
étant défini comme zéro contre défini comme blanc, comme dans :
#if 2*FOO+1 == 1
/* FOO is 0 */
#else
/* FOO is blank */
#endif
Au fait, je serais intéressé de savoir si quelqu'un a une autre façon de faire les tests que j'ai décrits. Aucune ne m'est venue à l'esprit...
Êtes-vous sûr que ces directives de préprocesseur concernent réellement l'opérateur unaire + tel qu'il est vu en C ? Dans votre deuxième exemple, avec un FOO
l'expression ne serait pas valide C.
Zneak a raison : c'est une astuce sympa, mais techniquement, c'est un exemple de l'opérateur unaire + traité par le préprocesseur C, et non par le compilateur C.
L'unaire +
L'opérateur ne fait qu'une seule chose : il applique les promotions entières . Puisque ces derniers se produiraient de toute façon si l'opérande était utilisé dans une expression, on peut imaginer qu'unary +
est dans C simplement par symétrie avec l'unaire. -
.
Il est difficile de voir cela en action car les promotions sont appliquées de manière très générale.
J'ai trouvé ça :
printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
qui (sur mon Mac) imprime
1
4
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Ce n'est pas exactement la même chose, mais c'est lié : stackoverflow.com/questions/727516/
5 votes
msdn.microsoft.com/fr/us/library/s50et82s.aspx " L'opérateur unaire plus précédant une expression entre parenthèses force le regroupement des opérations incluses. Il est utilisé avec des expressions impliquant plus d'un opérateur binaire associatif ou commutatif. L'opérande doit être de type arithmétique. Le résultat est la valeur de l'opérande. Un opérande intégral subit une promotion intégrale. Le type du résultat est le type de l'opérande promu."
6 votes
K&R dit qu'il a juste été ajouté pour la symétrie dans la norme.
2 votes
@Jeremy : c'est le cas. Par exemple, il est dit que
+short(1)
a un typeint
passhort
.0 votes
Jeremy, à propos de Tim S., vérifie la source. Vous avez entendu celle sur l'avion ? :)
1 votes
@TimS. : " L'opérateur unaire plus qui précède une expression entre parenthèses force le regroupement des opérations incluses. " Oh ? C'est les parenthèses, pas le
+
qui force le regroupement.0 votes
@MSalters :
+short(1)
est une erreur de syntaxe. Pensiez-vous à+(short)1
?0 votes
Bjarne Stroustroup a fourni une explication dans son langage de calculateur dans l'un de ses livres, paraphrasant "quand il y a un moins unaire, quelqu'un essaie toujours de faire un plus unaire, donc il est plus facile de l'implémenter simplement que d'expliquer pourquoi c'est inutile".