2014-10-05 4 views
1

C에서 프로그램을 만드는 동안 문제가 발생했습니다. & &은 첫 번째가 거짓 인 경우 두 번째 피연산자를 평가하지 않습니다. 나는 이것이 단락 회로 동작으로 알려져 있음을 알고 있습니다. 하지만 두 번째 피연산자를 실행하려면 아래 코드에서 이유를 확인하십시오.C에서 평가 && 연산자

while(a-- && b--){ 
    //some statements 
} 

제 작업을 수행하는 방법을 알려주세요. 고마워요!

+0

어떤 결과가 나타 났습니까? – Pradheep

+0

사실 첫 번째 피연산자가 거짓이면 b의 값을 감소시켜야합니다. 그러나 그것은 감소하지 않습니다. 루프 후에 b의 감소 값을 사용해야합니다. – user3556306

답변

2

a와 b가 작은 경우 * B가 오버 플로우하지 않는만큼 같은 :

while((a--) * (b--)) 
{...} 

가 클 수있는 경우를 : 당신이 후 b를 감소가 필요하면

while(((a--) ? 0xf : 0) & ((b--) ? 0xf : 0)) 
{...} 
+0

두 번째 코드를 가져올 수 없습니까? – user3556306

+1

두 번째 버전은 모든 양수를 0xf로 변환 한 다음 bitwise &를 수행합니다. 따라서 (a--와 b--) 모두 양수이면 0xf & 0xf가 0xf가되어 루프가 계속됩니다. 둘 중 하나가 0이면 0xf & 0을 얻습니다.이 값은 0이며 루프가 중지됩니다. 단락이 없으므로 (a--)와 (b--)가 모두 평가됩니다. – Ian

1
while(a && b){ 
    a--; b--; 
    //some statements 
} 
// just after loop ends 
a--; b--; 
0

루프, 왜 평가를 먼저 보장하지 않습니까? ab가 귀하의 질문에 나타냅니다보다 더 복잡한 경우

while (b-- && a--) 

은 물론,이 작동하지 않을 수 있습니다.

2

당신이 후위 감소를 사용하고 있기 때문에, 모든 것은 (. 당신이 정말 당신이 결정하는 마지막 줄 것을 필요 여부) 단순히

while (a && b) 
{ 
    --a; --b; 
    //some statements 
} 

--a; --b; 

를 다시 작성하지만 당신이 정말로 원하는 경우에 할 수있다 모든 것을 계속 채우려면 while 조건을 충족시키는 다른 방법이 있습니다. 예를 들어, 당신은 당신이 당신이 atrue 또는 false는 다음 쉼표를 사용할 수 있는지 여부를 두 번째 피연산자의 실행을 원하는 경우 !!

while(!!(a--) & !!(b--)){ 
    //some statements 
} 
1

와 피연산자를 "정상화"를 기억하는 & 연산자 && 연산자를 대체 할 수 있습니다 운영자. 나는 당신이 이것을 필요로한다고 생각합니다 :

while((b--, a--) && b) {...}