很久以前,我在一个论坛上偶然发现了一个有趣的问题,我想知道答案。
考虑以下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,非零。是不是 我不知道当时是否有原型。
_Bool
类型,也没有<stdbool.h>
标头。
f1()
到的文件复制到同一个文件中main()
,也会有些奇怪:虽然在C ++中()
用于空参数列表是正确的,但在C中用于具有尚未定义的参数列表的函数(它基本上期望在)
)之后有K&R样式的参数列表。要使用正确的C语言,您应该将代码更改为bool f1(void)
。