Dlaczego sizeof jest uważany za operatora?

Dlaczego sizeof jest uważany za operator, a nie za funkcję?

Jaka nieruchomość jest konieczna, aby zakwalifikować się jako operator?

Author: Jonathan Leffler, 2009-09-08

9 answers

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

Jako konsekwencje:

  • operand sizeof może być typem nawiasowym, sizeof (int), zamiast wyrażenia obiektowego.
  • nawiasy są niepotrzebne: int a; printf("%d\n", sizeof a); jest w porządku. Są często widziane, po pierwsze dlatego, że są potrzebne jako część wyrażenia typu cast, 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ą opery.
  • nie możesz przyjąć adresu sizeof.
  • wyrażenie, które jest operandem sizeof, nie jest oceniane w trybie runtime (sizeof a++ nie modyfikuje a).
  • wyrażenie będące operandem sizeof może mieć dowolny typ z wyjątkiem void lub typów funkcji. W rzeczy samej, o to właśnie chodzi.

Funkcja różniłaby się we wszystkich tych punktach. Prawdopodobnie istnieją inne różnice między funkcją a operatorem jednoargumentowym, ale myślę, że to wystarczy, aby pokazać, dlaczego sizeof nie może być funkcją, nawet jeśli był powód, aby tego chcieć.

 161
Author: Steve Jessop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 12:22:19

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, musiałoby to być makro preprocesora, ponieważ funkcje nie mogą przyjmować typów jako argumentów. Byłoby to trudne do zaimplementowania makro, ponieważ {[1] } może przyjmować zarówno typy, jak i zmienne jako argument.

 21
Author: John Kugelman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-08 12:02:23

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

A standard jest chyba poprawny ponieważ sizeof przyjmuje typ i

Ogólnie rzecz biorąc, jeśli dziedzina lub kodomena (lub oba) funkcji zawiera elementy znacznie bardziej złożone niż liczby rzeczywiste, funkcja ta jest określana jako operator. Odwrotnie, jeśli ani dziedzina, ani kodomena funkcji nie zawierają elementów bardziej skomplikowanych niż liczby rzeczywiste, funkcja ta jest prawdopodobna określana po prostu jako funkcja. Funkcje trygonometryczne, takie jak cosinus, są przykładami tego drugiego przypadku.

Dodatkowo, gdy funkcje są używane tak często, że ewoluowały szybciej lub łatwiej niż ogólne F (x, y, z,...) postaci, powstałe formy specjalne nazywane są również operatorami. Przykłady obejmują operatory infiksowe, takie jak dodawanie " + "i dzielenie"/", oraz operatory postfiksowe, takie jak Faktoria"!". Użycie to nie ma związku ze złożonością podmiotów zaangażowany.

(Wikipedia)

 5
Author: Daniel Brückner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-08 12:05:49

Ponieważ to nie jest funkcja. Można go używać w ten sposób:

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

Funkcja posiada punkt wejścia, kod itp. Funkcja ma być uruchomiona w trybie runtime (lub inlined), sizeof musi być określony w czasie kompilacji.

 3
Author: Michał Górny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-08 12:00:55

Ponieważ:

  • kiedy przekazujesz wartość do funkcji, rozmiar obiektu nie jest przekazywany do funkcji, więc sizeof "funkcja" nie ma sposobu na określenie rozmiaru
  • W C, funkcje mogą akceptować tylko jeden typ argumentu; sizeof() musi akceptować różnego rodzaju różne rzeczy (zmienne oraz typy! Nie można przekazać typu do funkcji w C)
  • wywołanie funkcji polega na zrobieniu kopii argumentów i innych niepotrzebnych napowietrznych
 1
Author: Artelius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-08 12:02:39

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

 1
Author: Dewfy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-08 12:02:59

Ponieważ jest to operator czasu kompilacji, który w celu obliczenia rozmiaru obiektu wymaga informacji o typie, które są dostępne tylko w czasie kompilacji. To nie pasuje do C++.

 1
Author: João Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-08 12:08:23

Sizeof operator jest jednostką czasu kompilacji, a nie runtime i nie potrzebuje nawiasu jak funkcja. Gdy kod jest kompilowany, to zastępuje wartość z rozmiarem tej zmiennej w czasie kompilacji, ale w funkcji po wykonaniu funkcji poznamy zwracaną wartość.

 1
Author: Deepak Kumar 'SORTED',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-27 12:11:30

sizeof() operatorem jest czas kompilacji. Może być używany do określania parametrów lub argumentów.

 0
Author: ganesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-06 13:33:06