C:使用printf()进行数据类型和转换

byr*_*sj1 2 c

我对编程很新,我开始习惯C.如果这是一个重复的问题,我道歉(我不知道底层的过程,即搜索什么).

我正在使用一个简单的程序来熟悉数据类型的细微差别:

main(){
    int i;
    float a,b;


    i = 2;
    a = 2.0;
    b = 4.0;

    printf("%d %1.1f", i/b,a/b);
}
Run Code Online (Sandbox Code Playgroud)

我希望程序打印0 0.5(因为a和b都是浮点数,我将它们的比率打印为浮点数),但程序打印0 0.0(我正在使用gcc -o).但是,当我反转printf顺序(不切换相应变量的顺序)时,即:

printf("%1.1f %d", i/b,a/b);
Run Code Online (Sandbox Code Playgroud)

打印结果是0.5 0.我不确定这里发生了什么.似乎在第一个程序中,b在i/b中被转换为int,并且无法在a/b中转换为float.但是,在第二个变体中,b在打印出两种不同类型时没有任何问题.不能强制进入浮点数吗?有人可以解释这个或指出我正确的方向吗?

谢谢!

dfo*_*gni 7

您正在调用未定义的行为.

printf是一个vararg函数,格式字符串与其他参数如何传递给函数之间没有任何联系.通常的/apply 规则i/b保持双精度并按原样传递给printf,当函数尝试将其作为int读取时,这会导致未定义的行为.

如果使用-Wall编译,您将看到这些警告

a.c: In function ‘main’:
a.c:12:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]
     printf("%d %1.1f", i/b,a/b);
             ^
Run Code Online (Sandbox Code Playgroud)