2012-07-30 2 views
0

다음은 문제가있는 코드 섹션의 매우 단순화 된 버전입니다.if 문에 의한 C++ 부울 논리 오류

int i = 0; 
int count = 0; 
int time = 50; 
int steps = 1000; 
double Tol = 0.1; 
bool crossRes = false; 
bool doNext = true; 

for (int i=0; i<steps; i++) { 

//a lot of operations are done here, I will leave out the details, the only 
//important things are that "dif" is calculated each time and doNext either 
//stays true or is switched to false 

    if (doNext = true) { 
     if (dif <= Tol) count++; 
     if (count >= time) { 
      i = steps+1; 
      crossRes = true; 
     } 
    } 
} 

    if (crossRes = true) { 
     printf("Nothing in this loop should happen if dif is always > Tol 
       because count should never increment in that case, right?"); 
    } 

내 문제는 for 루프로 수행됩니다 때마다, 그것은 "(사실 crossRes =)이 경우"괄호는 횟수가 증가하지 않은 경우에도 내부의 문을 실행하는 것입니다.

+1

해당 == true입니다. = 값을 비교하는 대신 값을 할당합니다. –

+0

수정 된 코드를 질문에 편집하지 마십시오. 따라서 문제가 무엇인지 파악할 수 없으며 해답을 이해하지 못하게됩니다. 편집을 되돌릴거야. –

답변

2

가 나는 수정 스탠드 :

if (crossRes) 
이 문제가없는 것입니다 귀하의 조건 (= true로의 crossRes) 가 컴파일되지 않기 때문에 경우 있다면. `crossRes = true`는 'true'에 대한 대입이므로 항상 'true'로 평가됩니다. 당신은`crossRes을 원하는 == TRUE ': 경우 (crossRes == TRUE) { 의 printf는 ("DIF 항상 경우 카운트가 바로 그런 경우 증가해서는 안 때문에이 루프에서 아무것도> 톨 일이 없어야한다?"); }
+1

왜'((crossRes == true) == true)'? 재귀 이중화 예! –

+1

아니요, if (crossRes)를 원합니다. 'if (42 == x)'와 같은 소위 "요다 조건"은 ==/= 문제를 피할 수 있지만 IMHO는 추악합니다. –

1

=이 할당되면, ==은 동등 비교입니다. 당신이 원하는 : true

if (crossRes = true) { 

이 줄은 할당 crossRes : 당신은 일반적인 (그리고 매우 실망) 실수를 한

if (doNext = true) { // Bad code 
5

:

if (crossRes == true) { 

당신은 여기에 같은 실수를 true을 반환합니다. 더 간결

if (crossRes == true) { 

또는를 : 여기

if (crossRes) { 
+0

'if (crossRes) {'가 확실히 여기에서 사용하는 것이 가장 좋습니다. ' == true'는 매우 중복됩니다. –

1

다른 답변을 당신에게 문제를 말한 당신은 을 찾고있는 당신이 서명 다른 동등한 필요 의미 true으로crossRes을 비교합니다. 종종 컴파일러는 왼쪽

true == crossRes 

에 당신은 경고 대신 컴파일러 오류가 그런 식으로 일정한 기간을 넣을 수 있지만 방법은이 작업을 수행하지 않도록하는 것입니다 경고하고 그래서 할 수 없습니다 주목받지 못한 채로 탈출하다.

true = crossRes 

컴파일하지 않는다.

+0

저는 왜 어떤 사람들은 왼쪽에 상수를 넣는 지 궁금해 할 것입니다 ... 그것은 나에게 이상하게 보입니다, 그러나 이것은 좋은 설명입니다. – cdhowie

+1

일컬어 "야다 조건" –

1

처음에는 많은 사람들이 if (crossRes = true)으로 문제를 지적했지만, 그들은 (어쨌든) 어쨌든 if (doNext = true)과 같은 문제를 지적하지 않았습니다.

if (crossRes == true) (또는 심지어 if (true == crossRes))이 아닌 실제로 if (crossRes)을 지적하고 있습니다.

첫 번째 이유는 간단한 오타에서 같은 문제가 발생하지 않기 때문입니다.

두 번째는 비교의 결과가 bool 점이다 - 그래서 if (crossRes==true) 필요한 경우, 당신은 아마 확실하게 if (((((crossRes == true) == true) == true) == true)이 필요합니다 (자세한 어쩌면 몇 - 당신은 절대 모릅니다). 물론 이것은 완전히 바보가 될 것입니다. bool으로 시작하기 때문에 비교가 필요하지 않으므로 bool이됩니다.

나는 또한 비교를 원한다면 거의 항상 if (x == true)이 아닌 if (x != false)을 사용해야한다고 기록에 유의해야합니다. C++에는 실제로 적용되지 않지만 실제 부울 유형이없는 구식 C에서는 정수 유형을 사용할 수 있습니다.이 경우 true과 비교하면 잘못된 결과가 발생할 수 있습니다. 일반적으로 적어도 false은 0이고 true은 1이됩니다. 그러나 테스트 할 때 이면 0이 아닌 값인true에 해당합니다. 예를 들어 :

int x = 10; 

if (x) // taken 

if (x == true) // not taken, but should be. 

당신이 여기에 당신이 부울 값으로 시작하지 않는 경우는, 다음 if (<constant> <comparison> <variable>) 선호 (IMO) 의미가하고있다. 하지만 어쨌든 부울 값으로 시작할 때는 그냥 사용하십시오. 같은 것을 또 다른 것으로 만들어 내기 위해 비교를하지 마십시오.

+2

당신이 비교를 주장한다면, 당신은 그것을 극복해야합니다 *. 평등 또는 불평등의 값을 '참'또는 '거짓'과 비교하는 것은 불필요하며 잠재적으로 위험합니다. 'if (x)'또는'if (! x)'라고 써주십시오. [이 질문] (http://programmers.stackexchange.com/q/136908/33478) 및 [내 대답] (http://programmers.stackexchange.com/a/136933/33478)을 참조하십시오. –