인프런 커뮤니티 질문&답변
isEven, isOdd 함수 관련 질문입니다
작성
·
679
0
12분 쯤에 함수포인터를 이용해서 true를 리턴하는 함수인 isEven과 isOdd가 있습니다.(이때는 return false가 없습니다 오직 조건이 맞을때 true만 리턴)
이것을 이용해서 값을 출력 해보니 isOdd일떈 1, 3, 5, 7, 9가 출력이 되지만
isEven이면 0,1,2,3,4,5,6,7,8,9 즉 배열이 다 출력이 됩니다
디버거로 찍어보니까 isOdd는 0일땐 false 1일땐 true 이런식으로 홀수일땐 true, 짝수일떈 false가 반환이 되지만
isEven 함수는 짝수, 홀수 구분없이 모두 true가 반환이 됩니다.
밑에 비슷한 질문이 있어서 보니까 cpu 산술연산에 의해 그렇다 라고 답변이 되어있는데
그렇다면 isOdd를 사용할시 0을 제외한 1부터 9까지는 모두 true가 반환되어야하는게 아닌가요?
잘 이해가 안되서 질문드립니다
답변 1
2
안녕하세요. 답변 도우미입니다 :)
우선 실험하셨던 코드를 함께 첨부해주실 수 있을까요?
질문글을 읽어보니 강의 코드와 다르게 작성해보신 후 질문 주신 것 같은데 어떻게 코딩 하셔서 isEven이면 0,1,2,3,4,5,6,7,8,9 배열이 다 출력 된 것인지 알기 어렵네요.
+
if (check_fcn(element)) cout << element;
뭔가 강의 코드대로 check_fcn(element) == true 로 하지 않으시고 그냥 check_fcn(element) 로 if 조건문 써보신 것 같은데 맞나요? 이렇게 하면 배열 원소 전부가 출력이 되네요.
저도 한번 실험을 해보았는데 isEven(1) == true 로 if 조건문을 작성할 땐 제대로 된 결과로서 Hello 가 출력되지 않았지만, if 조건문을 그냥 isEven(1) 로만 작성하면 1은 짝수가 아님에도 불구하고 hello 가 출력된 것을 확인할 수 있었습니다.
디버깅을 해보니 if (number % 2 == 0 ) 에 걸리지 못하여 return true 를 만나지 못했다면 그냥 true(244) 가 리턴 되었네요. 즉, 랜덤한 값인 244가 리턴되었고 이는 0 이 아닌 값이기 때문에 true 취급 되는 것입니다. return false 조건문을 넣어주었다면 여기에 걸리게 되어 false (0) 을 리턴하게 되어 Hello 가 출력되지 않았겠지만, 어떠한 return 문에도 걸리지 않았을 경우엔 랜덤한값 244 이런 값들로서 리턴된 것을 확인할 수 있었습니다. 조건식은 0 이 아닌값은 모두 true 로 처리하기 때문에 이 리턴값 244을 통해 if (244) 는 True 가 되어 홀수인 1 을 파라미터로 넘겼음에도 불구하고 isEven(1) 결과가 True 로 인식되어 hello 가 출력되었던 것 같네요!
https://stackoverflow.com/questions/43031743/bool-function-failure-to-return-true-or-false
You are missing a return statement if the loop fails, so the return value will be undefined. The compiler should have warned you about that.
위 링크에 따르면 bool 함수에서 return 문을 만나지 못하면 정의되지 않은 아무 값이나 리턴하게 되는 듯 합니다. 그 아무 값은 0 이 아닐테니 반환된 리턴값은 true 로 볼 수 있겠구요! (조건식은 결과가 0 이 아닌 모든 것은 True 로 인식하기 때문입니다.) 그래서 if (isEven(element)) 에서 element 가 홀수여도 return true; 를 만나지 못해 아무 랜덤값이나 리턴이 되었기 때문에 if 조건식 자체는 True 로 인식되었던 것입니다. 그래서 배열 전체 원소들이 출력되었던 것이구요.
isOdd 를 위와 같이 사용할때도 똑같네요. 짝수 파라미터를 넘긴 모습입니다.
아무튼 위와 같은 원리이기 떄문에
if (check_fcn(element)) 로만 쓰실 것이라면 이렇게 return false 문을 다 넣어주시거나
강의 코드와 똑같이 이렇게 return false 를 넣어주지 않았다면 반드시 if (check_fcn(element) == true) 로 작성해야 할 것 같습니다.
질문 주실 땐 강의와 똑같은 코드가 아니라면 코드 첨부도 꼭 함께 해주시길 부탁드립니다. :)






안녕하세요. 자세한 답변 정말 감사드립니다 :)
다만 작성해주신대로 if (check_fcn(ele) == true) 로 작성이 되어있더라구요
출력도 iseven일땐 0~9까지 출력이 됩니다
디버거로 찍어보니 iseven 함수안의if문이 조건이 맞지 않아도 true가 반환됩니다
다만isodd함수는 조건이 맞지 않으면 false가 반환이 되네요
뭐가 문제인지 잘 모르겠네요