87 votes

Quel est le but de l'opérateur unaire plus (+) en C ?

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 ?

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.

81voto

Nemo Points 32838

Vous pouvez l'utiliser comme une sorte d'assertion qu'une expression a un type arithmétique :

#define CHECK_ARITHMETIC(x) (+(x))

Cela générera une erreur de compilation si x est évalué à (disons) un pointeur.

C'est à peu près la seule utilisation pratique à laquelle je peux penser.

7 votes

Vous pouvez également convertir une valeur d'énumération en sa valeur entière de cette façon.

0 votes

Assurez-vous de documenter ça, parce que c'est complètement non évident

2 votes

Pourquoi ne pouvez-vous pas faire la même chose avec, par exemple, (-(-(x))) ?

38voto

lccarrasco Points 1443

Conformément à la norme C90, au point 6.3.3.3 :

Le résultat de l'opérateur unaire + est la valeur la valeur de son opérande . La promotion intégrale est effectuée sur l'opérande. et le résultat a le type promu.

et

L'opérande de l'opérateur unaire + ou - doit avoir type arithmétique ..

1 votes

Así que +x est une erreur, sauf si sizeof x < sizeof(int) ?

35 votes

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.

0 votes

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.

37voto

R.. Points 93718

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

0 votes

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

1 votes

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

0 votes

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.

18voto

duskwuff Points 69245

A peu près. Il est surtout présent pour l'exhaustivité, et pour rendre les constructions comme celle-ci un peu plus propres :

int arr[] = {
    +4,
    -1,
    +1,
    -4,
};

2 votes

Pas moyen que ce soit plus propre que l'alternative sans le unaire + s.

15voto

DigitalRoss Points 80400

Ce n'est pas exactement un "no-op".

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

2 votes

Ceci est utile pour imprimer char en C++ avec std::cout .

Prograide.com

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.

Powered by:

X