Pourquoi C et C ++ autorisent-ils l'expression (int) + 4 * 5?

86
(int) + 4*5;

Pourquoi est-ce possible (ajouter un type avec une valeur) ? (essayé avec g ++ et gcc.)

Je sais que cela n'a pas de sens (et n'a aucun effet), mais je veux savoir pourquoi c'est possible.

Ernest Bredar
la source
19
idem(int)-4*5
P__J soutient les femmes en Pologne
45
Il existe un outil utile appelé cppinsightsqui permet de comprendre à quoi ressemble le code du point de vue du frontend du compilateur. Il a également une version en ligne, vous pouvez voir ce qu'il raconte sur votre exemple (la même `` parenthèse '' que les réponses qui vous ont été données)
Nikita Kniazev
22
Cette déclaration équivaut à +(int)+ 4*5;et -(int)- 4*5;et -+-+-(int)-+-+- 4*5;et moins poétiquement;
chqrlie
16
Quelle partie vous laisse perplexe? Pour autant que je sache, vous demandez pourquoi vous êtes autorisé à écrire 5 sans indiquer le signe.
Carsten S
5
Le C ++ ne devrait-il pas vous avertir que les conversions de type C ne sont pas recommandées en C ++?
Mr Lister

Réponses:

141

L' +ici est un +opérateur unaire , pas l' opérateur d'addition binaire . Aucun ajout ne se produit ici.

En outre, la syntaxe (int)est utilisée pour le typage.

Vous pouvez relire cette déclaration comme

(int) (+ 4) * 5;    

qui est analysé comme

((int) (+ 4)) * (5);    

qui dit,

  1. Appliquez l' +opérateur unaire sur la valeur de constante entière 4.
  2. transtypé en un int
  3. multiplier avec l'opérande 5

Ceci est similaire à (int) (- 4) * (5);, où l'utilisation de l'opérateur unaire est plus familière.

Dans votre cas, l'unaire +et le cast to int- les deux sont redondants.

Sourav Ghosh
la source
50
"Diffusion", pas "diffusion de type". Le typage est quelque chose qui arrive aux acteurs.
Keith Thompson
8
(+ 4)n'est pas faire l'opérande+4 , cela signifie appliquer l'unaire +à l'opérande 4, qui est en effet un no-op dans le cas de l'OP, mais pourrait provoquer une promotion entière ou une décroissance du tableau dans d'autres circonstances. Par exemple, char c = 0; sizeof +c == sizeof cc'est probablement faux et sizeof +"a"probablement pas 2.
chqrlie
7
"les deux sont redondants" - le tout est redondant, tout comme 42;:-)
paxdiablo
11
Je ne vois rien de mal à utiliser le terme Type Casting. Il semble que je ne suis pas le seul .
Ben
14
@Ben Typecasting n'est pas un casting de type.
Kenneth K.
40

Ceci est interprété comme ((int)(+4)) * 5. Autrement dit, une expression +4(un opérateur unaire plus appliqué à un littéral 4), transtypée en type intavec une conversion de style C et le résultat multiplié par 5.

Igor Tandetnik
la source