Использование ++ внутри ключевого слова sizeof

Возможный дубликат:
каков механизм sizeof () в C/C++?

Hi,

Я являюсь ассистентом университета, и недавно я показал своим студентам бакалавриата следующий код C из головоломки C, которую я нашел:

int i = 5;
int j = sizeof(i++);
printf("%d\n%d\n", i, j);

У меня только один вопрос: почему вывод для i равен 5, а не 6? ++ просто игнорируется? Что тут происходит? Спасибо!


person BJ Dela Cruz    schedule 05.05.2011    source источник


Ответы (5)


Выражение в sizeof не оценивается — используется только его тип. В данном случае это тип int, результат того, что i++ выдал бы, если бы он был вычислен. Такое поведение необходимо, поскольку sizeof на самом деле является операцией времени компиляции (поэтому ее результат можно использовать для таких вещей, как определение размера массивов), а не во время выполнения.

person Community    schedule 05.05.2011
comment
Он не всегда оценивается во время компиляции, если операнд является VLA. - person Dietrich Epp; 15.09.2011
comment
Рассмотрим sizeof(int[i++]). :-) - person R.. GitHub STOP HELPING ICE; 15.09.2011

Оператор sizeof оценивается во время компиляции. sizeof(i++) в основном читается компилятором как sizeof(int) (отбрасывая ++).
Чтобы продемонстрировать это, вы можете посмотреть на ассемблерный вид вашей небольшой программы: введите здесь описание изображения Как вы можете видеть в выделенной строке, размер целого числа (4) уже есть и только что загружен в i. Он не оценивается и даже не рассчитывается при запуске программы.

person Cees Meijer    schedule 05.05.2011

Да, внутри sizeof оценивается только тип.

person Jens Gustedt    schedule 05.05.2011

Основная причина в том, что sizeof — это не function, а operator. И в основном он оценивается во время компиляции, если нет массива переменной длины. Поскольку размер int можно оценить во время компиляции, он возвращает 4.

person Aamir    schedule 05.05.2011

почему вывод для i равен 5, а не 6?

sizeof не оценивает выражение внутри него, а только тип.

Мы помним, что sizeof — это не функция, а оператор времени компиляции, поэтому он не может оценить его содержимое.

person Pih    schedule 05.05.2011