#include<stdio.h>
#define pii 3.14
void main()
{
const float pi=3.0f;
printf("pi= %d n",pi);
printf("Pi= %d",pii);
}
输出为 :
pi= 0 Pi= 1374389535
我知道要打印浮点值,我们应该使用 %f,但为什么当我们使用 %d 时它不是以整数形式转换的。
%d
指示printf
期待一个int
的参数。它不指示编译器执行任何转换。C 标准不定义传递错误的参数类型时会发生什么。下面描述了常见实现中发生的情况。
将参数传递给函数由编译器处理。当您提供double
参数(如pii
(时,它会将该参数传递给作为double
参数调用的例程。当您传递float
参数(如pi
(时,由于将参数处理到参数列表中用...
声明的函数的规则,该参数将转换为double
。
处理参数由printf
处理。它使用格式字符串来了解预期内容。当它看到%d
时,它会尝试读取int
。当你传递了一个double
而不是一个int
时,它无法读取int
——它可能会读取错误的数据,因为不同类型的参数以不同的方式传递,并且,即使它确实读取了正确的数据,它也会尝试根据int
规则解释该数据的位, 不double
.
好的编译器可以观察到你正在调用printf
,检查format
字符串,将其与参数进行比较,并在不匹配时警告你。(但是,编译器无法在所有情况下都执行此操作,因为格式字符串可能是在程序执行期间计算的,而不是常量(如"pi= %d"
(。编译器可能打印了警告消息。但是,如果您不顾警告消息编译和链接程序,则程序可能会以各种方式运行异常。