2013-09-24 3 views
5

와 C#에서 루프이 내 코드 동안 :여러 조건

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

    mydata.x = x; 
} 

문제는 그 결과가 while 루프 내부에서 확인되는 바와 같이, 동안 조건에 result = Func(x)을 사용할 것입니다. while 루프는 ERR_D을 반환 할 때까지 Func(x)을 호출해야합니다. 처음 내가 원하지 않는 것 인 Func(x)를 호출 나는 내 프로젝트에

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

을 사용할 수 없습니다. 그러나 while(result = Func(x) != ERR_D)을 시도했지만 작동하지 않습니다. 이 문제를 해결할 수있는 아이디어가 있습니까?

+2

음,'x'가 변경되지 않습니다. 어쩌면 그것과 관련이있는 것일까 요? "작동하지 않는다"는 것은 거의 모든 것을 의미 할 수 있으므로 우리는 무슨 일이 일어나야하는지 전혀 모릅니다. –

+0

'var result = Func (x); while (result! = ERR_D) {doStuff(); 결과 = Func (x); }'? – Corak

+0

while 루프에서 예외를 throw하는 것이 실제로 의미가 있습니까? 루프가 던져지는대로 루프가 종료됩니다 ... –

답변

8

시도 컴파일러가 먼저 할당을 수행하도록 강제해야합니다 (C#), 연산자의 양쪽에있는 값을 서로 비교하기 전에. while (true)...

string line; 

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

좋은 설명 – Heidi

2

이 시도 :

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

참고을 : 할당이 괄호 (result=Func(x)) 먼저 수행, 본 과제는 운전자 =의 과부하에 의해 수행 사실이며,이 연산자는 왼쪽으로 참조를 반환 즉, result입니다. 그 후 result!=을 통해 ERR_D과 비교됩니다.

+0

고마워, 작동합니다. – Heidi

6

루프 외부에서 result을 선언하고 각 반복마다 Funcs 반환 값을 할당하십시오.

예를 들어

: 당신, 그래서

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

!= 운영자가 할당보다 더 높은 우선 순위를 가지고 :

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

당신은 그냥 괄호를 추가 할 필요가

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

당신은 사용이 표현할 수 :

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

    if (result == ERR_D) 
     break; 

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

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

    mydata.x = x;    
} 

이것은 루프와-하나의 출구이다 (당신이 경우 예를 들어 파일을 읽을 즉, 당신은 꽤 자주 볼 패턴입니다 던졌습니다;)) 그래서 구조적 루프입니다 무시합니다. 조금 펑키 보이지만

당신은 또한 for 루프를 사용할 수 있습니다 (말장난하지를!) :

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

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

    mydata.x = x;  
}