Dlaczego C i C ++ zezwalają na wyrażenie (int) + 4 * 5?

86
(int) + 4*5;

Dlaczego jest to możliwe (dodanie typu z wartością) ? (próbowano z g ++ i gcc.)

Wiem, że to nie ma sensu (i nie ma wpływu), ale chcę wiedzieć, dlaczego jest to możliwe.

Ernest Bredar
źródło
19
tak samo jak(int)-4*5
P__J wspiera kobiety w Polsce
45
Istnieje przydatne narzędzie o nazwie, cppinsightsktóre pomaga zrozumieć, jak wygląda kod z perspektywy frontendu kompilatora. Ma również wersję online, możesz zobaczyć, co mówi o twoim przykładzie (to samo
``
22
To stwierdzenie jest równoważne +(int)+ 4*5;i -(int)- 4*5;i -+-+-(int)-+-+- 4*5;i mniej poetycko;
chqrlie
16
Jaka część Cię intryguje? Z tego, co wiem, pytasz, dlaczego możesz napisać 5 bez wskazywania znaku.
Carsten S
5
Czy C ++ nie powinien cię ostrzegać, że rzutowanie typu C nie jest zalecane w C ++?
Pan Lister

Odpowiedzi:

141

+Tutaj jest jednoargumentowy +operator , a nie binarny operator dodawania . Tutaj nic się nie dzieje.

Również składnia (int)jest używana do rzutowania typów.

Możesz ponownie przeczytać to oświadczenie jako

(int) (+ 4) * 5;    

który jest analizowany jako

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

który mówi,

  1. Zastosuj jednoargumentowy +operator do stałej wartości całkowitej 4.
  2. typecast do pliku int
  3. pomnóż operandem 5

Jest to podobne do sytuacji (int) (- 4) * (5);, gdy użycie jednoargumentowego operatora jest bardziej znane.

W twoim przypadku jednoargumentowy +i rzut do int- oba są zbędne.

Sourav Ghosh
źródło
50
„Casting”, a nie „Typecasting”. Typowanie to coś, co przydarza się aktorom.
Keith Thompson
8
(+ 4)nie jest operandem+4 , oznacza to zastosowanie unary +do operandu 4, co w rzeczywistości jest brakiem operacji w przypadku OP, ale może spowodować promocję liczby całkowitej lub rozpad tablicy w innych okolicznościach. Na przykład char c = 0; sizeof +c == sizeof cjest prawdopodobnie fałszem i sizeof +"a"prawdopodobnie nie jest 2.
chqrlie
7
"oba są zbędne" - całość jest zbędna, tak jak 42;:-)
paxdiablo
11
Nie widzę nic złego w używaniu terminu rzutowanie typów. Wygląda na to, że nie jestem jedyny .
Ben
14
@Ben Typecasting nie jest rzutowaniem typów.
Kenneth K.
40

Jest to interpretowane jako ((int)(+4)) * 5. Oznacza to, że wyrażenie +4(jednoargumentowy operator plus zastosowany do literału 4), rzutowanie na typ intz rzutowaniem w stylu C i wynik pomnożony przez 5.

Igor Tandetnik
źródło