2013-05-19 5 views
4

я случайно кодирования, когда я писал этот код С:пост-инкремент оператора в C

#include <stdio.h> 
int main() 
{ 
    int i; 
    i = 10; 
    printf("i : %d\n",i); 
    printf("sizeof(i++) is: %d\n",sizeof(i++)); 
    printf("i : %d\n",i); 
    return 0; 
} 

И когда я запускал код, результат я получаю,

i : 10 
sizeof(i++) is: 4 
i : 10 

Я был сбит с толку по этому результату, поскольку я ожидал, что i ++ внутри оператора sizeof будет увеличиваться i. Но, похоже, нет. Так, из любопытства я написал следующую программу:

#include <stdio.h> 
int add(int i) 
{ 
    int a = i + 2; 
    return 4; 
} 
int main() 
{ 
    int i; 
    i = 10; 
    printf("i : %d\n",i); 
    printf("sizeof(i++) is: %d\n",add(i++)); 
    printf("i : %d\n",i); 
    return 0; 
} 

для этой программы, выход:

i : 10 
sizeof(i++) is: 4 
i : 11 

Теперь я все больше и больше сбит с толку.

Извините, если это вопрос noob (каким я есть), но я действительно не понимаю даже, как google для такой проблемы!

Почему значение i отличается в этих двух программах? Пожалуйста помоги!

+0

@ ring0 Я запускаю gcc 4.6.3 поверх виртуальной машины Ubuntu 12.04 поверх Windows. – user2290802

ответ

5

sizeof() не является функцией исполнения. Он просто дает вам размер переменной или размер возвращаемого значения функции.

Итак, в первом примере вы просто получаете размер результата результата оператора post-increment для целого числа, которое является целым числом ... 4 байта.

В вашем примере вы просто печатать возвращаемое значение вашего метода, который возвращает 4, а затем переменные приращения и печати 11.

+1

Я не беспокоюсь о том, что возвращает sizeof(). Меня беспокоит окончательный prinf(). После post-increment я ожидаю, что x будет иметь значение 11. Но с примером с sizeof() он все еще имеет 10 в качестве конечного значения. Но когда я заменил sizeof() на другую функцию, конечное значение x равно 11. Это мое беспокойство. – user2290802

+1

Все еще отвечает на ваш вопрос. 'sizeof (i ++)' заменяется на '4' препроцессором/компилятором, поэтому' i ++ 'никогда не заканчивается как машинный код в исполняемом файле. –

+1

@ user2290802 Вот что я сказал, sizeof() не является функцией выполнения. Во время компиляции он просто видит размер параметра и вставляет этот номер на свое место (вроде). Во время выполнения i ++ даже не существует, поэтому он не оценивает. –

5

sizeof не оценивает свой операнд (за исключением VLA типа ситуаций).

Это означает, что sizeof(*(T*)(NULL)) - это то же самое, что и sizeof(T), и совершенно верно.

+1

+1 Это правильный ответ. В стандарте C99 это раздел 6.5.3.4. – JeremyP

 Смежные вопросы

  • Нет связанных вопросов^_^