sizeof函数与表达式操作无关

 

 

 

 

引子:

在32位操作系统中,如下程序输出结果?

 

#include "stdio.h"

int main()
{
    int i = 3;
    int j = 0;
    j = sizeof(++i+ ++i);
    printf("i = %d, j = %d\n", i, j);
    return 0;
}
 

 

 

输出结果为i=3,j=4

 

 

 

汇编代码:

1:    #include "stdio.h"

2:

3:    int main()

4:    {

00401010   push        ebp

00401011   mov         ebp,esp

00401013   sub         esp,48h

00401016   push        ebx

00401017   push        esi

00401018   push        edi

00401019   lea         edi,[ebp-48h]

0040101C   mov         ecx,12h

00401021   mov         eax,0CCCCCCCCh

00401026   rep stos    dword ptr [edi]

5:        int i = 3;

00401028   mov         dword ptr [ebp-4],3

6:        int j = 0;

0040102F   mov         dword ptr [ebp-8],0

7:        j = sizeof(++i+ ++i);

00401036   mov         dword ptr [ebp-8],4

8:        printf("i = %d, j = %d\n", i, j);

0040103D   mov         eax,dword ptr [ebp-8]

00401040   push        eax

00401041   mov         ecx,dword ptr [ebp-4]

00401044   push        ecx

00401045   push        offset string "i = %d, j = %d\n" (0042201c)

0040104A   call        printf (00401080)

0040104F   add         esp,0Ch

9:        return 0;

00401052   xor         eax,eax

10:   }

00401054   pop         edi

00401055   pop         esi

00401056   pop         ebx

00401057   add         esp,48h

0040105A   cmp         ebp,esp

0040105C   call        __chkesp (00401100)

00401061   mov         esp,ebp

00401063   pop         ebp

00401064   ret

 

 

 

指点:

从如下汇编代码可以看出,j = sizeof(++i+ ++i);这条语句的汇编代码仅仅只有一条,即将4赋值给j变量,可见sizeof()内的表达式操作++i+ ++i并未执行。

7:        j = sizeof(++i+ ++i);

00401036   mov         dword ptr [ebp-8],4

 

 

解惑:

实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof值都是一致的。这里,对象可以进一步延伸至表达式,即sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。如:

sizeof( 2 ); // 2的类型为int,所以等价于 sizeof( int );

sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于 sizeof( double );

sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。

【摘自:百度百科 词条sizeof】

网址:http://baike.baidu.com/view/1078660.htm

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值