c - 每次在c中输出不同?

标签 c printf format-specifiers

我正在尝试学习 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'),期望 floatdouble。这是未定义的行为,可能导致同一程序的每次执行都有不同的输出。第二个 printf 有同样的问题:%f 需要一个 floatdouble 但你传递了一个 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() 时被提升为 doubledouble 类型比 float 类型具有更高的精度,如果请求的小数位数多于提供的原始类型,后者可能会输出误导性值。

建议始终使用 double 进行浮点计算,并保留 float 类型以用于更适合的非常特殊的情况,例如计算机图形 API,一些二进制交换格式...

关于c - 每次在c中输出不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41921015/

相关文章:

python - 为什么 %e 在格式字符串中的行为与 %g 不同?

c - 在c程序中,当主线程终止时,整个进程是否终止?

c - 如何在c中打印0x0000000而不是(nil)和0x08ffffff而不是0x8ffffff

汇编保留寄存器值?

c - 为什么转换规范 %lf 不适用于 printf 中的 Double

c - sscanf - 带有可选/空格式说明符的解析帧

mysql - 使用 C 执行插入查询

c - 我如何处理整数溢出?

c - C中的枚举指针参数

c++ - 使用 snprintf 填充结构体