Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么longDoubleNum是零_C - Fatal编程技术网

C 为什么longDoubleNum是零

C 为什么longDoubleNum是零,c,C,我是C语言的初学者,我的代码输出中有一个问题: #include <stdio.h> #include <stdlib.h> int main(void){ printf("float: byte %lu\n",sizeof(float)); printf("double: byte %lu\n",sizeof(double)); printf("long double: byte %lu\n",sizeof(long double));

我是C语言的初学者,我的代码输出中有一个问题:

#include <stdio.h>
#include <stdlib.h>

int main(void){

printf("float:      byte %lu\n",sizeof(float));
printf("double:     byte %lu\n",sizeof(double));
printf("long double:    byte %lu\n",sizeof(long double));

    float       floatNum =3.0/5.0;
    double      doubleNum=3.0/5.0;
    long double     longDoubleNum=3.0/5.0;


    printf("---------------------------------------\n");
    printf("float:       %1.4f      \n",floatNum);
    printf("double:          %1.4lf     \n",doubleNum);
    printf("long double:         %1.4Lf     \n",longDoubleNum);
    printf("---------------------------------------\n");

    printf("---------------------------------------\n");
    printf("float:       %1.20f     \n",floatNum);
    printf("double:          %1.20lf        \n",doubleNum);
    printf("long double:         %1.20Lf        \n",longDoubleNum);
    printf("---------------------------------------\n");

    printf("---------------------------------------\n");
    printf("float:       %1.60f     \n",floatNum);
    printf("double:          %1.60lf        \n",doubleNum);
    printf("long double:         %1.60Lf        \n",longDoubleNum);
    printf("---------------------------------------\n");
}

如果您使用的Windows编译器反过来又使用Microsoft的(非)标准C库,那么您将完全遇到您描述的问题。您还将收到以下警告:

警告:格式为[-Wformat=]的未知转换类型字符“L”

这是因为微软的lib(勉强)符合C(C90)的1990年版本,而不是1999年(C99)或更高版本。这意味着它无法识别C99中添加的任何printf/scanf转换说明符,如
%Lf
,但无论如何都会生成一个已损坏的二进制可执行文件

使用Mingw/gcc编译器,您可以解决如下问题:

#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>
...
定义使用ANSI标准1 #包括 ...
使用MSVC,你不能修复它,所以考虑用另一个编译器替换那个。

技术上,你的程序显示了未定义的行为。
size\u t
(由
sizeof
返回的值类型)的正确格式为
%zu
。格式和参数类型不匹配会导致UB。@DavidRanieri No.A
float
值将升级为
double
,这就是为什么
%f
%lf
可以互换地用于
float
double
%Lf
格式对于
长双精度
是正确的。参见,例如,您可能需要执行
longDoubleNum=3.0L/5.0L
否则它是一个精度为
double
的除法@DavidRanieri历史上没有不同的printf转换说明符用于
float
double
,两者都使用
%f
,因为默认参数升级使得参数
仍然是双的。但是,这确实使printf与scanf不一致,因此从C99及以后的
%lf
也允许
双精度
。至于
长双精度
,它总是
%Lf
带大写字母L。@AdrianMole是的,但如果你试图从1999年或更晚的时候给它指定转换说明符,它会变得非常简单。。。在mingw上,您可以在包含STDIO.h之前使用
#define uu USE u mingw_ANSI_STDIO 1
取消对其的模拟。我可以用mingw重现这个问题,define修复了它。
#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>
...