SORU
20 EKİM 2011, PERŞEMBE


C '' ifadede değişken bildirimi

Burada neler oluyor?

if(int a = Func1())
{
    // Works.
}

if((int a = Func1()))
{
    // Fails to compile.
}

if((int a = Func1())
    && (int b = Func2()))
)
{
    // Do stuff with a and b.
    // This is what I'd really like to be able to do.
}

2003 standardında bölüm 6.4.3 değişkenleri seçimi açıklamada durumda ilan substatements koşulu ile kontrollü sonuna kadar uzanan kapsamı ne kadar kapsamını açıklar Ama Bildirgesi etrafında parantez koymak mümkün değil varlık hakkında bir şey diyor anlamıyorum, ne de her durum tek bir beyanname ile ilgili bir şey yazıyor mu.

Bu sınırlama, bu durumda tek bir bildirimi gerekli olduğu durumlarda bile sinir bozucu. Bu göz önünde bulundurun.

bool a = false, b = true;

if(bool x = a || b)
{

}

İstersem girip '"vücut kapsamı ile x kümesi için yanlış beyanname daha sonra ihtiyaç parantez (beri atama operatörü vardır düşük öncelik daha mantıklı YA), ama beri parantez olamaz kullanılan gerektirir bildirimi x dış gövde, sızıntı, bu bildiri için daha geniş alan daha istenen. Tabi bu örnek önemsiz ama daha gerçekçi bir durumda a ve b fonksiyonlarını test edilmesi gereken değerler dönüyor olabilir

Yapmak istediğim şey çok standart olmayan uyumlu, ya da benim derleyici sadece benim topları (VS2008) bozuluyor?

CEVAP
20 EKİM 2011, PERŞEMBE


Zaten mesele de ima etti sanırım. Derleyici bu kodu ne yapmalıyım?

if (!((1 == 0) && (bool a = false))) {
    // what is "a" initialized to?

"&&" Operatörü kısa devre mantıksal VE. Bu demek oluyor ki Eğer ilk bölümü (1==0) meğer yanlış, o zaman ikinci bölümü (bool a = false) olmalı değil değerlendirdi çünkü zaten bilinen bu son cevap olacak yanlış. Eğer (bool a = false) değerlendirilen değil eğer doğru değilse, o zaman kodu ne daha sonra a kullanır? Sadece değişkeni başlatmak ve tanımlanmamış terk etmez miyiz? Varsayılan olarak başlatılamadı ki? Veri türü bir sınıf olduğunu ve bunu istenmeyen yan etkileri olsaydı? bool yerine bir sınıf kullanılır ve varsayılan kullanıcı gibi yapıcı olsa negerekirparametreler - o zaman ne yapacağız bulunur?

İşte bir örnek:

class Test {
public:
    // note that no default constructor is provided and user MUST
    // provide some value for parameter "p"
    Test(int p);
}

if (!((1 == 0) && (Test a = Test(5)))) {
    // now what do we do?!  what is "a" set to?

Buldunuz sınırlaması gayet mantıklı görünüyor gibi oluyor belirsizlikler bu tür engeller.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • El SalvaLobo

    El SalvaLobo

    10 Temmuz 2006
  • TastyTuts | Creative video tutorials by Gareth David

    TastyTuts |

    6 Temmuz 2011
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011