`
yeshaoting
  • 浏览: 685814 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 

 

分享到:
评论

相关推荐

    sizeof 的用法(大全)

    本篇文章将全面讲解`sizeof`的用法,并将其与常用的字符串长度函数`strlen()`进行比较,帮助开发者深入理解并解决在使用`sizeof`时可能遇到的难点。 1. `sizeof`基本用法: - 对于基本数据类型,如int、char、...

    sizeof函数使用注意事项

    但是,如果该类具有虚函数,其大小至少为`sizeof(void*)`,因为需要存储虚函数表指针。 9. **字节对齐**:字节对齐会影响`sizeof`的结果,特别是在处理结构体或数组时。编译器会根据特定的对齐规则进行内存布局,...

    sizeof详细总结

    sizeof 操作符和 strlen 函数都是计算字符串的长度,但是它们的计算方式不同。sizeof 操作符计算的是内存中的实际长度,而 strlen 函数计算的是字符串的实际长度,不包括结束符。例如,char str[11]={'0','1','2','3...

    C语言中sizeof函数的基本使用总结

    前言 C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒...sizeof函数的结果: 1.变量:变量所占的字节数。 int i = 0; printf(%d\n, sizeof

    sizeof用法

    sizeof是一个单目操作符,它不是函数。它以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof 的使用方法 1. 用于数据类型 ...

    sizeof()里面的值

    需要注意的是,sizeof 操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void 类型等。 三、sizeof 的结果 sizeof ...

    解析C语言中的sizeof.docx

    注意:sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 三、sizeof的结果 sizeof操作符的结果...

    有关strlen和sizeof的归纳与总结

    `sizeof`是C语言中的一个单目操作符,它用来获取给定类型或表达式的字节大小。需要注意的是,`sizeof`不是一个函数,而是一个操作符,这意味着它的行为更像是语法的一部分,而不是一个可以通过参数调用的实体。 **...

    表达式求值(C语言栈实现)

    ### 二、栈的定义与操作 #### 1. 数据类型定义 - **`opndElem`**: 存储操作数的数据类型。 - **`optrElem`**: 存储运算符的数据类型。 #### 2. 栈结构定义 - **`OpndStack`**: 操作数栈的结构体,包含指针`base`...

    详细讲解sizeof的使用

    它可以与其他操作符一起组合成复杂的表达式,例如 `i * sizeof(int)`,其中 `i` 为 `int` 类型变量。 #### 五、`sizeof` 的主要用途 1. **与存储分配和 I/O 系统通信**:`sizeof` 常用于与存储分配和 I/O 系统例程...

    详细解析C语言中的sizeof

    需要注意的是,`sizeof`不是函数,而是用来获取操作数(可以是一个表达式或类型名)的存储大小的操作符。其结果是以字节的形式返回。 #### 二、`sizeof`的使用方法 1. **用于数据类型** - 使用形式:`sizeof...

    C++sizeof使用规则及陷阱分析

    3. **表达式求值**:当 `sizeof` 操作符应用于表达式时,表达式的求值发生在编译期,且只计算表达式中各个变量或常量的类型。 - 示例: ```cpp int a = 0; cout << sizeof(a = 3) ; // 输出 int 类型的大小 ```...

    C语言 第3章 运算符与表达式

    ### C语言:运算符与表达式详解 #### 引言 C语言,作为一种高效且功能强大的编程语言,其丰富的运算符和表达式体系是其核心优势之一。掌握C语言的运算符与表达式,对于编写高质量、高效率的程序至关重要。本文将...

    详细解析C语言中的sizeof (2).docx

    sizeof 操作符不能用于函数类型、不完全类型或位字段。 在使用 sizeof 时,需要注意操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用 sizeof 来代替常量计算。 sizeof 操作符是 C 语言中一个...

    C中sizeof()函数的精确解释

    - `sizeof(表达式)`:返回表达式值的大小。 - `sizeof(类型名)`:返回该类型的大小。 #### 结构体与`sizeof()`运算符 当涉及结构体时,`sizeof()`的计算变得更为复杂。这是因为结构体中的成员可能不会连续存储在...

    详细解析C语言中的sizeof.pdf

    sizeof 操作符不是函数,而是一种单目操作符,如 C 语言的其他操作符 ++、-- 等。它可以用于数据类型、变量、指针、数组、结构体等。 二、sizeof 的使用方法 sizeof 操作符有两种使用形式: 1. 用于数据类型:...

    6.第六章 运算符与表达式.txt

    第六章 运算符与表达式 C运算符的分类: 算术运算符:+、-、*、/、%、++、-- 关系运算符;>、<、==、!=、>=、 逻辑运算符:&&、||、! 位操作运算符:位与&、位或|、位非~、位异或^、左移、右移>> 赋值运算符:...

    sizeof运算符的使用

    6. **常量表达式与`sizeof`** `sizeof`运算符可以在编译时进行计算,因此它可以应用于常量表达式,如数组长度。但不能应用于运行时才能确定大小的表达式。 7. **类型别名与`sizeof`** 使用`typedef`或`using`...

Global site tag (gtag.js) - Google Analytics