引子:
在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
分享到:
相关推荐
本篇文章将全面讲解`sizeof`的用法,并将其与常用的字符串长度函数`strlen()`进行比较,帮助开发者深入理解并解决在使用`sizeof`时可能遇到的难点。 1. `sizeof`基本用法: - 对于基本数据类型,如int、char、...
但是,如果该类具有虚函数,其大小至少为`sizeof(void*)`,因为需要存储虚函数表指针。 9. **字节对齐**:字节对齐会影响`sizeof`的结果,特别是在处理结构体或数组时。编译器会根据特定的对齐规则进行内存布局,...
sizeof 操作符和 strlen 函数都是计算字符串的长度,但是它们的计算方式不同。sizeof 操作符计算的是内存中的实际长度,而 strlen 函数计算的是字符串的实际长度,不包括结束符。例如,char str[11]={'0','1','2','3...
前言 C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒...sizeof函数的结果: 1.变量:变量所占的字节数。 int i = 0; printf(%d\n, sizeof
sizeof是一个单目操作符,它不是函数。它以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof 的使用方法 1. 用于数据类型 ...
需要注意的是,sizeof 操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void 类型等。 三、sizeof 的结果 sizeof ...
注意:sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 三、sizeof的结果 sizeof操作符的结果...
`sizeof`是C语言中的一个单目操作符,它用来获取给定类型或表达式的字节大小。需要注意的是,`sizeof`不是一个函数,而是一个操作符,这意味着它的行为更像是语法的一部分,而不是一个可以通过参数调用的实体。 **...
### 二、栈的定义与操作 #### 1. 数据类型定义 - **`opndElem`**: 存储操作数的数据类型。 - **`optrElem`**: 存储运算符的数据类型。 #### 2. 栈结构定义 - **`OpndStack`**: 操作数栈的结构体,包含指针`base`...
它可以与其他操作符一起组合成复杂的表达式,例如 `i * sizeof(int)`,其中 `i` 为 `int` 类型变量。 #### 五、`sizeof` 的主要用途 1. **与存储分配和 I/O 系统通信**:`sizeof` 常用于与存储分配和 I/O 系统例程...
需要注意的是,`sizeof`不是函数,而是用来获取操作数(可以是一个表达式或类型名)的存储大小的操作符。其结果是以字节的形式返回。 #### 二、`sizeof`的使用方法 1. **用于数据类型** - 使用形式:`sizeof...
3. **表达式求值**:当 `sizeof` 操作符应用于表达式时,表达式的求值发生在编译期,且只计算表达式中各个变量或常量的类型。 - 示例: ```cpp int a = 0; cout << sizeof(a = 3) ; // 输出 int 类型的大小 ```...
### C语言:运算符与表达式详解 #### 引言 C语言,作为一种高效且功能强大的编程语言,其丰富的运算符和表达式体系是其核心优势之一。掌握C语言的运算符与表达式,对于编写高质量、高效率的程序至关重要。本文将...
sizeof 操作符不能用于函数类型、不完全类型或位字段。 在使用 sizeof 时,需要注意操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用 sizeof 来代替常量计算。 sizeof 操作符是 C 语言中一个...
- `sizeof(表达式)`:返回表达式值的大小。 - `sizeof(类型名)`:返回该类型的大小。 #### 结构体与`sizeof()`运算符 当涉及结构体时,`sizeof()`的计算变得更为复杂。这是因为结构体中的成员可能不会连续存储在...
sizeof 操作符不是函数,而是一种单目操作符,如 C 语言的其他操作符 ++、-- 等。它可以用于数据类型、变量、指针、数组、结构体等。 二、sizeof 的使用方法 sizeof 操作符有两种使用形式: 1. 用于数据类型:...
第六章 运算符与表达式 C运算符的分类: 算术运算符:+、-、*、/、%、++、-- 关系运算符;>、<、==、!=、>=、 逻辑运算符:&&、||、! 位操作运算符:位与&、位或|、位非~、位异或^、左移、右移>> 赋值运算符:...
6. **常量表达式与`sizeof`** `sizeof`运算符可以在编译时进行计算,因此它可以应用于常量表达式,如数组长度。但不能应用于运行时才能确定大小的表达式。 7. **类型别名与`sizeof`** 使用`typedef`或`using`...