SORU
10 AĞUSTOS 2014, Pazar


'yüzen bir = 3.0;' doğru bir ifadedir?

Eğer şu beyan var:

float a = 3.0 ;

bu bir hata mı? 3.0 double bir değer olduğunu ve bunu belirtmek zorunda olduğum bir kitap float a = 3.0f olarak okudum. Bu kadar mı?

CEVAP
10 AĞUSTOS 2014, Pazar


Eğer bunu yaparsanız, derleyici sizin için bir yüzer çift değişmez 3.0 dönüştürür. float a = 3.0 bildirmek için bir hata değil :


Ancak, sengerekirbelirli senaryolar içinde yüzer rakamları gösterimde kullanın.

  1. Sebep: performans için

    Özellikle, göz önünde bulundurun:

    float foo(float x) { return x * 0.42; }
    

    Burada derleyici bir dönüşüm zamanında ödeyecek () döndürülen her değer için bir uyarı verecektir. Bunu önlemek için bildirmeniz gerekir:

    float foo(float x) { return x * 0.42f; } // OK, no conversion required
    
  2. Sonuçları karşılaştırırken hataları önlemek için:

    örneğin aşağıdaki karşılaştırma başarısız :

    float x = 4.2;
    if (x == 4.2)
       std::cout << "oops"; // Not executed!
    

    Şamandıra değişmez gösterimi ile tamir edebiliriz :

    if (x == 4.2f)
       std::cout << "ok !"; // Executed!
    

    (Not: kursu, this is not how you should compare float or double numbers for equality in general)

  3. Doğru aşırı yüklü işlev çağrısı (aynı sebepten):

    Örnek:

    void foo(float f) { std::cout << "\nfloat"; }
    
    void foo(double d) { std::cout << "\ndouble"; }
    
    int main()
    {       
        foo(42.0);   // calls double overload
        foo(42.0f);  // calls float overload
        return 0;
    }
    
  4. As noted by Cyber yazın kesinti bağlamında, derleyici float : bir anlamak yardımcı olmak için gereklidir

    auto durumunda :

    auto d = 3;      // int
    auto e = 3.0;    // double
    auto f = 3.0f;   // float
    

    Ve benzer şekilde, şablon tipi kesintisi durumunda :

    void foo(float f) { std::cout << "\nfloat"; }
    
    void foo(double d) { std::cout << "\ndouble"; }
    
    template<typename T>
    void bar(T t)
    {
          foo(t);
    }
    
    int main()
    {   
        bar(42.0);   // Deduce double
        bar(42.0f);  // Deduce float
    
        return 0;
    }
    

Live demo

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AyfionGaming

    AyfionGaming

    20 ŞUBAT 2013
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008
  • Shantanu Sood

    Shantanu Soo

    3 Kasım 2008