我对编程很新,我开始习惯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在打印出两种不同类型时没有任何问题.不能强制进入浮点数吗?有人可以解释这个或指出我正确的方向吗?
谢谢!
您正在调用未定义的行为.
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)
| 归档时间: |
|
| 查看次数: |
772 次 |
| 最近记录: |