| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11656 人关注过本帖, 8 人收藏
标题:[原创]C语言思考——复杂类型的不一致性
只看楼主 加入收藏
prinse
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-4-8
收藏
得分:0 
嗯,别说小朋友,“大”朋友和“老”朋友也会被吓着的。

话说 float x='M'; printf("%f",x);  中的 float  x 会被“升级”为 double 确实说不过去!

printf("%c",'M'); 中的参数在传递的时候会占 32  bits 用“升级”的说法勉强也说得过去,因为本质说在C语言看来,char 也是整数(只不过只有8-bits 就是了)。不过更根本的原因是计算机体系结构中,堆栈通常是按机器字对齐的。
2008-05-26 22:50
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
Orz要下载一份C89标准真难啊……我放弃了……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 22:54
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
回复 21# prinse 的帖子
void func(int a,...)
{
    va_list list=NULL;
    va_start(list,a);
    printf("func:%f\n",va_arg(list,float));
    printf("func:%X\n",va_arg(list,int));
    va_end(list);
}

我写了这个函数准备试验,结果GCC给出了警告:
C:\Users\StarWing.StarWing-PC\Desktop\block\test.cpp:9: warning: `float' is promoted to `double' when passed through `...'
C:\Users\StarWing.StarWing-PC\Desktop\block\test.cpp:9: warning: (so you should pass `double' not `float' to `va_arg')

我想这已经很说明问题了。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 23:04
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
#include <iostream>
#include <cstdarg>


void func(int a,...)
{
    va_list list=NULL;
    va_start(list,a);
    printf("func:%lld\n",*(long long*)(&a+1));
    va_end(list);
}

int main()
{
    float a=1.123;double b=a;
    printf("%X %lld\n",*(int*)&a,*(long long*)&b);
    func(1,a);
}

这个程序大家可以运行一下,与期望一致。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 23:09
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
你应该分多参数时默认缺省和指定参数这两种情况分开说明

[color=white]
2008-05-26 23:16
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
这个的确可以算是容易误导的一个地方,但是我在文中说了嘛:“我们知道,为了防止printf的参数“一错百错”,传入不定参数函数的参数,都会自动升级:float会晋级为double,而char,short都会晋级为int。”

传入不定参数函数的参数哦~~~~

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 23:26
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
恩,明天好好改一下吧,吸取一下大家的意见,刚刚给第二篇文起了个头,发现又要写好长,所以准备留到明天去写…………

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 23:28
prinse
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-4-8
收藏
得分:0 
嗯,虽然不太清楚是否正是出于楼主所说的原因,不过目前我收集到的资料表明楼主所说的在“不定参数”的函数调用情况下,确实是对参数做了类型调整。

鉴此,我收回我在21楼的看法!:D
2008-05-26 23:51
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
嘿嘿,在BCCN吵架是一件愉快的事情~~~就是怕有一天没有架吵了……哈哈,这几天广陵沉寂了,感觉上有点无聊了……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-26 23:55
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
找荐来吵?

[color=white]
2008-05-27 00:00
快速回复:[原创]C语言思考——复杂类型的不一致性
数据加载中...
 
   



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

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