2013-05-10 26 views
5
int a = 1, b = 0; 

if(a, b) 
    printf("success\n"); 
else 
    printf("fail\n"); 

if(b, a) 
    printf("success\n"); 
else 
    printf("fail"); 

Bu cpp dosyası ve benvirgül operatörü eğer koşul

fail 
success 

olarak Visual Studio 2010 çıkışı var niye bu davranış? Lütfen açıklar mısın?

+6

Bunu durumda virgül operatörünü kullanıyor biliyorum, henüz sormak gerekir? –

+0

İlk ifadede bir kesme noktası ekleyebilir ve akışı kendiniz görmek için F10 kullanarak program satırını çalıştırabilirsiniz. O virgül tablolara bir dizi noktası olarak görür ama argümanlar biliyorum @DanielFischer – vish213

+0

Ben sezgisel ** evet **, ama seni istiyorum hissetmek? O if' 'içinde bir dizi nokta olup olmadığını söyleyebilir functions.Can için onaylamak. Rüppell'sVulture @ –

cevap

35

http://en.wikipedia.org/wiki/Comma_operator: C ve C++ programlama dillerinde

, (jeton , ile temsil edilen), virgül operatörü onun birinci işlenen değerlendirir ve sonucu atar bir ikili operatör ve sonra değerlendirir ikinci işlenen ve bu değeri (ve türü) döndürür. senin ilk if yılında

:

if (a, b) 

a ilk değerlendirilir ve atılır, b ikinci değerlendirilir ve Yani bu durum yanlıştır 0 olarak döndürülür. senin ikinci if yılında

:

if (b, a) 

b ilk değerlendirilir ve atılır, a ikinci değerlendirilir ve Yani bu koşul doğruysa 1 olarak döndürülür. İkiden fazla işlenen de varsa

, son ifadesi iade edilecektir. Her iki koşulların doğru olmasını istiyorsanız

, kullanmak gerekir && operator:

if (a && b) 
+0

Öyleyse, böyle koşulların amacı nedir? Birisi daha iyi ve kullanışlı örnek yan etkilere neden olan bir işlemi gerçekleştirmek istiyorum, ama gerçek dönüş değeri gerekmez, bu durum kullanışlıdır – Pars

+1

@Pars sağlayabilir. Örneğin, projelerimin birinde bu koşulu vardı: eğer (numeric_read (str, & err),! Err) '. Ben, 'err' yerine '&&! Err 'kullanmış olsaydım, 0 olan sayıları okuyamazdım. –