Przede wszystkim wartość wyprodukowana przez sizeof
ma wartość size_t
, która jest typu unsigned
. UWAGA
jako typ unsigned
jest wyższy rangi niż typu signed
, podczas wykonywania porównania, zgodnie z normami operatora relacji, zwykłe arytmetyczne konwersje są wykonywane, co oznacza podpisaną typ jest promowany do niepodpisany typ.
W twoim przypadku, -1
, gdy uważane za unsigned
, reprezentują najwyższą możliwą wartość unsigned
, a zatem nic dziwnego
if (sizeof(int) > -1)
ocenia się fałszywego.
Morał z tej historii: próba porównania między signed
i unsigned
jest spodziewać produkować wynik dziwne, tak jak w Twoim przypadku. Powinieneś włączyć ostrzeżenie kompilatora i spróbować rozwiązać problemy zgłoszone przez kompilator.
UWAGA:
Z C11
rozdział §7.19, <stddef.h>
,
size_t
który jest typu unsigned
całkowitą wyniku operatora sizeof
.
Prawdopodobnie zostałoby to złapane, gdybyś miał włączone więcej ostrzeżeń. – VoidStar