繁体   English   中英

请解释这个output。浮点变量的值确实被类型转换为integer。请解释为什么?

[英]Please explain This output.Value of float variable do get typecast to integer.Please explain why?

#include<stdio.h>
#define pii 3.14

void main()
{
    const float pi=3.0f;

    printf("pi= %d \n",pi);
    printf("Pi= %d",pii);
}

Output 是:

 pi= 0 Pi= 1374389535

我知道要打印浮点值我们应该使用 %f 但为什么当我们使用 %d 时它没有在 integer 中进行类型转换。

%d指示printf期待一个int参数。 它不指示编译器执行任何转换。 C 标准没有定义传递错误参数类型时会发生什么。 下面是对常见实现中发生的情况的描述。

将 arguments 传递给 function 由编译器处理。 当您提供诸如pii之类的double参数时,它会将该参数作为double参数传递给被调用的例程。 当您传递一个float参数(如pi )时,由于处理 arguments 的规则,它会转换为double到在其参数列表中用...声明的函数。

处理 arguments 由printf处理。 它使用格式字符串来了解期望的内容。 当它看到%d时,它会尝试读取一个int 当您传递的是double而不是int时,它无法读取int — 它可能会读取错误的数据,因为不同类型的 arguments 以不同的方式传递,即使它确实读取了正确的数据,它也会尝试根据int而非double的规则解释该数据的位。

好的编译器可以观察到您正在调用printf ,检查format字符串,将其与 arguments 进行比较,并在不匹配时警告您。 (但是,编译器不能在所有情况下都这样做,因为格式字符串可能是在程序执行期间计算的,而不是常量,例如"pi= %d" 。)您的编译器可能会打印一条警告消息。 但是,如果您不顾警告消息编译和链接该程序,该程序可能会以各种方式出现异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM