Por que C e C ++ permitem a expressão (int) + 4 * 5?

86
(int) + 4*5;

Por que isso (adicionar um tipo com um valor) é possível? (tentei com g ++ e gcc.)

Sei que não faz sentido (e não tem efeito), mas quero saber por que isso é possível.

Ernest Bredar
fonte
19
o mesmo que(int)-4*5
P__J apoia mulheres na Polônia
45
Há uma ferramenta útil chamada cppinsightsque ajuda a entender como o código se parece da perspectiva do front-end do compilador. Também tem uma versão online, você pode ver o que diz sobre o seu exemplo (o mesmo 'parênteses' das respostas que você recebeu)
Nikita Kniazev
22
Esta declaração é equivalente a +(int)+ 4*5;e -(int)- 4*5;e -+-+-(int)-+-+- 4*5;e menos poeticamente;
chqrlie
16
Que parte o intriga? Pelo que sei, você está perguntando por que tem permissão para escrever 5 sem indicar o sinal.
Carsten S
5
O C ++ não deveria avisá-lo de que as conversões do tipo C não são recomendadas em C ++?
Sr. Lister,

Respostas:

141

O operador+ aqui é unário+ , não o operador de adição binária . Não há adição acontecendo aqui.

Além disso, a sintaxe (int)é usada para conversão de tipos.

Você pode reler essa declaração como

(int) (+ 4) * 5;    

que é analisado como

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

que diz,

  1. Aplique o +operador unário no valor da constante inteira 4.
  2. moldado para um int
  3. multiplique com operando 5

Isso é semelhante a (int) (- 4) * (5);, onde o uso do operador unário é mais familiar.

No seu caso, o unário +e o elenco para int- ambos são redundantes.

Sourav Ghosh
fonte
50
"Casting", não "typecasting". Typecasting é algo que acontece aos atores.
Keith Thompson
8
(+ 4)não é fazer o operando+4 , significa aplicar o unário +ao operando 4, o que de fato é um no-op no caso do OP, mas pode causar promoção de inteiro ou decaimento do array em outras circunstâncias. Por exemplo, char c = 0; sizeof +c == sizeof cprovavelmente é falso e sizeof +"a"provavelmente não é 2.
chqrlie
7
"ambos são redundantes" - a coisa toda é redundante, assim como 42;:-)
paxdiablo
11
Não vejo nada de errado em usar o termo Fundição de Tipo. Parece que não sou o único .
Ben
14
@Ben Typecasting não é conversão de tipo.
Kenneth K.
40

Isso é interpretado como ((int)(+4)) * 5. Ou seja, uma expressão +4(um operador de adição unário aplicado a um literal 4), convertido para o tipo intcom um lançamento no estilo C e o resultado multiplicado por 5.

Igor Tandetnik
fonte