请解释此输出.浮点变量的值确实被类型转换为整数.请解释一下为什么?


#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"(。编译器可能打印了警告消息。但是,如果您不顾警告消息编译和链接程序,则程序可能会以各种方式运行异常。

相关内容

最新更新