VS2019-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会发出以下警告,不应忽略这些警告

我有以下小型C程序(main.C):

#包括
int main(){
printf(“体重指数%.1f\n”,体重指数(85,1.5f));
返回0;
}
浮动体重指数(整数体重、浮动高度){
返回重量/(高度*高度);
}
  • 为什么它编译时没有错误?我希望在main()之前需要一个bmi()函数的原型
  • 当我调试程序时,高度是0.0而不是1.5!发生什么事了
  • 为什么它编译时没有错误

    C99标准之前用于允许隐式声明的C语言,VS默认为该行为。但是,在默认设置下,VS会发出以下警告,不应忽略这些警告

    (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'