首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

【6.29第1问】自学C语言,每日多问一点,每天进步一点,各位热心人士请多关照

2012-08-03 
【6.29第1问】自学C语言,每天多问一点,每天进步一点,各位热心人士请多关照书上看到的程序:main(){int a15f

【6.29第1问】自学C语言,每天多问一点,每天进步一点,各位热心人士请多关照
书上看到的程序:
main()  
{  
  int a=15;  
  float b=123.1234567;  
  double c=12345678.1234567;  
  char d='p';  
  printf("a=%d,%5d,%o,%x\n",a,a,a,a);  
  printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b) ;  
  printf("c=%lf,%f,%8.4lf\n",c,c,c);  
  printf("d=%c,%8c\n",d,d);  
  getch();
 }  
用软件输出,得到以下结果:

a=15, 15,17,f
b=123.123459(问题1:这里应该是6,为何变成9了?),123.123459,123.1235,1.23123e+02(问题2:为什么不是1.23e+05或者是1.231e+04或者是1.2312e+03,为什么是1.23123e+02?)c=12345678.123457,12345678.123457,12345678.1235
d=p, p
书上已给出的解答,但仍有几点疑问:
第七行中以四种格式输出整型变量 a 的值,其中“%5d ”要求输出宽度为 5,而 a 
值为 15 只有两位故补三个空格。
第八行中以四种格式输出实型量 b 的值。其中“%f”和 
“%lf ”格式的输出相同,说明“l”符对“f”类型无影响(问题3:既然l对f类型无影响,那lf还有什么意义~?)。“%5.4lf”指定输出宽度为 5,精度 为 4,由于实际长度超过 5 故应该按实际位数输出,小数位数超过 4 位部分被截去。
第九行输出双精度实数,“%8.4lf ”由于指定精度为 4 位故截去了超过 4 位的部分。
第十行输出字 
符量 d,其中“%8c ”指定输出宽度为 8 故在输出字符 p 之前补加 7 个空格。  
  使用 printf 函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系 
统不一定相同,可以从左到右,也可从右到左。Turbo C 是按从右到左进行的。请看下面两 
个例子:

[解决办法]
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

[解决办法]
随便说个:
scanf里%lf和%f不同,是因为存放的变量不同,,

但printf传参时会自动把float转变成double,因此在printf里%lf和%f是相同的。
而你的第一问是因为float的精度不够发生了舍入
[解决办法]
float,double在计算机中是以2进制储存的。。也就是2的n次幂,小数中也就是2的-1,-2次幂。。也就是只能表示0.5,0.25。。。等等这些数,精度的损失是必然的
[解决办法]
具体执行结果跟你所使用的编译器有很大的关系,如果是初学的话,可以在linux下使用gcc

热点排行