2009-07-10 11 views
6

우선, 시작하기 전에 Windows OS에서 Intel core2를 실행하는 VC++ 2008 Professional을 사용하고 있습니다. 또한이 코드는 Windows를 실행하는 core2/corei7 이외의 다른 프로그램에서 실행되지 않습니다.while 루프의 조건 순서

다음과 같은 두 가지 조건의 while 루프가 있습니다. 참고 : 훨씬 단순화 된 버전입니다.

while((a != b) && (array[a] < c)) 

제 조건 (a != b) 거짓 생성하는 경우는 제 2 상태도 평가 될 것인가? 또는 루프가 바로 거기에서 종료 될 것입니까?

나는 몇 가지 테스트를 실시했으며, 실제로 사실 인 것 같습니다.

그러나 여기 캐치가 있습니다. 첫 번째 조건이 거짓을 평가하면 두 번째 조건은 평가 된 경우 액세스 위반을 생성합니다. 그러나, 내가 볼 수있는 것으로부터, 일단 첫 번째 조건이 거짓으로 평가되면, 프로그램은 두 번째 조건을 평가하는 것을 귀찮게하지 않고 루프를 종료하여 나를 절약합니다.

문제는 내가 아주 멋지고 깔끔한 코드를 갑자기 나에게 불어 넣지 않으면 액세스 위반 문제를 해결할 수 없다는 것입니다. 그러나, 작은 "버그"(나는 컴파일러 최적화가 아니라 버그라는 것을 알고있다.) 때문에, 나는 그것을 벗어날 수있을 것 같다. 나는 또한 이것이 아마도 좋은 프로그래밍 연습이 아니라는 것을 알고 있습니다. 솔직히 말해서, 제 상황에서는, 그것이 작동한다면, 저는 이미 게임보다 앞서 있습니다.

제 질문은이 "버그"또는 프로그래밍 과실이 다시 나타나서 언젠가는 나를 물습니까? 비록 내가이 섹션에서 지옥을 테스트하고 이것이 단지 한 번 사용했을 것이라고 생각할 때조차도?

+0

와우, 많은 질문이 있습니다. 너는 나의 메신저를 단지 추가 하야한다. –

+0

다시 너! 당신은 MM에게 메시지를 보내고 내 메신저를 주실 수 있습니다. 야, 네가있는 곳의 3AM 같아! 잠들지 않니? 너 여기 있니? (나는 다른 사람들이 잠 들어있어 나를 괴롭히지 않아서 내 논문을 끝내기가 너무 늦기 때문에 나는 단지 늦다.) – Faken

+0

주기적으로 몇 개의 사이트를 확인하며 질문은 항상 내 관심사를 파악하고 페이지 상단 근처에 있습니다. 조금 무서워지고있어. 나는 2 시간 만에 조기 체육관에 올랐다. –

답변

22

두 번째 조건은 첫 번째 조건이 true로 평가되지 않으면 평가되지 않습니다. 당신은 이것에 의지 할 수 있습니다. 수백만 줄의 코드가 작동합니다. C 및 C++이 논리적 표현식 평가를 단축하는 방법이기 때문입니다.

당신은 그것을 사용하고 그것을 의지 할 수 있습니다. 첫 번째 표현식이 거짓으로 평가되는 경우 두 번째는 심지어 시작을 평가하지 않습니다.

+3

그러나 첫 번째 조건이 false를 반환하도록 만드는 상태에서 평가 된 경우 두 번째 조건으로 인해 프로그램이 중단 될 가능성이 있더라도이 확인을 사용할 수 있습니까? – Faken

+0

예, 모든 표준 준수 C++ 구현은이를 보장합니다. – sharptooth

+1

@Faken - 네, 괜찮습니다. 걱정마! –

2

평가되지 않습니다. 그러나 염려한다면 모든 것이 일상적인 코드가 다시 물러나 서 당신이 쓰고있는 것을 재평가해야합니다. 당신은 프로그래밍 실천이 좋지 않다는 것을 인정했습니다. 당신은 이미 그것의 문제가 될 것을 알고 있습니다. 이러한 조건이 충족되면 문제를 해결하십시오. 아침에 너는 싫어할거야.

+0

나는 이해하지만, 내가 작성한 코드의 내 작은 멋지고 깔끔한 13 줄은 제대로 작동하기 위해 이것에 의존한다 ... 나는 그것을 고치면 많은 interms 속도와 효율성을 잃어 버릴 것이다. 내가 뜻하는 바를 말하면 코드 실행은 2-3 배 정도 느려질 것입니다. – Faken

+0

걱정하지 마십시오. 짧은 커큐어 평가에 따라 코드를 작성합니다. 루프 상태가 처음에 거짓이면 while 루프가 시작될 것이라고 예상하지 않습니까? 여기도 마찬가지입니다. – sharptooth

+0

나는 그것이 흥미롭지 않다. 왜 그것이 프로그래밍이 안좋은가? –

4

이것은 버그가 아닙니다. C++는 단락 회로 평가를 사용하므로 첫 번째 조건이 거짓 일 때 두 번째 조건이 평가되지 않습니다.

1

이 언어는 이러한 단락 동작을 보장하므로 사용하는 데 전혀 신경 쓸 필요가 없습니다. 그것은 또한 || - 첫 번째 조건이 참이면 두 번째 조건이 평가되지 않습니다.

1

C++ 논리 AND 및 OR 연산자의 단락 동작에 대한 단점은 나쁜 습관으로 간주되어서는 안됩니다. 그것은 완벽하게 관용적이며 더 명확하고 간결한 코드로 이어집니다.

예.단락 &&을 가진

std::auto_ptr<SomeObject> data; 

: &&의 단락을 사용하지 않고

// Clear expired data, if present 
if(data.get() && data->expired) 
    data.reset(); 

당신은 더 자세한 코드에 리드 if의 여분의 수준이 필요합니다.

// Clear expired data, if present 
if(data.get()) 
{ 
    if (data->expired) 
     data.reset(); 
} 
1

첫 번째 조건이 참이 아닌 경우 두 번째 조건은 계산되지 않습니다. 당신이 말했듯이,이 최적화는 모든 C++ 컴파일러에 의해 뒤 따른다.

여전히 사용할 수 없다면 잠시 동안 간단한 if 문을 추가하십시오.

while (a != b) { 
    if (array[a] < c) 
    { 
     // your code goes here. 
    } 
    else 
    { 
     break; 
    } 
} 
관련 문제