2013-08-02 39 views
12

, ni float f = 0.0; ise,
ve return(f ? 1 : 0); ile return(0.0 ? 1 : 0); değiştirilmesi.
Çıktı NIL. Bu kod çıkışları Visual Studio kullanarak, 32-bit Windows makinesindekayan nokta sabit bir karşılaştırma - (0.0 1: 0) Aşağıdaki örnekte

/* file main.c 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 
cl -W4 -MTd -O2 -TC main.c -Fetest */ 
#include <stdio.h>  
int my_func(void) 
{ 
    /* float f = 0.0; */ 
    return(0.0 ? 1 : 0); 
} 
int main(void) 
{ 
    printf("%s\n", (my_func() ? "ONE" : "NIL")); 
    return 0; 
} 

: Burada

benim kodudur

ONE 
  • Neden my_func() döner değer true (1)?
  • C derleyicisi bu ifadeyi (0.0 ? 1 : 0) nasıl yorumluyor?
+1

Bu aslında karşılaştığınız gerçek bir dünya mıdır? Gerçek kodda yapabileceğiniz şey bu mu? :-) – paxdiablo

+7

Sadece aynı kodu çalıştırdım ve "NIL" aldım – John

+1

Sadece karanlıkta bir çekim - belki de derleyiciniz, kesiksiz olarak hex değerlerini karşılaştırıyor? ex. (int) 0, 0x000000'e eşdeğerdir, ancak kayan nokta kesinliğiyle, büyük olasılıkla bu tam değere iniş yapmazsınız – John

cevap

8

denk etmedi Connect'a göndermeniz gereken Microsoft derleyicisindeki hata. Visual Studio Express 2010'da kopyalayabildim, ancak gcc: http://ideone.com/8qPRJd.

0 tamsayı değeri olarak değerlendiren tüm ifadeler false'a eşdeğer olmalıdır. Bu tam olarak float değişkeni ile çalışıyor ve ben de bir double ile denediğimde aynı.

+0

Ben concur. (BTW beni 3 dakika sonra yendi) – chux

+0

Float_expr: expr1: expr2'de bir tamsayı türüne dönüştürme yapılmadığını unutmayın. Bunun yerine, bir koşullu ifadenin ilk ifadesi, skaler tipe sahip olmak için gereklidir ve bu tipin sıfır ile karşılaştırılır (C11'deki 6.5.15: 4). eğer (0,5) printf (…); yazdırır (ve (-0.0) printf (…); değilse). –

+0

'/ Od' ile bile derleme listesini kontrol edebilirsiniz ... dümdüz' (0.0? 1: 0) 've' mov eax, 1' ekler. Bir böcek derim. Bir if-expr dosyasında bir '0.0' literalinin yerleştirilmesi, uygun montajın üretilmesine (optimizasyonlarda bile) neden olur. – user7116

0

dönüş (0.0 1:? 0) Diğer durumda sabit bir getiri 1. derlenmiş, kayan nokta değişken aslında değerlendirildi ve 0.0 Bu gibi görünüyor 0.

İlgili konular