引子:
在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
分享到:
相关推荐
前言 C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒...sizeof函数的结果: 1.变量:变量所占的字节数。 int i = 0; printf(%d\n, sizeof
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 如sizeof(max)若此时变量max定义为...
注意:sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 三、sizeof的结果 sizeof操作符的结果...
第六章 运算符与表达式 C运算符的分类: 算术运算符:+、-、*、/、%、++、-- 关系运算符;>、<、==、!=、>=、 逻辑运算符:&&、||、! 位操作运算符:位与&、位或|、位非~、位异或^、左移、右移>> 赋值运算符:...
sizeof: C语言的一种单目操作符, 不是函数; sizeof操作符以字节形式给出了其操作数的存储大小, 操作数可以是一个表达式或是括在括号内的类型名. 操作数的存储大小由操作数的类型决定;
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储...操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。
操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 (二)使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) ,如sizeof(int) 2、用于变量 sizeof使用形式:...
关于在C中sizeof()函数的精确解释,很多人由于笔试,学习等等遇到问这个问题,就解释一下吧!结合结构体,结构体元素等等,具体说明,希望可以帮助大家!
经常在C下编程,不了解精通sizeof就有点说不过去了,本文可没有sizeof与strlen的区别哦,尽管这个对比很经典,不过,将就点吧。一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它...
代码如下所示: 代码如下:typedef struct st_test{ int id; char *pName; char class[10];}Student;void fn(Student *pStud) { pStud->id ... // sizeof(pStud) = 4 printf(“sizeof(pStud->id) = %d /n”, sizeo
Sizeof 长度运算符 sizeof(表达式) 3 / 除 表达式/表达式 左到右 双目运算符 * 乘 表达式*表达式 双目运算符 % 余数(取模) 整型表达式%整型表达式 双目运算符 4 + 加 表达式+表达式 左到右 双目运算符 - 减 ...
6.9 传统的与现代的函数参数声明 第7章 结构、联合、枚举和用户定义的类型 7.1 结构 7.2 结构数组 7.3 向函数传递结构 7.4 结构指针 7.5 结构中的数组和结构 7.6 位域 7.7 联合 7.8 枚举 7.9 用sizeof来保证可移植...
常量表达式中合法的唯一操作数是: 文本 枚举常量 声明为使用常量表达式初始化的常量的值 sizeof 表达式 必须将非整型常量(显式或隐式)转换为常量表达式中合法的整型。因此,以下代码是合法的: const double...
IsRad:表达式中含有sin之类的三角函数时,表明是按弧度制还是角度制,TRUE表示弧度制 返回值:表示错误码,0代表计算成功,错误码代表的意思可通过调用ErrorStr函数取得 */ EXPORT int Calculate(const char* strIn...
6.6.4 switch表达式与case标号 6.6.5 switch内部的变量定义 6.7 while语句 6.8 for循环语句 6.8.1 省略for语句头的某些部分 6.8.2 for语句头中的多个定义 6.9 do while语句 6.10 break语句 6.11 continue...
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典... 18.1.3 函数try语句块与构造函数 689 18.1.4 noexcept异常说明 690 18.1.5 异常类层次 693 18.2 命名空间 695 18.2.1 命名空间定义...
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典... 18.1.3 函数try语句块与构造函数 689 18.1.4 noexcept异常说明 690 18.1.5 异常类层次 693 18.2 命名空间 695 18.2.1 命名空间定义...
6.6.4 switch表达式与case标号 176 6.6.5 switch内部的变量定义 176 6.7 while语句 177 6.8 for循环语句 179 6.8.1 省略for语句头的某些部分 180 6.8.2 for语句头中的多个定义 181 6.9 do while语句 182 6.10 break...
* 长度运算符:`sizeof(表达式)` 这些运算符的优先级次之,在计算表达式时将次于一级运算符进行运算。 三级运算符 * 除法运算符:`表达式 / 表达式` * 乘法运算符:`表达式 * 表达式` * 取模运算符:`表达式 % ...
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern...