浮点型中的 EOF 值 [duplicate]

EOF value in float type [duplicate]

提问人:Lourdh Irudhaya Selvam 提问时间:7/14/2023 最后编辑:mousetailLourdh Irudhaya Selvam 更新时间:7/14/2023 访问量:56

问:

在 Kernighan 和 Ritchie 的 C 书中,Im 要求编写一个程序来打印 EOF 的值

我写得对了:

#include <stdio.h>
void main(){
    printf("%d", EOF);
}

我得到 -1 作为答案,我做对了......但出于好奇,我输入了 .它显示 0.00000000%f%d

为什么?

我得到了我所期望的......但后者(以浮动类型打印),我是出于好奇而这样做的,并认为结果应该是 -1.0 或类似的东西。

C EOF

评论

1赞 Some programmer dude 7/14/2023
格式说明符和参数类型不匹配会导致未定义的行为。该格式需要一个值,而是一个值。%fdoubleEOFint
1赞 0___________ 7/14/2023
要将 if 打印为 float,您需要将其显式转换为 floatprintf("%f", (double)EOF);
4赞 12431234123412341234123 7/14/2023
@Someprogrammerdude OP 最有可能使用的 AMD64 对浮点参数使用与整数不同的寄存器。
1赞 12431234123412341234123 7/14/2023
OT:的返回类型不应为 。启用编译器警告(可能)。main()intvoid-Wall -Wextra
1赞 Ian Abbott 7/14/2023
除了包含格式字符串的第一个参数外,调用的所有参数都是 variadlc 参数,并将使用默认参数升级规则进行传递。( 声明 。是零个或多个可变参数的占位符。 使用格式字符串来决定它期望的可变参数及其类型。如果可变参数的实际数量或其类型与预期不符,则会导致未定义的行为printfprintfint printf(const char *restrict format, ...);, ...printf

答:

1赞 0___________ 7/14/2023 #1

如果 的参数与格式不匹配,则调用未定义行为 (UB)。printf

在传递给函数之前,您需要将其转换为双精度:printf

printf("%f", (double)EOF);