Wiemy, że sizeof
jest to operator służący do obliczania rozmiaru dowolnego typu danych i wyrażenia, a gdy operand jest wyrażeniem, można pominąć nawiasy.
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 jest kompilowany 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. Spowoduje sizeof int
jakąkolwiek dwuznaczność?
sizeof (int)a
.sizeof +(int)a
ma przewagę nad*&
faktyczną kompilacją ;-)+
. Na przykład,sizeof +(char)a == sizeof(int)
ze względu na promocję liczb całkowitych, prawdopodobnie mniej podatne na błędy jest umieszczenie w nawiasach, jeśli w ogóle istnieje obawa o wyrażenie, którego rozmiar próbujesz przyjąć. Nie jestem więc pewien, czy posunąłbym się do nazwania tego „użytkiem”, chociaż przyznaję, że go użyłem ...Odpowiedzi:
Poniższe informacje mogą być niejednoznaczne:
Czy tak
(sizeof (int*)) + 1
, czy(sizeof(int)) * (+1)
?Oczywiście język C mógł wprowadzić regułę rozwiązującą tę niejednoznaczność, ale mogę sobie wyobrazić, dlaczego to nie przeszkadzało. Przy obecnym języku specyfikator typu nigdy nie pojawia się w wyrażeniu jako „nagi”, więc nie ma potrzeby stosowania reguł do rozstrzygania, czy ta sekunda
*
jest częścią typu, czy operatorem arytmetycznym.Istniejąca gramatyka rozwiązuje już potencjalną niejednoznaczność
sizeof (int *) + 1
. To jest(sizeof(int*))+1
, niesizeof((int*)(+1))
.C ++ ma nieco podobny problem do rozwiązania za pomocą składni rzutowania 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 żaden stary identyfikator typu, który może zawierać spacje lub końcowe znaki interpunkcyjne. Możesizeof
można by było zdefiniować z tym samym ograniczeniem, nie jestem pewien.źródło
new int*(X)
co byłoby niejednoznaczne, gdyby C ++ nie określił, że operator new przyjmuje najdłuższy ciąg, który mógłby być typem. Więc w C ++ mogliby zrobić to samo z sizeof, jak sądzę. Ale w C ++ można powiedzieć,sizeof int()
które z nich byłyby niejednoznaczne (zainicjowano typ lub wartość int?).sizeof int()
byłaby źle sformułowana („nieoperator()
nasize_t
”), co, jak sądzę, byłoby niepożądane!Od C99 Standard
W twoim przypadku
int
nie ma wyrażenia ani nazwy w nawiasach.źródło
Istnieją dwa sposoby użycia operatora sizeof w C. Składnia jest następująca:
Ilekroć 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 nawiasów.
Standard C podaje jeden taki przykład, gdzie możesz chcieć go użyć w wyrażeniu:
Jednak ze względu na spójność i aby uniknąć błędów związanych z pierwszeństwem operatorów, osobiście radziłbym zawsze używać () bez względu na sytuację.
źródło
sizeof expression
isizeof(type)
, co wyjaśniono w tej odpowiedzi.