#include <stdio.h>
main()
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
CEVAP eğer.c dili sizeof deyimi
Neden böyle davranıyor?
#include <stdio.h>
main()
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
CEVAP eğer.c dili sizeof deyimi
Neden böyle davranıyor?
Her şeyden önce sizeof
tarafından üretilen değer, unsigned
türünde olan size_t
şeklindedir. NOT
yükseltilir imzalı türünün olmadığını ilişki operatörünün normlara göre, olağan aritmetik dönüşümler yapılır, karşılaştırma yaparken unsigned
tipi, signed
tip daha yüksek rütbe arasında olduğu gibi imzasız tür. unsigned
olarak değerlendirildiğinde -1
Senin durumunda
unsigned
değeri,
if (sizeof(int) > -1)
yanlış olarak değerlendirilir şaşılacak temsil eder.
Ahlak hikayesi: Bir signed
arasında girişimi karşılaştırma ve unsigned
sadece örneğinde olduğu gibi, garip bir sonuç üretmek üzere beklenen olduğunu. Derleyici uyarısını etkinleştirmeli ve derleyici tarafından bildirilen sorunları çözmeye çalışmalısınız.
NOT: sizeof
operatörün sonucunun unsigned
tamsayı türüdür
C11
itibaren bölüm §7.19, <stddef.h>
,
size_t
.
sizeof
, boyutu döndüren ve döndürülen değer türü unsigned int
olan bir operatördür. unsigned
, singed
türünden daha yüksek bir rakama sahip olduğundan -1, imzalanmamış numara olarak kabul edilir. Bu durumda -1 0xFFFF olarak kabul edilir. Dolayısıyla if (sizeof(int) > 0XFFFF)
, false
'a göre değerlendirilmiştir.
Eğer
if ((int)sizeof(int) > -1)
yazarsanız size True
beklenen sonuç elde edecektir.
Operatör sizeof, bazı uygulama tanımlı imzasız tamsayı türüne karşılık gelen size_t
türünde bir değer döndürür.C standardında
5 her iki operatörlerin sonuç değeri uygulama tanımlı olduğu, ve türü (işaretsiz bir tam sayı tipi) (diğer başlıklarda) tanımlanmış size_t.
daha büyük ya da tip int
mertebesine en azından eşit, her durumda size_t
sıralaması. Bu, derleyicinin bir ifadenin türünü belirlemesi gerektiğinde, işlenen dönüştürücünün daha yüksek sırayla işlenenin türüne göre alt sırayı düşüreceği anlamına gelir. İşlenenler aynı sıralamaya sahipse, ancak bir işlenende imzasız tamsayı türü varsa ve başka bir tamsayı türü varsa, ortak türü işaretsiz int türündedir. bir durumda Böylece
ifadesi
if (sizeof(int) > -1)
-1
size_t
dönüştürülür ve bağlı tüm bitleri 1'e ayarlanır ve iç temsile olan
sizeof(int)
Aslında, standardın imzalı olarak imzalanmamış olarak dönüşümleri belirttiği için, negatif bir sayının iç temsili gerçekten önemli değil ... '-1', aynı imzasız değere bakılmaksızın dönüştürür (işaretsiz tür için en yüksek değer) . – Dmitri
değerinden daha freater ise Daha fazla uyarı etkinleştirildiyse bu muhtemelen yakalanmış olabilir. – VoidStar