VS2019-C编译器:奇怪的行为
我有以下小型C程序(main.C):VS2019-C编译器:奇怪的行为,c,visual-c++,compiler-errors,c99,C,Visual C++,Compiler Errors,C99,我有以下小型C程序(main.C): #包括 int main(){ printf(“体重指数%.1f\n”,体重指数(85,1.5f)); 返回0; } 浮动体重指数(整数体重、浮动高度){ 返回重量/(高度*高度); } 为什么它编译时没有错误?我希望在main()之前需要一个bmi()函数的原型 当我调试程序时,高度是0.0而不是1.5!发生什么事了 为什么它编译时没有错误 C99标准之前用于允许隐式声明的C语言,VS默认为该行为。但是,在默认设置下,VS会发出以下警告,不应忽略这些警告
#包括
int main(){
printf(“体重指数%.1f\n”,体重指数(85,1.5f));
返回0;
}
浮动体重指数(整数体重、浮动高度){
返回重量/(高度*高度);
}
(4,30): warning C4013: 'bmi' undefined; assuming extern returning int
(4,12): warning C4477: 'printf' : format string '%.1f' requires an argument of type 'double', but variadic argument 1 has type 'int'
您可以将C4013
升级为错误(),在这种情况下,编译实际上将失败,而不仅仅是发出警告。在最新版本16.8及更高版本中,使用编译应禁用隐式声明并始终触发错误(免责声明:未尝试)
当我调试程序时,高度是0.0而不是1.5!发生什么事了
在编译器看到bmi(85,1.5f)
调用时,它将假定隐式函数声明intbmi()
。特别是,它将假定返回值是int
,因此它将作为int
传递给printf
。但是格式字符串“%.1f”
告诉printf
需要一个double
参数(遵循默认的升级规则),因此接下来会发生什么
(4,30): warning C4013: 'bmi' undefined; assuming extern returning int
(4,12): warning C4477: 'printf' : format string '%.1f' requires an argument of type 'double', but variadic argument 1 has type 'int'