2009-09-08 17 views

Odpowiedz

152

Ponieważ standard C mówi tak, i dostaje jedyny głos.

W konsekwencji:

  • Argument z sizeof może być parenthesised typ sizeof (int) zamiast wyrażenia obiektu.
  • Nawiasy są niepotrzebne: int a; printf("%d\n", sizeof a); jest idealnie w porządku. Często są postrzegane, po pierwsze dlatego, że są potrzebne jako część wyrażenia typu, a po drugie dlatego, że sizeof ma bardzo wysoki priorytet, więc sizeof a + b nie jest tym samym, co sizeof (a+b). Ale nie są częścią inwokacji sizeof, są częścią operandu.
  • Nie można pobrać adresu sizeof.
  • Wyrażenie będące operandem sizeof nie jest oceniane w czasie wykonywania (sizeof a++ nie modyfikuje a).
  • Wyrażenie, które jest operandem sizeof, może mieć dowolny typ z wyjątkiem pustych lub typów funkcji. Rzeczywiście, jest to kwestia wielkości.

Funkcja różni się dla wszystkich tych punktów. Prawdopodobnie istnieją inne różnice między funkcją a operatorem jednoargumentowym, ale uważam, że to wystarcza, aby pokazać, dlaczego sizeof nie może być funkcją, nawet jeśli istnieje powód, aby tego chcieć.

+2

Wow, właśnie o tym myślałem! – crashmstr

+6

Nie mogę tego powiedzieć lepiej. –

+0

niesamowite wyjaśnienie! –

3

Ponieważ nie jest funkcją. Można go używać tak:

int a; 
printf("%d\n", sizeof a); 

Funkcja ma punkt wejścia, kod, itp Funkcja ma być uruchamiany przy starcie (lub inlined), sizeof musi być określona w czasie kompilacji.

20

Może być używana jako stała czasu kompilacji, co jest możliwe tylko wtedy, gdy jest operatorem, a nie funkcją. Na przykład:

union foo { 
    int i; 
    char c[sizeof(int)]; 
}; 

Składniowo gdyby nie operator następnie musiałaby być preprocesora makro ponieważ funkcje nie mogą brać typów jako argumenty. Byłoby to trudne makro do implementacji, ponieważ sizeof może przyjmować zarówno typy, jak i zmienne jako argument.

+2

+1, ale zauważ, że nie jest to stała czasu kompilacji, gdy argumentem jest tablica o zmiennej długości VLA. –

1

Ponieważ:

  • kiedy przekazać wartość do funkcji, rozmiar obiektu nie jest przekazywany do funkcji, a więc „funkcja” sizeof nie miałby sposobu określania wielkości
  • w C funkcje mogą przyjmować tylko jeden typ argumentu; sizeof() musi akceptować różne rodzaje różnych rzeczy (zmiennych i typów! Nie można przekazać typu do funkcji w C)
  • Wywołanie funkcji wymaga sporządzenia kopii argumentów i innego niepotrzebnego obciążenia
0

Występuje mała różnica funkcji - wartość sizeof jest rozwiązywana w czasie kompilacji, ale nie w czasie wykonywania!

+5

Z wyjątkiem VLA - tablica o zmiennej długości - argumenty. –

5

Ponieważ standard C mówi tak, i dostaje jedyny głos.

a średnia prawdopodobnie poprawny, ponieważ sizeof wykonuje rodzaj i

W ogóle, jeśli jedna domena lub codomain (lub obu) w funkcji zawiera elementy znacznie bardziej złożone niż liczb rzeczywistych, które funkcja jest określana jako operator. I odwrotnie, jeśli ani domena, ani kodomena funkcji nie zawierają elementów bardziej skomplikowanych niż liczby rzeczywiste, funkcję tę można nazwać po prostu funkcją. Funkcje trygonometryczne, takie jak cosinus, są przykładami tego ostatniego przypadku.

Dodatkowo, gdy funkcje są używane tak często, że ewoluowały szybciej lub łatwiej niż ogólne zapisy F (x, y, z, ...), powstałe w ten sposób specjalne formularze są również nazywane operatorami. Przykładami mogą być operatory infiksów, takie jak dodawanie "+" i dzielenie "/" oraz operatory przyrostkowe, takie jak silni "!". To użycie nie ma związku ze złożonością zaangażowanych podmiotów.

(Wikipedia)

+0

To prawdopodobnie tłumaczy motywację standardu C (i innych języków programowania) w używaniu terminów "operator" i "funkcja", tak jak oni. –

0

Ponieważ jest operatorem kompilacji, że w celu obliczenia wielkości obiektu, wymaga typu informacji, które są dostępne tylko w czasie kompilacji. Nie dotyczy to C++.

1

Operator sizeof jest jednostką czasu kompilacji, a nie runtime i nie potrzebuje nawiasów jak funkcja. Po skompilowaniu kodu zastępuje on wartość wielkością tej zmiennej w czasie kompilacji, ale w funkcji po wykonaniu funkcji otrzymamy wartość zwracaną.

0

sizeof() operator jest czasem kompilacji. Można go użyć do określenia parametrów lub argumentów.

+0

Dlaczego upadek? –

Powiązane problemy