`
yeshaoting
  • 浏览: 670010 次
  • 性别: 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

 

 

分享到:
评论

相关推荐

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

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

    C语言函数sizeof

     注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。   如sizeof(max)若此时变量max定义为...

    解析C语言中的sizeof.docx

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

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

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

    sizeof使用描述

    sizeof: C语言的一种单目操作符, 不是函数; sizeof操作符以字节形式给出了其操作数的存储大小, 操作数可以是一个表达式或是括在括号内的类型名. 操作数的存储大小由操作数的类型决定;

    sizeof的具体用法

    sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储...操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 

    sizeof()的简单介绍

    操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 (二)使用方法 1、用于数据类型  sizeof使用形式:sizeof(type) ,如sizeof(int) 2、用于变量  sizeof使用形式:...

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

    关于在C中sizeof()函数的精确解释,很多人由于笔试,学习等等遇到问这个问题,就解释一下吧!结合结构体,结构体元素等等,具体说明,希望可以帮助大家!

    深入sizeof的使用详解

    经常在C下编程,不了解精通sizeof就有点说不过去了,本文可没有sizeof与strlen的区别哦,尽管这个对比很经典,不过,将就点吧。一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它...

    解析sizeof, strlen, 指针以及数组作为函数参数的应用

    代码如下所示: 代码如下: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

    NOIP2018提高组初赛复习

    Sizeof 长度运算符 sizeof(表达式) 3 / 除 表达式/表达式 左到右 双目运算符 * 乘 表达式*表达式 双目运算符 % 余数(取模) 整型表达式%整型表达式 双目运算符 4 + 加 表达式+表达式 左到右 双目运算符 - 减 ...

    -C++参考大全(第四版) (2010 年度畅销榜

    6.9 传统的与现代的函数参数声明 第7章 结构、联合、枚举和用户定义的类型 7.1 结构 7.2 结构数组 7.3 向函数传递结构 7.4 结构指针 7.5 结构中的数组和结构 7.6 位域 7.7 联合 7.8 枚举 7.9 用sizeof来保证可移植...

    剖析C++中的常量表达式与省略号的相关作用

    常量表达式中合法的唯一操作数是: 文本 枚举常量 声明为使用常量表达式初始化的常量的值 sizeof 表达式 必须将非整型常量(显式或隐式)转换为常量表达式中合法的整型。因此,以下代码是合法的: const double...

    多项式拟合 dll 最小二乘法 表达式计算

    IsRad:表达式中含有sin之类的三角函数时,表明是按弧度制还是角度制,TRUE表示弧度制 返回值:表示错误码,0代表计算成功,错误码代表的意思可通过调用ErrorStr函数取得 */ EXPORT int Calculate(const char* strIn...

    非常经典的c++ primer视频教程6-10

    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版)李普曼 等著 pdf 1/3

    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版 )中文版(美)李普曼等著.part2.rar

    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第四版【中文高清扫描版】.pdf

    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...

    C语言运算符优先级一览表.docx

    * 长度运算符:`sizeof(表达式)` 这些运算符的优先级次之,在计算表达式时将次于一级运算符进行运算。 三级运算符 * 除法运算符:`表达式 / 表达式` * 乘法运算符:`表达式 * 表达式` * 取模运算符:`表达式 % ...

    富士通笔试题与解答 经典

    答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern...

Global site tag (gtag.js) - Google Analytics