c语言的一些问题

#include<stdio.h>
main
{
float f=123.456;
printf("%f,%8f,%8.1f,%.2f,%.2e,%010.2f\n",f,f,f,f,f);
结果是
123.456001,123.456001, 123.5,123.46,1.23e+002, 0000123.46
高手分析下为什么是这个结果,越详细越好

1.%f中的f是单精度,其精确到小数后6位。 这个不仅在这里会是6位,你随便定义个f的类型,输出f的类型,一样精确到小数点后6位,所以这是最原始的输出(相比较你后面的输出)

2.%8f 中的8是从右边数占8个字的宽度。我们知道f输出的值是123.456001。可以输出123.456001的宽度是10(包括小数点在内)可知定义的8小于实际的10。这里有个规定,如果定义的小于实际的值就按实际输出。否则大于10就从右边开始填字最终不够的左边就用空格补充

3.%8.1f 中的8还是上一个的意思。后面的.1意思是数据精确到小数点后一位。所以输出的是123.5 显然字段宽度是5 ,小于定义的8 。所
以从右边开始 左边补了3个空的宽度来保证定义的8

4.%.2f 同上精确到小数后两位。所以输出的值是123.46,没有定义宽度所以不用考虑

5.%.2e e的意思是用科学计数法来表示(值大小不变), 且同样精确到小数点后两位所以输出1.23e+002(等同于123 如果是%.3e 就是1.234e+002即123.4)

6.%010.2f中的0和10应该区别开来看 10可以看出要10个宽度,小数精确到后两位所以输出123.46(这里精确到小数后几位都是四舍五入)但定义了10个宽度
所以按理来说是要补空位,但是有0 所以用0来补。(你也可以试下%020.2f 输出时补了14个0)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-07-13
格式字符
格式字符用以指定输出项的数据类型和输出格式。
①d格式:用来输出十进制整数。有以下几种用法:
%d:按整型数据的实际长度输出。
%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
%ld:输出长整型数据。
②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。
例:
main()
{ int a = -1;
printf("%d, %o", a, a);
}
运行结果:-1,177777
程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。
③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。
④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。
⑤c格式:输出一个字符。
⑥s格式:用来输出一个串。有几中用法
%s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。
%ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。
%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。
⑦f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
%f:不指定宽度,整数部分全部输出并输出6位小数。
%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。
⑧e格式:以指数形式输出实数。可用以下形式:
%e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
%m.ne和%-m.ne:m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。
⑨g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。
第2个回答  2009-07-13
结果应该是程序编译不过去,缺少反括号,我不是在这跟你无理取闹,做程序必须细心,又时编一个大程序差一个符号就会让你折腾一整天,所以告诉你以后要仔细。至于为什么只能说你对定义的理解不深刻,你去查谭浩强的书吧,在哪里你会得到明确的答案
相似回答