我正在尝试学习 C,但已经很困惑了。
#include <stdio.h>
int main(void)
{
int a = 50000;
float b = 'a';
printf("b = %f\n", 'a');
printf("a = %f\n", a);
return 0;
}
以上代码每次使用 gcc
都会产生不同的输出。为什么?
最佳答案
您为 %f
格式传递一个 int
值('a'),期望 float
或 double
。这是未定义的行为,可能导致同一程序的每次执行都有不同的输出。第二个 printf
有同样的问题:%f
需要一个 float
或 double
但你传递了一个 int
值。
这是更正后的版本:
#include <stdio.h>
int main(void) {
int a = 50000;
float b = 'a';
printf("a = %d\n", a);
printf("b = %f\n", b);
printf("'a' = %d\n", 'a');
return 0;
}
输出:
a = 50000
b = 97.000000
'a' = 97
启用更多警告编译,使用命令行参数 -Wall -W -Wextra
允许编译器执行更多一致性检查并提示潜在的编程错误。它会检测到发布的代码中的错误。
事实上 clang
仍然提示上面的更正:
clang -O2 -std=c11 -Weverything fmt.c -o fmt
fmt.c:8:24: warning: implicit conversion increases floating-point precision: 'float' to 'double' [-Wdouble-promotion]
printf("b = %f\n", b);
~~~~~~ ^
1 warning generated.
b
在传递给 printf()
时被提升为 double
。 double
类型比 float
类型具有更高的精度,如果请求的小数位数多于提供的原始类型,后者可能会输出误导性值。
建议始终使用 double
进行浮点计算,并保留 float
类型以用于更适合的非常特殊的情况,例如计算机图形 API,一些二进制交换格式...
关于c - 每次在c中输出不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921015/