Quel est le but de l’opérateur unaire ‘+’ en C?

En C, il est légal d’écrire quelque chose comme:

int foo = +4; 

Cependant, pour autant que je sache, le + unaire à +4 est un non-op. Est-ce?

Conformément à la norme C90 du 6.3.3.3:

Le résultat de l’opérateur unaire + est 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 un type arithmétique .

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 évalue à (disons) un pointeur.

C’est à peu près le seul usage pratique auquel je puisse penser.

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 n’est pas défini, le langage C doit être remplacé par 0 dans ce cas. Mais si FOO été défini avec une définition vide, la directive ci-dessus entraînera une erreur. Au lieu de cela, 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, le fait que cela produise la sémantique souhaitée est une question tout à fait distincte, mais dans certains cas utiles.

Edit: Notez que vous pouvez même l’utiliser pour distinguer les cas de FOO définis comme zéro et définis comme vides, comme dans:

 #if 2*FOO+1 == 1 /* FOO is 0 */ #else /* FOO is blank */ #endif 

Plutôt. Il est principalement présent pour la complétude, et pour rendre les constructions comme celle-ci un peu plus propres:

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

Pas précisément un no-op

L’opérateur unaire + ne fait qu’une chose: il applique les promotions entières . Comme ceux-ci se produiraient de toute façon si l’opérande était utilisé dans une expression, on imagine que unary + est en C simplement pour la symésortinge avec unary - .

Il est difficile de voir cela en action car les promotions sont si généralement appliquées.

Je suis venu avec ceci:

 printf("%zd\n", sizeof( (char) 'x')); printf("%zd\n", sizeof(+(char) 'x')); 

qui (sur mon Mac) imprime

 1 4 

Quel est le but de l’opérateur unaire ‘+’ en C?

Unary plus a été ajouté à C pour la symésortinge avec unaire moins, de la justification des normes internationales – Langages de programmation – C :

Unary plus a été adopté par le Comité C89 à partir de plusieurs mises en œuvre, pour la symésortinge avec les moins unaires.

et ce n’est pas un no-op, il effectue les promotions d’entier sur son opérande. Citer à partir de ma réponse à Est-ce que l’opérateur Unary + effectue des conversions de type? :

Le projet de norme C99 section 6.5.3.3 Opérateurs arithmétiques 6.5.3.3 dit:

Le résultat de l’opérateur unaire + est la valeur de son opérande (promu). Les promotions d’entier sont effectuées sur l’opérande et le résultat est du type promu.

Il convient de souligner que le Manuel de référence C ++ annoté ( ARM ) fournit le commentaire suivant sur unary plus:

Unary plus est un accident historique et généralement inutile.

J’ai trouvé deux choses que font unaire + opérateur est

  • integer promotion
  • turning lvalue into rvalue

exemple de promotion d’entier:

 #include  int main(void) { char ch; short sh; int i; long l; printf("%d %d %d %d\n",sizeof(ch),sizeof(sh),sizeof(i),sizeof(l)); printf("%d %d %d %d\n",sizeof(+ch),sizeof(+sh),sizeof(+i),sizeof(+l)); return 0; } 

Sortie typique (sur plate-forme 64 bits):

 1 2 4 8 4 4 4 8 

transformer lvalue en exemple de valeur:

 int i=0,j; j=(+i)++; // error lvalue required 

Par «non-op», vous entendez les instructions de assembly?
Si oui, alors certainement pas.

+4 est juste 4 – le compilateur n’appenda aucune instruction supplémentaire.