gpt4 book ai didi

c - 为什么 "printf()"有这种模棱两可的行为?

转载 作者:行者123 更新时间:2023-12-03 18:32:10 26 4
gpt4 key购买 nike

我故意强制 printf()celsius 作为 int 打印(使用 %8d 格式说明符)。我知道这是打印 0 (在 Celsius Scale 标题下)的原因。

但我只想知道为什么 fahr 会在整个表中打印 0.0

我用过 GCC 编译器。

这是 摄氏到华氏转换 的代码:

#define LOWER 0.0F
#define UPPER 300.0F
#define STEP 20.0F

#include <stdio.h>

void main() {
float celsius, fahr;
printf("*Conversion from Celsius to Fahrenheit*\n");
printf("Celsius Scale \t Fahrenheit Scale\n");
for (celsius = LOWER; celsius <= UPPER; celsius = celsius + STEP) {
fahr = (9.0f * celsius / 5.0f) + 32.0f;
printf("%8d\t\t%5.1f\n", celsius, fahr);
}
}

下表是上述代码的 输出 :
*Conversion from Celsius to Fahrenheit*
Celsius Scale Fahrenheit Scale
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0
0 0.0

最佳答案

您有 未定义行为 (这意味着它无法“预测”操作的结果是什么),因为您将 float 参数传递给 printf 当它需要 int 参数(对于 %8d )格式时。

从这个 C11 Draft Standard :

7.21.6 Formatted input/output functions
...
9 If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.


fahr 值显示不正确的确切原因很难确定,但这可能与 float 参数被提升为 double 的事实有关,它的大小与预期的 int 类型不同,因此调用堆栈(或者,如果参数在寄存器中传递,则调用“frame”)已损坏。

也许值得注意的是,在我的系统(MSVC,64 位)上,运行您的代码会显示 celsius 字段的零,但 会显示 fahr 的正确 值。 (但是为 32 位目标编译 确实 重现了您的问题!)

要解决此问题,请将 celsius 参数显式转换为 int :

void main()
{
float celsius, fahr;
printf("*Conversion from Celsius to Fahrenheit*\n");
printf("Celsius Scale \t Fahrenheit Scale\n");
for (celsius = LOWER; celsius <= UPPER; celsius = celsius + STEP) {
fahr = (9.0f * celsius / 5.0f) + 32.0f;
printf("%8d\t\t%5.1f\n", (int)celsius, fahr);
}
}

关于c - 为什么 "printf()"有这种模棱两可的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61696933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com