The C Book - 前言(2) 读谭师傅的书(13)
Apr 08

前面已经学完了第三章。由于google books不提供全文,每次只能看到一部分,所以估计以后都只能学习一些片段了。

今天要学习的是第四章,第4.5节。这节没看到开头部分,只能从79页看起。不过看起来是在讲标准I/O库里的函数。

1、谭师傅说,“f 格式符”是“用来输出实数(包括单、双精度)”。又忘了有long double这类型了。

2、谭师傅说,“单精度实数有效位数一般为7位“。这个以前已经学习过了,ANSI C规定这个有效位数最少6位,具体取决于编译器。类似地,双精度数有效位数最低为10位(谭师傅说“一般为16位”)。

3、 谭师傅似乎忘记了自己之前说过的,两个float作算术运算时会变成double。这个说法当然对于ANSI C不成立。但是,如果它成立的话(比如在旧版K&R C中),那么例4.6就是错的,因为在printf(”%f\n”, a+b)里面,虽然a和b都是float,但加了之后变double,而float和double都是用的%f来表示,因此printf会按double 的精度输出,怎么能看出有效数字只有7位呢?

4、谭师傅说,“%m.nf,指定输出数据共占m列…左端补空格”。其实,如果m是一个开头为0的数,补的就不是空格,是0。

5、 谭师傅说,用“%e”格式时,“有的C编译系统自动指定给出数字部分的小数位数为6位,…指数占3位”。本来谭师傅这里很有可能蒙对一个C标准的,十 分可惜。ANSI C规定,这种格式下默认小数位数就是6位,而不是什么“有的C编译器”。附带说一句,ANSI C规定的指数位数是至少两位。

6、 谭师傅在讲到“%g”格式时说,自动选择 f 或 e 格式的依据是“选择输出时占宽度较小的一种”。我们在这里看到,谭师傅又一次地想当然,自己制定“谭氏标准”了。课后思考题:若 a = 100000(10的5次方),则 printf(”f=%f,e=%e,g=%g\n”, a,a,a); 会输出什么?是选择宽度较小的一种吗?提示:ANSI C规定,当输出的数值太大(超过一个编译器决定的值),或太小(小于10的负4次方)时,用 e 格式,否则用 f 格式。

7、对于scanf谭师傅用心良苦地讲了“%d%d%d”的四种写法,哦,不是,是四种输入的方法。不过,在表4-3格式字符里,漏了一个 [ (左方括号)和一个 n 。在4-4附加格式说明字符里,又少了大写的L(谭师傅老是忘记还有long double这个型)。

8、谭师傅又教导我们说,scanf 的控制格式里也可以有一般字符,这是“为了使用户输入时添加必要的信息,使含义清楚,不易发生输入数据的错误”。看来谭师傅没有考虑到,同样的格式也用于 fscanf、sscanf,等等。就算是 scanf ,程序的输入还有可以是重定向(redirect)的或者是经过管道(pipe)的,大部时候不关“用户输入”什么事。

好了,第4.5节就学习完了。下次再继续

发表评论

CAPTCHA Image
*