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.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.