C之enum、sizeof、typedef(十一)-创新互联

    在 C 语言中经常会见到 enum、sizeof、typedef,那么我们今天就来讲解下它们三个。

成都创新互联服务项目包括平遥网站建设、平遥网站制作、平遥网页制作以及平遥网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,平遥网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到平遥省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

        首先 enum 是 C 语言中的一种自定义类型,它是一种枚举类型。enum 值是可以根据需要自定义的整型值,第一个定义的 enum 值默认为 0。默认情况下的 enum 值是在前一个定义值的基础上加 1,enum 类型的变量只能取定义时的离散值。enum 中定义的值是 C 语言中真正意义上的常量,在一般工程中 enum 多用于定义×××常量。

        下来我们就来写个示例代码分析下,代码如下:

#include 

enum
{
    ARRAY_SIZE = 5
};

void InitArray(int array[])
{
    int i = 0;
    
    for(i=0; i

        我们来分析下这个代码,它利用 enum 定义了常量 ARRAY_SIZE,然后创建数组并打印。我们来看下编译结果是否如我们所愿呢?打印如下:

C之 enum、sizeof、typedef(十一)

       那么我们看到打印确实如我们所想。

        接下来我们来讲讲 sizeof 关键字,它是编译器的内置指示符,用于计算类型或变量所占内存打小。那么它所计算的值在编译期就已经确定,也就是说在运行期是没用的。sizeof 于类型时:sizeof(type);用于变量时:sizeof(var) 或 sizeof var。sizeof 是 C语言的内置关键字而不是函数,在编译过程中所有的 sizeof 将被具体的数值所替换,程序的执行过程与 sizeof 没用任何关系。我们来看看 下面这个示例代码会输出什么?

#include 

int f()
{
    printf("hello world\n");
    
    return 0;
}

int main()
{
    int var = 0;
    
    int size = sizeof(var++);
    
    printf("var = %d, size = %d\n", var, size);
    
    size = sizeof(f());
    
    printf("size = %d\n", size);
    
    return 0;
}

        我们先来分析下这个代码,在程序的第14行我们做了 var++,理论上第16行打印出来的结果会是 1 和 4。在程序的第18行看似调用了 f() 函数,那么照我们的分析,将会在第20行打印出 4,但是在前面硬打印出 hello world 这句话。下来我们来看看是否如我们所分析的那样呢?

C之 enum、sizeof、typedef(十一)

        那么这是怎么回事呢?跟我们分析的不一样,var 不等于 1,并且也没有打印出 hello world 那句。我们来仔细想想上面讲的 sizeof 的相关知识,它是在程序的编译期有效的,也就是说程序运行之后并没有去执行 var++,所以 var 仍然等于 0。sizeof 是关键字而不是函数,所以在程序的第18行并不是去调用 f() 函数,自然也就不会去执行函数里的打印语句。因为函数的返回值是 int 型,所以打印的值为 4。

        最后我们再来讲讲 typedef 关键字。我们通常以为 typedef 是定义一种新的类型,其实不是的。typedef 用于给一个已经存在的数据类型重命名,其本质上是不能产生新的类型的。注意:它命名的类型可以在 typedef 语句之后,但是不能被 unsigned 和 signed 所修饰。

        我们以示例代码来分析下,代码如下:

#include 

typedef int Int32;

struct _tag_point
{
    int x;
    int y;
};

typedef struct _tag_point Point;

typedef struct
{
    int length;
    int array[];
} SoftArray; 

typedef struct _tag_list_node ListNode;
struct _tag_list_node
{
    ListNode* next;
};

int main()
{
    Int32 i = -100; 
    unsigned Int32 ii = 0;
    Point p;
    SoftArray* sa = NULL;   
    ListNode* node = NULL;
    
    return 0;
}

        我们来分析这个代码,我们在第19行显然是先重命名后定义的,这种在 C 语言中是合法的。第28行用 unsigned 修饰重命名的类型,这显然是错误的,因此会在28行报错。第29行相当于 struct  _tag_point p;第31行相当于 struct _tag_list_node* node;我们来看看编译结果

C之 enum、sizeof、typedef(十一)

        那么我们注释掉第28行之后,编译就通过了。那么我们今天讲解了 enum、sizeof、typedef ,总结如下:1、enum 用于定义离散值类型,并且它定义的值是真正意义上的常量;2、sizeof 是编译器的内置指示符,不参与程序的执行过程;3、typedef 用于给类型重命名,并且重命名的类型可以在 typedef 语句之后定义。后面我们会继续对 C 语言的学习。

         欢迎大家一起来学习 C 语言,可以加我QQ:243343083。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:C之enum、sizeof、typedef(十一)-创新互联
网站地址:http://myzitong.com/article/dciejg.html