免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3293 | 回复: 15
打印 上一主题 下一主题

关于sizeof()的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-22 16:59 |只看该作者 |倒序浏览
C代码片断:
// test.c
。。。。。。

printf("%d\n", sizeof('A'));


。。。。。。

我机器上输出结果是4。Linux,GCC,版本比较老。

C++代码片断
// test.cc
。。。。。。

printf("%d\n", sizeof('A'));

我机器上输出结果是1。

对于前者输出4我可以理解,我不太清楚的是C++对此做了哪些改变,导致C++中的结果与C不同,因为手头没有C++标准的相关资料,所以希望有人可以解释一下C++对此所做的变动。

论坛徽章:
0
2 [报告]
发表于 2008-04-22 17:05 |只看该作者
下面的也是在同一Linux系统吗?

论坛徽章:
0
3 [报告]
发表于 2008-04-22 17:10 |只看该作者
to 204tian:

是的,在同一台机器上 ,唯一不同的就是一个是c文件,用gcc编译;一个是c++文件,用g++编译。两个文件的源代码是完全一样的。

论坛徽章:
0
4 [报告]
发表于 2008-04-22 17:23 |只看该作者
这是编译器对'A'处理不同造成的。。gcc把'A'看成是int型的,g++则看成是char型的,所以在使用sizeof时,不建议你这样直接使用,除非你想测试编译器的某个特性。 

论坛徽章:
0
5 [报告]
发表于 2008-04-22 17:29 |只看该作者
简单的测试下:
-----------------------------
#include<stdio.h>
int main()
{
        printf("%d\n",sizeof('A'));
        printf("%d\n",sizeof(97));
       
         char a = 'A';
        printf("%d\n",sizeof(a));

        return 0;
}
-------------------------------------
分别保存为t.c和.cc并编译、运行:
bash-3.1# gcc t.c
bash-3.1# ./a.out
4
4
1
bash-3.1# g++ t.cc
bash-3.1# ./a.out
1
4
1

可试着这样解释:
在C中'A'即ascii值(即97),当作是一个整数值,sizeof('A') == sizeof(97)
在C++中'A'看作是字符,sizeof('A') == sizeof(char)

对C++不是很熟悉,以上仅仅是猜测,仅供参考交流.

论坛徽章:
0
6 [报告]
发表于 2008-04-22 17:29 |只看该作者
原帖由 军路八 于 2008-4-22 16:59 发表
C代码片断:
// test.c
。。。。。。

printf("%d\n", sizeof('A'));

。。。。。。

我机器上输出结果是4。Linux,GCC,版本比较老。

C++代码片断
// test.cc
。。。。。。

printf("%d\n", s ...


应该都是1.  'A'是单个字符,sizeof() 是1才是正确的.

论坛徽章:
0
7 [报告]
发表于 2008-04-22 17:31 |只看该作者
刚测过,的确是这样, 把文件的扩展名改为cpp,无论gcc,g++都是1. (redhat linux, gcc,g++)

[ 本帖最后由 system888net 于 2008-4-22 20:03 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-04-22 17:42 |只看该作者
原帖由 军路八 于 2008-4-22 16:59 发表
C代码片断:
// test.c
。。。。。。

printf("%d\n", sizeof('A'));

。。。。。。

我机器上输出结果是4。Linux,GCC,版本比较老。

C++代码片断
// test.cc
。。。。。。

printf("%d\n", s ...

前者怎么理解啊?

论坛徽章:
0
9 [报告]
发表于 2008-04-22 18:01 |只看该作者
原帖由 parco 于 2008-4-22 17:42 发表

前者怎么理解啊?


C中的整型提升,对于含有char,short,枚举常量等整型域数据的表达式,都会先提升到整型(int)再进行运算,前提是提升后可以完全无损失的容纳原数据,否则就提升为unsigned int。

而sizeof()不是函数,是一个表达式。

char a , b ,c;
c = a + b;

实际上进行a + b运算时,分别把a和b提升为int后才进行的计算。

论坛徽章:
0
10 [报告]
发表于 2008-04-22 20:12 |只看该作者
的确是这样,前面测试用的扩展名是cpp,用g++,gcc 都是1

但改成扩展名c后,gcc编译后的确是4

这样不一至的确不太好,把扩展名都改为*.cpp避免这样的问题!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP