나는 오래 전에 포럼에서 흥미로운 질문을 우연히 발견했으며 그 답을 알고 싶습니다.
다음 C 함수를 고려하십시오.
f1.c
#include <stdbool.h>
bool f1()
{
int var1 = 1000;
int var2 = 2000;
int var3 = var1 + var2;
return (var3 == 0) ? true : false;
}
false
이후 항상 반환해야합니다 var3 == 3000
. main
기능은 다음과 같습니다 :
main.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf( f1() == true ? "true\n" : "false\n");
if( f1() )
{
printf("executed\n");
}
return 0;
}
f1()
항상 반환해야 하므로 false
프로그램 이 화면에 하나의 거짓 만 인쇄 할 것으로 예상합니다 . 그러나 컴파일하고 실행 한 후에 실행 됨 도 표시됩니다.
$ gcc main.c f1.c -o test
$ ./test
false
executed
왜 그런 겁니까? 이 코드에는 일종의 정의되지 않은 동작이 있습니까?
참고 :로 컴파일했습니다 gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2
.
main()
단순화 될 수있다 int main() { puts(f1() == true ? "true" : "false"); puts(f1() ? "true" : "false"); return 0; }
이 더 나은 불일치를 보여주는 것입니다 -.
void
?
true
및 false
K & R 1 에드에. 그래서 전혀 그런 문제가 없었다. 참과 거짓은 단지 0이고 0이 아닙니다. 그렇지 않습니까? 당시 프로토 타입을 사용할 수 있었는지 모르겠습니다.
_Bool
유형과 <stdbool.h>
헤더 가 없었습니다 .
f1()
같은 파일에 복사하더라도main()
이상한 점이 있습니다 .C ++()
에서는 빈 매개 변수 목록 에 사용하는 것이 맞지만 C에서는 아직 정의되지 않은 매개 변수 목록이있는 함수에 사용됩니다 ( 기본적으로) 다음에 K & R 스타일 매개 변수 목록이 필요합니다)
. 올바른 C가 되려면 코드를로 변경해야합니다bool f1(void)
.