gpt4 book ai didi

c - printf 的意外输出

转载 作者:行者123 更新时间:2023-12-02 06:36:15 24 4
gpt4 key购买 nike

int a=5;
float b=3.5;
printf("%d",b);
printf("\n%f",a);

谁能告诉我为什么这段代码显示意外输出(垃圾\n3.5)

最佳答案

您正在为 %d 格式字符串传递一个 float,但是 printf 需要一个 int

printf 是一个可变参数列表函数:printf(const char *format_string,...);

这意味着格式字符串之后的其余参数可以是任何类型和数字,编译器不知道它们应该是什么。由程序员提供 printf 期望的类型的参数。 printf 期望的内容由格式字符串决定。当您在格式字符串中提供 %d 时,printf 函数将期望下一个参数是 int。由于您传递的是 float,因此可能会发生一些奇怪的事情。例如,组成 float 的那些字节可能会被视为一个 int,这不会给您任何有意义的值。

实际上它比那要复杂一点。关于如何将参数传递给可变参数函数有一些特殊的规则。规则之一是 float 值作为 double 传递。这意味着您的 float 值在传递给 printf 之前首先转换为 doubledouble 在您的平台上很可能是八个字节,而 int 只有四个字节。因此 printf 函数可以将 double 值的前四个字节视为 int

也许更糟糕的是,在下一行中,int 被传递到预期为 double 的地方。这意味着 printf 函数可以将 int 的前四个字节视为 double 的一部分,然后读取另外四个字节'甚至是你的论点的一部分。

实际发生的细节因平台而异。该语言只是声明您不应该传递错误类型的参数,并且不保证如果您这样做了就会发生。

关于c - printf 的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17898186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com