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++]
.
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 –
Jakie jest oczekiwane zachowanie dla tego kodu? –
@EtiennedeMartel: Domyślam się, że oczekiwanie pytającego to a = 11, b = 10. –