生手求解答。
新手求解答。。
这个是我照着《c priemr plus》抄的:
#include<stdio.h>
int main(void)
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.23e-5;
printf("%f can be written %e\n", aboat, aboat);
printf("%f can be written %e\n", abet, abet);
printf("%f can be written %e\n", dip, dip);
return 0;
}
编译查出的错误是这么说的[Error] ld returned 1 exit status
但是又可以运行:

但是树上的输出结果是
32000.000000 can be written 3.200000e+04
2140000000.000000 can be written 2.140000e+09
0.000053 can be written 5.320000e-05
这是怎么回事呢?新手求解答,,谢谢万能的网友!!
------解决方案--------------------
因为程序结果跟机器的大小尾端和编译器给 long double 分配的长度有关, 只有在编译器分配 long double 跟 double 一样长, 是8字节的时候, 程序执行正确, 就像书上的例子一样, 很多编译器确实是这么做的, 因为C99标准只要求 long double 不比 double 更短. 一样长是允许的. 而你的编译器的long double比8字节长, 就出问题了.
具体到这个题, 我认为其实是作者笔误的可能性比较大, 我翻了这本书, 这段代码对应的文字描述写明白了 long double 是要用 %Lf, %Le的:
The long double type requires the %Lf, %Le, and %La specifiers to print that type. (C Primer Plus 第五版 PDF 72页)
所以猜测可能作者写示例的时候写错了, 而他的编译器恰好是把long double处理成8字节, 执行结果一样, 所以没有发现这个问题.
这个是我照着《c priemr plus》抄的:
#include<stdio.h>
int main(void)
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.23e-5;
printf("%f can be written %e\n", aboat, aboat);
printf("%f can be written %e\n", abet, abet);
printf("%f can be written %e\n", dip, dip);
return 0;
}
编译查出的错误是这么说的[Error] ld returned 1 exit status
但是又可以运行:
但是树上的输出结果是
32000.000000 can be written 3.200000e+04
2140000000.000000 can be written 2.140000e+09
0.000053 can be written 5.320000e-05
这是怎么回事呢?新手求解答,,谢谢万能的网友!!
------解决方案--------------------
因为程序结果跟机器的大小尾端和编译器给 long double 分配的长度有关, 只有在编译器分配 long double 跟 double 一样长, 是8字节的时候, 程序执行正确, 就像书上的例子一样, 很多编译器确实是这么做的, 因为C99标准只要求 long double 不比 double 更短. 一样长是允许的. 而你的编译器的long double比8字节长, 就出问题了.
具体到这个题, 我认为其实是作者笔误的可能性比较大, 我翻了这本书, 这段代码对应的文字描述写明白了 long double 是要用 %Lf, %Le的:
The long double type requires the %Lf, %Le, and %La specifiers to print that type. (C Primer Plus 第五版 PDF 72页)
所以猜测可能作者写示例的时候写错了, 而他的编译器恰好是把long double处理成8字节, 执行结果一样, 所以没有发现这个问题.