Dlaczego sizeof
jest uważany za operatora, a nie funkcję?Dlaczego sizeof jest operatorem?
Jaka właściwość jest niezbędna do zakwalifikowania się jako operator?
Dlaczego sizeof
jest uważany za operatora, a nie funkcję?Dlaczego sizeof jest operatorem?
Jaka właściwość jest niezbędna do zakwalifikowania się jako operator?
Ponieważ standard C mówi tak, i dostaje jedyny głos.
W konsekwencji:
sizeof (int)
zamiast wyrażenia obiektu.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.sizeof a++
nie modyfikuje a).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ć.
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.
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.
+1, ale zauważ, że nie jest to stała czasu kompilacji, gdy argumentem jest tablica o zmiennej długości VLA. –
Ponieważ:
sizeof
nie miałby sposobu określania wielkościWystępuje mała różnica funkcji - wartość sizeof jest rozwiązywana w czasie kompilacji, ale nie w czasie wykonywania!
Z wyjątkiem VLA - tablica o zmiennej długości - argumenty. –
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.
To prawdopodobnie tłumaczy motywację standardu C (i innych języków programowania) w używaniu terminów "operator" i "funkcja", tak jak oni. –
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++.
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ą.
sizeof()
operator jest czasem kompilacji. Można go użyć do określenia parametrów lub argumentów.
Dlaczego upadek? –
Wow, właśnie o tym myślałem! – crashmstr
Nie mogę tego powiedzieć lepiej. –
niesamowite wyjaśnienie! –