2015-08-12 21 views
6
#include <stdio.h> 
main() 
{ 
    if (sizeof(int) > -1) 
     printf("True"); 
    else 
     printf("False"); 
} 

ODPOWIEDŹ:c język if z sizeof

Fałsz

ale zgodnie z logiką sizeof(int) powrotnej 2 i if(2>-1) powrotu 1 i należy wydrukować True.

Dlaczego zachowuje się inaczej?

+4

Prawdopodobnie zostałoby to złapane, gdybyś miał włączone więcej ostrzeżeń. – VoidStar

Odpowiedz

14

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.

2

sizeof to operator, który zwraca rozmiar, a typ wartości zwracanej to unsigned int. Ponieważ unsigned ma wyższą pozycję niż singed, -1 jest traktowane jako liczba bez znaku. -1 w tym przypadku jest traktowane jako 0xFFFF. Dlatego if (sizeof(int) > 0XFFFF) jest oceniane na false.

enter image description here

1

Jeśli piszesz

if ((int)sizeof(int) > -1) 

otrzymasz oczekiwany rezultat, który jest True.

Wielkość operatora zwraca wartość typu size_t, która odpowiada pewnej implementacji zdefiniowanej liczby całkowitej typu bez znaku.

od C Standard (6.5.3.4 sizeof i alignof operatorów)

5 Wartość wyniku obu operatorów, jest zastosowanie zdefiniowane oraz typ (nieoznaczoną typ całkowity) jest size_t, zdefiniowane w (i innych nagłówkach).

Rangę size_t w każdym przypadku większą niż lub co najmniej równą stopnia typu int. Oznacza to, że gdy kompilator musi określić typ wyrażenia, to konwertuje operand, który obniży rangę do typu operandu o wyższej randze. Jeśli operandy mają tę samą wartość, ale jeden operand ma niepodpisany typ całkowity, a inny ma typ liczby całkowitej ze znakiem, wówczas typ wspólny jest typu unsigned int.

Tak więc w stanie if

if (sizeof(int) > -1) 

-1 przekształca się liczba całkowita bez znaku typu size_t i ze względu na jego wewnętrznej reprezentacji, gdy znajdują wszystkie bity 1 jest freater niż wartość sizeof(int)

+0

Właściwie ze względu na sposób, w jaki standard określa konwersje z podpisu na niepodpisany, wewnętrzna reprezentacja liczby ujemnej tak naprawdę nie ma znaczenia ... '-1' konwertuje na tę samą wartość bez znaku niezależnie (maksymalna wartość dla typu bez znaku) . – Dmitri