2014-07-17 6 views
-1

В следующем кодеПочему sizeof (int) меньше -1?

#include <stdio.h> 

int main() 
{ 
    if (sizeof(int) > -1) 
     printf("True"); 
    else 
     printf("False"); 
return 0; 
} 

я получаю результат, как «False», а не «True» .my понимание того, что оператор SizeOf просто возвращает размер междунар который будет 4 в этом случае.

Почему состояние оценивается как ложное?

+0

[Почему -1> sizeof (int)?] (Http://stackoverflow.com/q/3100365/995714) –

ответ

8

sizeof генерирует size_t, который всегда положительный. Вы сравниваете его с -1, который, вероятно, продвигается в size_t, который дал вам ОГРОМНОЕ число, скорее всего большее, чем размер int.

Чтобы убедиться в этом, попробуйте следующее:

printf("%zu\n", sizeof(int)); 
printf("%zu\n", (size_t)(-1)); 

[EDIT]: После получения комментариев (некоторые из них были удалены), я действительно точным, что sizeof является оператором, а не функция.

+0

@ user3195614 нет, это не функция, это оператор. И он оценивает значение. – bolov

+0

Это не «бросок», а «продвигаемый», потому что правила продвижения по целому ряду C так говорят :-). – rubenvb

+0

Спасибо, я обновил свой ответ – Coconop

0

Во-первых, работает ваш код:

cc1plus: warnings being treated as errors 
In function 'int main()': 
Line 3: warning: comparison between signed and unsigned integer expressions 

Тогда фиксируя его:

int main() 
{ 
    if ((int)sizeof(int) > -1) // cast value of sizeof(int) to int before compare to int 
     printf("True"); 
    else 
     printf("False"); 
    return 0; 
} 

Результат:

True 
+0

Это ответ, вы должны отбрасывать из -unsigned int-to -int-. –

+0

PLS попробуйте добавить комментарий, чтобы пользователи, которые используют это в будущем, могли бы получить хорошее представление об этом – Sorcrer

2

От стандарта, C11, 6.5.3.4 SizeOf и _Индивидуальные операторы:

5 Значение результата обоих операторов определено реализацией, а его тип (тип целых чисел без знака ) - size_t, определенный в (и других заголовках).

Таким образом, оператор sizeof дает значение без знака. Затем вы сравниваете значение unsigned со значением, подписанным. Это обсуждается converting the signed value to be unsigned, что объясняет поведение, которое вы видите.

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