引子:
在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