【问题标题】: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);
}

  1. 为什么编译没有错误?我希望在 main() 之前需要一个 bmi() 函数的原型。
  2. 当我调试程序时,高度是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多