2012-12-27 14 views
8

Powiel możliwe:
Why does sizeof(x++) not increment x?operator przyrost nie pracuje z sizeof

prostu zastanawiasz się, dlaczego operator przyrost nie działa w poniższym fragmencie kodu:

int main() 
    { 
     int a = 10; 
     int b = sizeof(a++); 
     cout<<"a: "<<a<<endl; 
     cout<<"b: "<<b<<endl; 
     return 0; 
    } 

Output -

A: 10

B: 4

+1

Sizeof jest operatorem kompilacji, a cały sizeof() zostaje zastąpiony jego wartością wynikową przed skompilowaniem kodu. Zobacz: http: // stackoverflow.com/questions/8225776/why-does-sizeofx-not-increment-x/8225813 # 8225813 –

+0

Jakie jest oczekiwane zachowanie dla tego kodu? –

+0

@EtiennedeMartel: Domyślam się, że oczekiwanie pytającego to a = 11, b = 10. –

Odpowiedz

10

sizeof nie ocenia swojego argumentu. Oblicza on statyczny rozmiar argumentu w czasie kompilacji, nie powodując wykonania żadnego kodu.

+0

Dlaczego jestem tym zaskoczony? –

+5

@JanDvorak: Ponieważ nie znasz C++? – sbi

+0

@sbi Tak, to jest prawdopodobna przyczyna –

2

Argument operatora sizeof nie jest używana, nie jest uwzględniany. Jest to standardowe zachowanie.

+0

Ale 'a' jest używane zarówno do określenia' sizeof (a ++) ', a później do wyjścia. –

1

sizeof nie jest to funkcja w C

Jej argumentem jest naprawdę nie oceniano, tylko jej rodzaj jest i odbywa się to w czasie kompilacji. W kodzie przyporządkowanie odpowiada (w architektury) do:

int b = 4 
+0

"odbywa się to w czasie pracy." - naprawdę? –

+0

ergh, literówka. Przepraszam. – lbonn

8

Gdy typ ekspresji sizeof nie zmiennie zmodyfikowany rodzaj tablicy, po czym ekspresja nie jest oceniane dlatego, że typ jest całkowicie znany w czasie kompilacji. int nie ma zmiennie zmodyfikowanych części.

W C++ (do co najmniej C++ 11) nie ma zmiennie zmodyfikowanych typów (przynajmniej nie tak jak w koncepcji C - można argumentować, że new int[a++] używa zmiennie zmodyfikowanego typu tablicy, ale typ nie uciec się do jakiejkolwiek innej części języka, w szczególności do sizeof), więc w C++ wyrażenie do sizeof nigdy nie jest oceniane. W języku C nie jest określane, czy wyrażenie jest oceniane, jeśli nie ma wpływu na rozmiar zmiennie zmodyfikowanego typu tablicy. Na przykład

int main() 
{ 
    int a = 10; 
    int b = sizeof(int[a++ ? 1 : 1]); 
    cout<<"a: "<<a<<endl; 
    cout<<"b: "<<b<<endl; 
    return 0; 
} 

W C (z C99 i dalsze), mogłoby to spowodować wyjście 11 do a, lecz może być również przesyłane 10, w zależności od tego, czy kompilator wystarczająco mądry pominąć oceny a++, wnioskowanie, że sizeof int[10] jest obliczono w czasie kompilacji.


Przypis: Zmodyfikowane typy tablic są również nazywane typami VLA (array o zmiennej długości). W skrócie, zmiennie zmodyfikowany typ jest typem typu VLA lub typem, który zależy od jednego. Na przykład int(*)[a++].

+0

+1: w C++ 11, 5.3.3p1, "operator sizeof daje liczbę bajtów w reprezentacji obiektu swojego operandu. Argument ten jest albo wyrażeniem **, które jest operatorem nieocenionym ** (klauzula 5) lub parentedowany identyfikator typu. " podkreślenia dodane. – WhozCraig

0

W unowocześnionym kontekście tylko typ ma znaczenie. To samo dzieje się podczas wywoływania funkcji:

void f(); 

sizeof(f()); // f not called