2013-09-24 37 views
5

ile C# döngü Bu benim kod iken:birden fazla koşul

while(Func(x) != ERR_D) 
{ 
    if(result == ERR_A) 
     throw...; 
    if(result == ERR_B) 
     throw...; 

    mydata.x = x; 
} 

Sorun sonuç döngü içindeyken kontrol edilecek şekilde iken durumda result = Func(x) kullanmak istediğiniz olmasıdır. While döngüsü Func(x) numaralı telefonu aramalı ve ERR_D değerini döndürmelidir. ilk istemiyorum budur Func(x) deyimiyle Projemde

do{ 
    result = Func(x); 
    if(result == ERR_A) 
     throw ...; 
    if(result == ERR_B) 
     throw ...; 
    mydata.x = x; 
    }while(result != ERR_D); 

kullanamaz. Ama ben while(result = Func(x) != ERR_D) denedim, işe yaramıyor. Bunu çözmek için bir fikrin var mı?

+2

Eh, 'x' hiç değişmez. Belki bununla bir ilgisi var mı? Söylemesi zor, "işe yaramıyor", neredeyse her şey anlamına gelebilir ve ne olması gerektiği hakkında hiçbir fikrimiz yok. –

+0

'var sonuç = Func (x); while (sonuç! = ERR_D) {doStuff(); sonuç = Func (x); } '? – Corak

+0

Bir while döngüsünde istisnalar atmak gerçekten mantıklı mı? döngü atılır kapanmaz sona erer ... –

cevap

8

deneyin Derleyiciyi önce atamayı zorlamak için zorlamak gerekir (bu da C# cinsinden atanan değere göre değerlendirilir)), != operatörünün her iki tarafındaki değerleri birbiriyle karşılaştırmadan önce. Bir while (true)...

string line; 

while ((line = streamReader.ReadLine()) != null) { /* ... */ } 
+0

iyi bir açıklama – Heidi

2

bu deneyin:

while((result=Func(x)) != ERR_D){ 
if(result == ERR_A) 
     throw...; 
if(result == ERR_B) 
     throw...; 
mydata.x = x; 
} 

NOT: atama parantez (result=Func(x)) ilk yapılır, bu atama operatörü = aşırı yüklenmesine tarafından yapılan aslında ve bu operatör sola başvuru verir yan işlenen, yani result. Bundan sonra, result, != numaralı operatör aracılığıyla ERR_D ile karşılaştırılacaktır.

+0

Teşekkürler, işe yarıyor. – Heidi

6

Döngünün dışında bildirme işlemini deneyin ve her yineleme için Funcs dönüş değerini atayın.

Örneğin

: Size bu yüzden,

while((result = Func(x)) != ERR_D) { /* ... */ } 

!= operatör atama daha yüksek önceliğe sahiptir:

var result = Func(x); 

while(result != ERR_D) 
{ 
    if(result == ERR_A) 
     throw...; 
    if(result == ERR_B) 
     throw...; 

    mydata.x = x; 
    result = Func(x); 
} 
1

sadece bazı parantez eklemeniz gerekir

while((result = Func(x)) != ERR_D) 
0

kullanarak bu ifadesinden elde edilir::

while (true) 
{ 
    var result = Func(x); 

    if (result == ERR_D) 
     break; 

    if (result == ERR_A) 
     throw ...; 

    if (result == ERR_B) 
     throw ...; 

    mydata.x = x;    
} 

Bu bir döngü-ile-bir-çıkış olduğunu (eğer örnek bir dosyayı okumak için söylemedim, oldukça sık görmek bir şablon throws yok saymak;)) bu yüzden yapılandırılmış bir döngüdür. o biraz korkak görünüyor olsa

Ayrıca bir for döngü kullanabilirsiniz (cinas amaçlanan değil!):

for (var result = Func(x); result != ERR_D; result = Func(x)) 
{ 
    if (result == ERR_A) 
     throw ...; 

    if (result == ERR_B) 
     throw ...; 

    mydata.x = x;  
} 
İlgili konular