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.

Ernest Bredar
quelle
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.

Sourav Ghosh
quelle
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.

Igor Tandetnik
quelle