c - 尝试理解这个 printf 格式化输出

标签 c printf

我不明白为什么这段代码会产生以下输出:

#include <stdio.h>

#define LOWER 0
#define UPPER 300
#define STEP 20

float c_to_f(float c);

int main(void) {
    for (int c = LOWER; c <= UPPER; c += STEP) {
        printf("%3.0f %6.1f\n", c, c_to_f(c));
    }

    return 0;
}

float c_to_f(float c) {
    return c * (9.0/5.0) + 32;
}

输出:

  0 5144477247317086170901765440027035767837163293591161256351693248184965237877467107389389528872273154691913581744607058050215827488351921876414407003384176234234181468372580859505320314312544948225387164490993094256968227227818959640206687395851530141696.0
  0 5144477248223936133773425621301895611375254354002848388186656757998856300277376171732587490599187934010444965285645525890922748188992798901374640654313592657351174354641522290319226294263523595109393871854132336451448805097328901373303486131449817464832.0
  0 5144477248704033172940775129035644940307184915397270987393402145547386862724386852855456999748731052473196874219136479453649941501096792620471234940099754293118994117960373636044235342472865231695044481634617817613232640440010635232001791344413616635904.0
  0 5144477249104114038913566385480436047750460383225956486732356635171162331430229087124514924040016984525490131663712274089255935927850120719718396844921555656258843920726083090815076215980649928849753323118355718581385836558912080114250379021883449278464.0
  0 5144477249344162558497241139347310712216425663923167786335729328945427612653734427685949678614788543756866086130457750870619532583902117579266693987814636474142753802385508763677580740085320747142578628008598459162277754230252947043599531628365348864000.0
  0 5144477249584211078080915893214185376682390944620379085939102022719692893877239768247384433189560102988242040597203227651983129239954114438814991130707717292026663684044934436540085264189991565435403932898841199743169671901593813972948684234847248449536.0

我确实明白 c 应该是 float ,而不是输出。任何帮助将不胜感激。

最佳答案

据我所知,这里的问题是

printf("%3.0f %6.1f\n", c, c_to_f(c));

c 是一个 int 并且您尝试使用 %f 打印它的值,即 undefined behavior .

对格式说明符使用不适当类型的参数是未定义的行为。

关于c - 尝试理解这个 printf 格式化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31928357/

相关文章:

c - 为平均值排序浮点值

c++ - UDP 数据包时间戳

c - 使用默认编译器(gcc-4.2)的 mac(OSX-10.9.2)上的 fork 与普通 fork 有什么不同吗?

c - 分析多进程程序

c - 如何从 TCP header 打印序列和确认号

c - printf 的输出乱序

使用变量选择在点后打印多少个数字

c - 1 字节有符号数的 printf 格式

c - 在 C 中将负数传递给 "%hu"

c - 如何避免 realloc 上的 valgrind 警告?