【问题标题】:VS 2019 - C Compiler: strange behaviorVS 2019 - C 编译器:奇怪的行为
【发布时间】:2021-03-08 03:58:54
【问题描述】:
我有以下小 C 程序 (main.c):
#include <stdio.h>
int main() {
printf("bmi %.1f \n", bmi(85, 1.5f));
return 0;
}
float bmi(int weight, float height) {
return weight / (height * height);
}
- 为什么编译没有错误?我希望在 main() 之前需要一个 bmi() 函数的原型。
- 当我调试程序时,高度是 0.0 而不是 1.5!发生了什么事?
【问题讨论】:
标签:
c
visual-c++
compiler-errors
c99
【解决方案1】:
为什么编译没有错误?
C 语言用于在 C99 标准之前允许隐式声明,而 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 提升为错误 (/we"4013"),在这种情况下编译实际上会失败,而不仅仅是发出警告。在最新版本 16.8 和更高版本中,使用 /std:c11 编译应该禁用隐式声明并始终触发错误(免责声明:未尝试)。
当我调试程序时,高度是 0.0 而不是 1.5!怎么回事?
当编译器看到bmi(85, 1.5f) 调用时,它将假定隐式函数声明int bmi()。特别是,它将假定返回值为int,因此它将作为int 传递给printf。但是格式字符串"%.1f" 告诉printf 期待double 参数(遵循默认提升规则),所以接下来发生的是undefined behavior。