2013-10-30 2 views
-1

내 기능을 실행하는 데 문제가 있습니다. 이 프로그램은 3 개의 숫자 그룹이 유효한지 또는 200과 800 사이인지 아닌지를 확인합니다. 심지어 -5와 같은 값이 유효하지 않다고해도 결과는 여전히 유효합니다. 누군가가 문제를 파악하도록 도와 줄 수 있습니까?기능에 대한 잘못된 메시지 받기

답변

2

bool 변수를 초기화하지 않으므로 정의되지 않은 동작이 실행되고 있습니다.

C 및 C++에서 표현식은 0으로 평가 될 때 "거짓"으로 간주됩니다. 그렇지 않으면 true로 간주됩니다. 무슨 일이 일어나고 무엇

if (!0) 
    std::cout << "!0 is true" << std::endl; 
if (3) 
    std::cout << "3 is true" << std::endl; 
if (255) 
    std::cout << "255 is true" << std::endl; 

프로그램이 ansa, ansb 및 스택에 ansc을위한 공간을 할당된다는 점이다. 이러한 위치가 이전 함수 호출에서 프로그램에 의해 이미 사용 된 경우 'true'로 평가되는 0이 아닌 값을 가질 수 있습니다.

당신은 기본적으로 false로 다음을 설정해야합니다

bool ansa = false, ansb = false, ansc = false, overall = false; 

또는 당신이 그들의 조건의합니다 ('다른 사람'의 경우를 충족되지 찾을 때 당신은 그들에게 "거짓"의 값을 할당하셔야합니다 테스트) : - 그룹이 유효하려면 즉, 세 가지 변수가 유효해야합니다 또한

bool isitavalidgroup (int a, int b, int c) 
{ 
    bool ansa, ansb, ansc, overall; 

    if ((a <= 800) && (a >= 200)){ 
     ansa = true; 
    } 
    else { 
     cout << a << " is invalid" << endl; 
     ansa = false; 
    } 
    if ((b <= 800) && (b >= 200)) { 
     ansb = true; 
    } 
    else { 
     cout << b << " is invalid" << endl; 
     ansb = false; 
    } 
    if ((c <= 800) && (c >= 200)) { 
     ansc = true; 
    } 
    else { 
     cout << c << " is invalid" << endl; 
     ansc = false; 
    } 
    if (ansa && ansb && ansc == true){ 
     overall = true; 
    } 
    else { 
     overall = false; 
    } 
    return overall; 
} 

, 당신은 "단락"논리를 사용하도록 코드를 다시 작성할 수 있습니다. 유효하지 않은 것이 있으면 즉시 그 그룹이 더 이상 유효하지 않다는 것을 알게됩니다. 따라서 처음 오류가 발생했을 때 오류를 발견하면 오류를 모두 반환합니다.

if (a && b && c) 

"는과"는 "& &"수단 a이 false 인 경우, 그래서 조건이 true가 될 수 없습니다, 그래서 가서 bc도에 해당하는 경우 알아낼 할 이유가 없다.

bool isItAValidGroup(int a, int b, int c) 
{ 
    if (a < 200 || a > 800) { 
     cout << a << " is invalid" << endl; 
     return false; 
    } 
    if (b < 200 || b > 800) { 
     cout << b << " is invalid" << endl; 
     return false; 
    } 
    if (c < 200 || c > 800) { 
     cout << c << " is invalid" << endl; 
     return false; 
    } 

    // everything passed. 
    return true; 
} 
1

ansa, ansb 또는 ansc를 초기화하지 않았습니다. 조건문에서 명시 적으로 true로 설정하지만 false로 설정하지는 마십시오. 따라서이 값은 정의되지 않으며 0으로 초기화되지 않는 한 true로 간주됩니다.