¿Por qué C y C ++ permiten la expresión (int) + 4 * 5?

86
(int) + 4*5;

¿Por qué es posible esto (agregar un tipo con un valor) ? (probado con g ++ y gcc.)

Sé que no tiene sentido (y no tiene ningún efecto), pero quiero saber por qué esto es posible.

Ernest Bredar
fuente
19
Igual que(int)-4*5
P__J apoya a las mujeres en Polonia
45
Existe una herramienta útil llamada cppinsightsque ayuda a comprender cómo se ve el código desde la perspectiva del frontend del compilador. También tiene una versión en línea, puede ver lo que dice sobre su ejemplo (el mismo 'paréntesis' que las respuestas que le dieron)
Nikita Kniazev
22
Esta afirmación es equivalente a +(int)+ 4*5;y -(int)- 4*5;y -+-+-(int)-+-+- 4*5;y menos poéticamente;
chqrlie
16
¿Qué parte te desconcierta? Por lo que sé, se pregunta por qué se le permite escribir 5 sin indicar el signo.
Carsten S
5
¿No debería C ++ advertirle que las conversiones de tipo C no se recomiendan en C ++?
Mr Lister

Respuestas:

141

El +aquí es unario +operador , no el operador de suma binaria . No hay nada más sucediendo aquí.

Además, la sintaxis (int)se utiliza para encasillamiento.

Puede volver a leer esa declaración como

(int) (+ 4) * 5;    

que se analiza como

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

que dice,

  1. Aplique el +operador unario en el valor constante entero 4.
  2. encasillado a un int
  3. multiplicar con operando 5

Esto es similar a (int) (- 4) * (5);, donde el uso del operador unario es más familiar.

En su caso, el unario +y el elenco int, ambos son redundantes.

Sourav Ghosh
fuente
50
"Casting", no "encasillado". El encasillado es algo que les sucede a los actores.
Keith Thompson
8
(+ 4)no es hacer el operando+4 , significa aplicar el unario +al operando 4, que de hecho no es una operación en el caso del OP, pero podría causar promoción de enteros o decaimiento de matriz en otras circunstancias. Por ejemplo, char c = 0; sizeof +c == sizeof cprobablemente sea falso y sizeof +"a"probablemente no sea 2.
chqrlie
7
"ambos son redundantes" - todo es redundante, como 42;:-)
paxdiablo
11
No veo nada de malo en usar el término Type Casting. Parece que no soy el único .
Ben
14
@Ben Typecasting no es un tipo de casting.
Kenneth K.
40

Esto se interpreta como ((int)(+4)) * 5. Es decir, una expresión +4(un operador unario más aplicado a un literal 4), convertido a tipo intcon un estilo C y el resultado multiplicado por 5.

Igor Tandetnik
fuente