Perché C e C ++ consentono l'espressione (int) + 4 * 5?


86
(int) + 4*5;

Perché è possibile (aggiungere un tipo con un valore) ? (provato con g ++ e gcc.)

So che non ha senso (e non ha effetto), ma voglio sapere perché è possibile.



45
C'è uno strumento utile chiamato cppinsightsche aiuta a capire come appare il codice dal punto di vista del frontend del compilatore. Ha anche una versione online, puoi vedere cosa dice del tuo esempio (la stessa 'parentesi' delle risposte che hai dato)
Nikita Kniazev

22
Questa affermazione è equivalente a +(int)+ 4*5;and -(int)- 4*5;and -+-+-(int)-+-+- 4*5;and meno poeticamente;
chqrlie

16
Quale parte ti lascia perplesso? Per quanto ne so, mi stai chiedendo perché ti è permesso scrivere 5 senza indicare il segno.
Carsten S

5
C ++ non dovrebbe avvisarti che i cast di tipo C non sono raccomandati in C ++?
Mr Lister

Risposte:


141

L' operatore+ here è unario+ , non l' operatore di addizione binaria . Non ci sono aggiunte in corso qui.

Inoltre, la sintassi (int)viene utilizzata per il typecasting.

Puoi rileggere quell'affermazione come

(int) (+ 4) * 5;    

che viene analizzato come

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

che dice,

  1. Applicare l' +operatore unario al valore della costante intera 4.
  2. typecast su un file int
  3. moltiplicare con operando 5

Questo è simile a (int) (- 4) * (5);, dove l'uso dell'operatore unario è più familiare.

Nel tuo caso, l'unario +e il cast to int- entrambi sono ridondanti.


50
"Casting", non "typecasting". Il typecasting è qualcosa che accade agli attori.
Keith Thompson

8
(+ 4)non è creare l'operando+4 , significa applicare l'unario +all'operando 4, che in effetti è un no-op nel caso dell'OP, ma potrebbe causare la promozione dell'intero o il decadimento dell'array in altre circostanze. Ad esempio, char c = 0; sizeof +c == sizeof cè probabilmente falso e sizeof +"a"probabilmente non è 2.
chqrlie

7
"entrambi sono ridondanti" - l'intera cosa è ridondante, proprio come 42;:-)
paxdiablo

11
Non vedo niente di sbagliato nell'usare il termine Type Casting. Sembra che non sia l'unico .
Ben

14
@ Ben Typecasting non è il casting di tipo.
Kenneth K.

40

Questo è interpretato come ((int)(+4)) * 5. Ovvero, un'espressione +4(un operatore più unario applicato a un letterale 4), cast per digitare intcon un cast in stile C e il risultato moltiplicato per 5.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.