Ponieważ C na standardowy integral promotion rules, rodzaj ekspresji c + i
jest int
, więc dlatego dostajesz odpowiednik sizeof (int)
.
Należy zauważyć, że sizeof
nie jest funkcją, nawias jest potrzebny tylko podczas nadawania nazwy typowi and to resolve precendence conflicts. Kod coule być napisane:
printf("%zu, %zu, %zu\n", sizeof i, sizeof c, sizeof (c + i));
Ostateczne wykorzystanie sizeof
ma nawiasów od sizeof
wiąże mocniej niż +
mówiąc sizeof c + i
będzie analizowany jako (sizeof c) + i
który nie jest pożądany rezultat.
Należy również zauważyć, że w większości przypadków jest to konstruowanie w czasie kompilacji, wyrażenie nigdy nie jest faktycznie oceniane. Wszystko, co się dzieje, to to, że kompilator "udaje", aby go ocenić, aby określić typ wyrażenia, a następnie podaje rozmiar wartości tego typu. Rzeczywista wartość nigdy nie musi istnieć, co czasami jest zadowalające.
Typ wartości powrotu sizeof
jest size_t
, który jest wydrukowany za pomocą %zu
(nie jest int
).
'sizeof 'jest konstrukcją czasu kompilacji. –
rozmiar wyniku jest obliczany jako int – BLUEPIXY
Nie wspomniałeś jeszcze, że sizeof (c + c) również da 4, więc będzie sizeof (c/2) lub sizeof (1998) – Kartikya