Warum erlauben C und C ++ den Ausdruck (int) + 4 * 5?


86
(int) + 4*5;

Warum ist dies möglich (Hinzufügen eines Typs mit einem Wert) ? (versucht mit g ++ und gcc.)

Ich weiß, dass es keinen Sinn ergibt (und keine Wirkung hat), aber ich möchte wissen, warum dies möglich ist.


19
das gleiche wie(int)-4*5
P__J__

45
Es gibt ein nützliches Tool namens cppinsights, das hilft zu verstehen, wie der Code aus der Perspektive des Compiler-Frontends aussieht. Es hat auch eine Online-Version, Sie können sehen, was es über Ihr Beispiel sagt (die gleiche "Klammerung" wie die Antworten, die Sie gegeben haben)
Nikita Kniazev

22
Diese Aussage ist äquivalent zu +(int)+ 4*5;und -(int)- 4*5;und -+-+-(int)-+-+- 4*5;und weniger poetisch;
chqrlie

16
Welcher Teil verwirrt dich? Nach allem, was ich weiß, fragen Sie, warum Sie 5 schreiben dürfen, ohne das Zeichen anzugeben.
Carsten S

5
Sollte C ++ Sie nicht warnen, dass C-Typ-Casts in C ++ nicht empfohlen werden?
Herr Lister

Antworten:


141

Der +hier ist ein unärer +Operator , nicht der binäre Additionsoperator . Hier passiert nichts.

Die Syntax (int)wird auch für die Typumwandlung verwendet.

Sie können diese Anweisung als erneut lesen

(int) (+ 4) * 5;    

welches als analysiert wird

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

was sagt,

  1. Wenden Sie den unären +Operator auf den ganzzahligen Konstantenwert an 4.
  2. typografiert zu einem int
  3. Mit Operand multiplizieren 5

Dies ist ähnlich wie dort (int) (- 4) * (5);, wo die Verwendung des unären Operators vertrauter ist.

In Ihrem Fall sind Unary +und Cast to int- beide überflüssig.


50
"Casting", nicht "Typecasting". Typografie passiert Schauspielern.
Keith Thompson

8
(+ 4)nicht die Operanden machen+4 , gelten sie Mittel die unären +zu Operanden 4, die in der Tat ein no-op im Fall des OP ist, könnten aber integer Förderung oder Array Zerfall in anderen Umständen verursachen. Zum Beispiel char c = 0; sizeof +c == sizeof cist wahrscheinlich falsch und sizeof +"a"ist wahrscheinlich nicht 2.
chqrlie

7
"beide sind überflüssig" - das Ganze ist überflüssig, genau wie 42;:-)
paxdiablo

11
Ich sehe nichts falsches daran, den Begriff Type Casting zu verwenden. Es scheint, ich bin nicht der einzige .
Ben

14
@Ben Typecasting ist kein Typ Casting.
Kenneth K.

40

Dies wird interpretiert als ((int)(+4)) * 5. Das heißt, ein Ausdruck +4(ein unärer Plus-Operator, der auf ein Literal angewendet wird 4), der in inteinen C-Stil umgewandelt und das Ergebnis mit multipliziert wird 5.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.