C之 enumsizeoftypedef

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C之 enumsizeoftypedef相关的知识,希望对你有一定的参考价值。

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

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

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

#include <stdio.h>

enum
{
    ARRAY_SIZE = 5
};

void InitArray(int array[])
{
    int i = 0;
    
    for(i=0; i<ARRAY_SIZE; i++)
    {
        array[i] = i + 1;
    }
}

void PrintArray(int array[])
{
    int i = 0;
    
    for(i=0; i<ARRAY_SIZE; i++)
    {
        printf("%d\n", array[i]);
    }
}


int main()
{    
    int array[ARRAY_SIZE] = {0};
    
    InitArray(array);
    
    PrintArray(array);
    
    return 0;
}

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

技术分享图片

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

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

#include <stdio.h>

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 这句话。下来我们来看看是否如我们所分析的那样呢?

技术分享图片

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

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

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

#include <stdio.h>

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;我们来看看编译结果

技术分享图片

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


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

以上是关于C之 enumsizeoftypedef的主要内容,如果未能解决你的问题,请参考以下文章

C 中的共享内存代码片段

[linux][c/c++]代码片段01

C语言代码片段

c_cpp Atlas300代码片段

c_cpp Robolution基本代码片段

[linux][c/c++]代码片段02