Dlaczego sizeof int jest zły, podczas gdy sizeof (int) ma rację?

Wiemy, że sizeof jest operatorem używanym do obliczania wielkości dowolnego typu danych i wyrażenia, a gdy operand jest wyrażeniem, nawiasy można pominąć.

int main()
{
        int a;

        sizeof int;
        sizeof( int );
        sizeof a;
        sizeof( a );

        return 0;
}

Pierwsze użycie sizeof jest złe, podczas gdy inne mają rację.

Gdy zostanie skompilowana przy użyciu gcc, zostanie wyświetlony następujący komunikat o błędzie:

main.c:5:9: error: expected expression before ‘int’

Moje pytanie brzmi, dlaczego standard C nie pozwala na tego rodzaju operacje. Czy sizeof int spowoduje jakieś niejasności?

 92
Author: Yishu Fang, 2012-10-29

3 answers

Następujące mogą być niejednoznaczne:

sizeof int * + 1

To (sizeof (int*)) + 1, Czy (sizeof(int)) * (+1)?

Oczywiście język C mógł wprowadzić regułę, aby rozwiązać tę dwuznaczność, ale mogę sobie wyobrazić, dlaczego to nie przeszkadzało. Przy obecnym języku, specyfikator typu nigdy nie pojawia się" nagi " w wyrażeniu, więc nie ma potrzeby, aby reguły rozstrzygały, czy ten drugi * jest częścią typu, czy operatorem arytmetycznym.

Istniejąca gramatyka rozwiązuje już potencjał wieloznaczność sizeof (int *) + 1. On (sizeof(int*))+1, nie sizeof((int*)(+1)).

C++ ma nieco podobny problem do rozwiązania za pomocą składni cast w stylu funkcji. Możesz pisać int(0) i możesz pisać typedef int *intptr; intptr(0);, ale nie możesz pisać int*(0). W takim przypadku rozdzielczość jest taka, że typ "nagi" musi być prostą nazwą typu, nie może to być po prostu dowolny stary typ, który może mieć spacje lub końcową interpunkcję. Może sizeof mógł być zdefiniowany z tym samym ograniczeniem, nie jestem pewien.

 99
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
2012-10-29 17:49:45

Z C99 Standard

6.5.3.4.2
Operator sizeof otrzymuje rozmiar (w bajtach) swojego operandu, który może być wyrażeniem lub nazwą w nawiasie Typ.

W Twoim przypadku int nie jest ani wyrażeniem, ani nawiasową nazwą.

 32
Author: Jainendra,
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-10-30 23:44:31

Istnieją dwa sposoby użycia operatora sizeof w C. składnia jest następująca:

C11 6.5.3 Unary operators
...
sizeof unary-expression
sizeof ( type-name )

Za każdym razem, gdy używasz typu jako operandu, musisz mieć nawias, zgodnie z definicją składni języka. Jeśli używasz sizeof w wyrażeniu, nie potrzebujesz nawiasu.

Standard C podaje jeden z takich przykładów, gdzie można go użyć w wyrażeniu:

sizeof array / sizeof array[0]

Jednak ze względu na spójność i aby uniknąć błędów związanych z pierwszeństwem operatora, chciałbym osobiście radzę zawsze używać () bez względu na sytuację.

 6
Author: Lundin,
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-10-29 14:24:09