2016-07-29 9 views
1

Что я ожидаю,
1. Введите ввод.
2. Считать входное и обратное входное значение.
3. Оцените значение sizeof.
4. Распечатайте значение sizeof.Почему размер sizeof не работает?

Но первого шага никогда не бывает.

Почему не происходит первый шаг?

+0

я получаю это: [ектронное @ Steamboy ics_client] $ Gcc -o темп temp.c [ектронное @ Steamboy ics_client] $ ./temp 4 [ектронное @ Steamboy ics_client] $ На какой платформе вы? – octopusgrabbus

+1

Также вы должны добавить '\ n 'в конце строки форматирования. –

ответ

4

Функция sizeof() не оценивает, что находится в скобках: она смотрит на тип и возвращает размер. Это совершенно безопасно:

char *ptr = NULL; // NULL ponter! 
printf("%d", sizeof(*ptr)); 

Он вернется 1, так как он не должен вычислить выражение, чтобы знать ответ.

+1

«Это совершенно безопасно:» -> не совсем. Тип результата 'sizeof' -' size_t'. Спецификатор 'printf()' ''% zu "', а не ''% d "'. – chux

1

Потому что getchar() тип возврата int, а не char. sizeof(int) - 4 на вашей платформе.

Кроме того, вы должны использовать %zu для печати значений size_t. Использование неверного формата спецификатора технически undefined behaviour.

2

Что я ожидаю, 1. Введите ввод. 2. Прочитайте входное и обратное входное значение. 3. Оцените значение sizeof 4. Распечатайте значение sizeof.

Но первого шага никогда не бывает. Почему первый шаг не происходит?

Поскольку за очень небольшим исключением оператор sizeof не оценивает его операнд. Ваше использование не является одним из исключений. Не оценивая getchar() означает, что getchar() не вызывается.

В любом случае, я не уверен, что вы ожидаете от своего кода. Даже если getchar()были вызваны, результат всегда имеет тот же тип (int), который не зависит от ввода.

Также обратите внимание на комментарии @ P.P. Ваш формат printf() не соответствует типу печатаемых данных, size_t. Как он замечает, вызов printf() имеет неопределенное поведение в результате.

1

В C оператор sizeof оценивается во время выполнения только для переменных массивов (VLA). Во всех остальных случаях оператор не выполняет и его операнд. Он выводит тип выражения и возвращает размер объекта выводимого типа.