| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11656 人关注过本帖, 8 人收藏
标题:[原创]C语言思考——复杂类型的不一致性
只看楼主 加入收藏
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
不对,楼上说的不对
对齐是会,不过不会什么“晋升”
float会扩展成double是无稽之谈

[color=white]
2008-05-26 21:51
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
12.7 有人告诉我在printf 中使用%lf 不正确。那么, 如果scanf() 需要
%lf, 怎么可以用在printf() 中用%f 输出双精度数呢?
printf 的%f 标识符的确既可以输出浮点数又可以输出双精度数。根据“缺
省参数扩展” 规则, 不论范围内有没有原形都会在在类似printf 的可变长度参
数列表中采用, 浮点型的变量或扩展为双精度型, 因此printf() 只会看到双精度
数。printf() 的确接受%Lf, 用于输出长双精度数。参见问题12.11 和15.2。

15.2 为什么%f 可以在printf() 参数中, 同时表示float 和double?他
们难道不是不同类型吗?
“参数默认晋级” 规则适用于在可变参数中的可变动部分: char 和short int 晋
级到int, float 晋级到double。同样的晋级也适用于在作用域中没有原型说明的函
数调用, 即所谓的“旧风格” 函数调用, 参见问题11.4。所以printf 的%f 格式总是
得到double。类似的, %c 总是得到int, %hd 也是。参见问题12.7, 12.13。

以上两则资料摘自CFAQ。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 22:10
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
[bo][un]雨中飛燕[/un] 在 2008-5-26 21:51 的发言:[/bo]

不对,楼上说的不对
对齐是会,不过不会什么“晋升”
float会扩展成double是无稽之谈


  在K&R C时代好像是会扩展的啊???呵呵。。。

樱花大战,  有爱.
2008-05-26 22:10
prinse
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-4-8
收藏
得分:0 
确实是一位难得的思索者!

C语言从一开始就并没有考虑表现上的一致!可以说,C语言力图表现计算机的一种模型抽象。很可惜,计算机不可能有表现的一致性,就象现实的世界中不可能有所谓“完美”的一致性一样。设想一下,如果一个社团表现出高度的一致性,那是一件多么可怕的事情啊!

赞楼主的深层思索。虽然不是非常赞同楼主的某些观点或提法,但仍然期待后续。
2008-05-26 22:10
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
本来形参是float的还会先变为double再变回float么??

[color=white]
2008-05-26 22:16
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
燕子换个图片吧。。这个有点会吓坏小朋友得。。。呵呵

学习需要安静。。海盗要重新来过。。
2008-05-26 22:25
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
好主意~~~~~~偶去换一些吓人的图片,换掉原来的可爱风格~~~~~~~~
挖咔咔。。。。。。

[color=white]
2008-05-26 22:35
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
上面的第二则资料的依据是ISO IEC9899:1990的Sec6.3.2.2,我手上只有C++03和C99标准,没有C89的标准,有的朋友可以帮忙验证一下。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 22:39
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
[bo][un]雨中飛燕[/un] 在 2008-5-26 22:16 的发言:[/bo]

本来形参是float的还会先变为double再变回float么??



这种提法不对。应该是内部处理%f的只是处理double而已,也就是说,printf仅仅只面对32位的double,它没有机会面对float。所以不会再换回float。只是取得精度不同而已。就像我写在文章中的那个例子。虽然是%hx,但是仍然取得32比特,然而只使用其中的16比特位而已。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 22:41
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
12.7 有人告诉我在printf 中使用%lf 不正确。那么, 如果scanf() 需要
%lf, 怎么可以用在printf() 中用%f 输出双精度数呢?
printf 的%f 标识符的确既可以输出浮点数又可以输出双精度数。根据“缺
省参数扩展” 规则, 不论范围内有没有原形都会在在类似printf 的可变长度参
数列表中采用, 浮点型的变量或扩展为双精度型, 因此printf() 只会看到双精度
数。printf() 的确接受%Lf, 用于输出长双精度数。参见问题12.11 和15.2。
参考资料: [K&R1, Sec. 7.3 pp. 145-47, Sec. 7.4 pp. 147-50]; [K&R2, Sec.
7.2 pp. 153-44, Sec. 7.4 pp. 157-59]; [ISO, Sec. 7.9.6.1, Sec. 7.9.6.2]; [H&S, Sec.
15.8 pp. 357-64, Sec. 15.11 pp. 366-78]; [CT&P, Sec. A.1 pp. 121-33]。

15.2 为什么%f 可以在printf() 参数中, 同时表示float 和double?他
们难道不是不同类型吗?
“参数默认晋级” 规则适用于在可变参数中的可变动部分: char 和short int 晋
级到int, float 晋级到double。同样的晋级也适用于在作用域中没有原型说明的函
数调用, 即所谓的“旧风格” 函数调用, 参见问题11.4。所以printf 的%f 格式总是
得到double。类似的, %c 总是得到int, %hd 也是。参见问题12.7, 12.13。
参考资料: [ISO, Sec. 6.3.2.2]; [H&S, Sec. 6.3.5 p. 177, Sec. 9.4 pp. 272-3]。

贴士完整的内容,大家可以根据参考找到相关资料,特别是标准。注意这里的ISO Sec 6.3.3.2。很遗憾的是,ISO C++03没有对可变参数的说明,刚刚翻了很久。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 22:44
快速回复:[原创]C语言思考——复杂类型的不一致性
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035802 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved