免费注册 查看新帖 |

Chinaunix

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

关于sizeof(),大家帮忙看看! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-03 20:30 |只看该作者 |倒序浏览

  1.        int i = 1;
  2.        int j;
  3.        j = sizeof(i++ + i++);
  4.        printf("%d,%d",i,j);
复制代码


输出结果是 1,4
sizeof里面的表达式不进行计算吗?请问sizeof是怎样实现的?   谢谢

论坛徽章:
0
2 [报告]
发表于 2006-12-03 21:42 |只看该作者
结果正常,并说明你用了 32 位编译器

论坛徽章:
0
3 [报告]
发表于 2006-12-03 22:45 |只看该作者
一般来说,sizeof的值是通过查符号表来确定类型的长度的,所以在编译结束的时候就已经知道了,所以应该是不计算的表达式的。

论坛徽章:
0
4 [报告]
发表于 2006-12-04 11:42 |只看该作者
sizeof 不计算表达式的值...C 语言有说明的...

论坛徽章:
0
5 [报告]
发表于 2006-12-04 13:07 |只看该作者
哦 大体明白了
上网查了查 c语言里可以这样实现

  1. #define   sizeof(x)   ((char   *)(&x+1)   -   (char   *)(&x))
复制代码

[ 本帖最后由 liuke432 于 2006-12-18 12:39 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-12-04 13:24 |只看该作者
原帖由 liuke432 于 2006-12-4 13:07 发表
哦 大体明白了
上网查了查 c语言里可以这样实现

  1. #define   sizeof(x)   ((char   *)(&x+1)   -   (char   *)(&x));
复制代码


楼上的貌似多出一个分号,呵呵

论坛徽章:
0
7 [报告]
发表于 2006-12-05 16:59 |只看该作者
等同于sizeof(int),就算是计算表达式的话,表达式的值仍然是个int格式的值,结果依然是sizeof(int)

论坛徽章:
0
8 [报告]
发表于 2006-12-05 21:02 |只看该作者
原帖由 liuke432 于 2006-12-4 13:07 发表
哦 大体明白了
上网查了查 c语言里可以这样实现

  1. #define   sizeof(x)   ((char   *)(&x+1)   -   (char   *)(&x));
复制代码


如果sizeof(char *)怎么办?

另外sizeof是一个操作符,后面的括号不是必须的,如下

int main()
{
    int a = 0;
    a = sizeof a;
    printf ("%d\n", a);
    getch();
    return 0;
}

论坛徽章:
0
9 [报告]
发表于 2006-12-05 21:09 |只看该作者
原帖由 xxandxx 于 2006-12-5 21:02 发表


如果sizeof(char *)怎么办?

另外sizeof是一个操作符,后面的括号不是必须的,如下

int main()
{
    int a = 0;
    a = sizeof a;
    printf ("%d\n", a);
    getch();
    return ...

如果sizeof后为一类型的话,括号还是必须的

论坛徽章:
0
10 [报告]
发表于 2006-12-05 21:31 |只看该作者
08048344 <main>:
8048344:       55                      push   %ebp
8048345:       89 e5                   mov    %esp,%ebp
8048347:       83 ec 08                sub    $0x8,%esp
804834a:       83 e4 f0                and    $0xfffffff0,%esp
804834d:       b8 00 00 00 00          mov    $0x0,%eax
8048352:       83 c0 0f                add    $0xf,%eax
8048355:       83 c0 0f                add    $0xf,%eax
8048358:       c1 e8 04                shr    $0x4,%eax
804835b:       c1 e0 04                shl    $0x4,%eax
804835e:       29 c4                   sub    %eax,%esp
8048360:       c7 45 fc 01 00 00 00    movl   $0x1,0xfffffffc(%ebp)
8048367:       c7 45 f8 04 00 00 00    movl   $0x4,0xfffffff8(%ebp)
804836e:       b8 00 00 00 00          mov    $0x0,%eax
8048373:       c9                      leave  
8048374:       c3                      ret   
8048375:       90                      nop   
8048376:       90                      nop   
8048377:       90                      nop   
8048378:       90                      nop   
8048379:       90                      nop   
804837a:       90                      nop   
804837b:       90                      nop   
804837c:       90                      nop   
804837d:       90                      nop   
804837e:       90                      nop   
804837f:       90                      nop
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP