C11(enum, sizeof, typedef 分析)

本文详细介绍了C11中的枚举类型enum,包括其默认值和使用规则;接着讲解了sizeof关键字,它是编译器内置的用于计算类型或变量内存大小的指示符;然后阐述了typedef的作用,即给已存在数据类型重命名,以及其限制。通过这些知识点,读者可以更好地理解和应用C11中的这些特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 枚举类型 enum

  • enum 是C语言中的一种自定义类型
  • enum 值是可以根据需要自定义的整型值
  • 第一个定义的 enum 值默认是0
  • 默认情况下的 enum 值是在前一个定义值的基础上加1
  • enum 类型的变量只能取定义时的离散值(虽然取其它值也没报错,但是没有意义)
  • enum 中定义的值时 C 语言中真正意义上的常量

EG:

#include <stdio.h>

enum
{
    ARRAY_SIZE = 10
};

enum Color
{
    RED    = 0x00FF0000,
    GREEN  = 0x0000FF00,
    BLUE   = 0x000000FF
};

void PrintColor(enum Color c)
{
    switch( c )
    {
        case RED:
            printf("Color: RED (0x%08X)\n", c);
            break;
        case GREEN:
            printf("Color: GREEN (0x%08X)\n", c);
            break;
        case BLUE:
            printf("Color: BLUE(0x%08X)\n", c);
            break;
    }
}

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()
{
    enum Color c = GREEN;
    
    int array[ARRAY_SIZE] = {0};
    
    PrintColor(c);
    
    InitArray(array);
    
    PrintArray(array);
    
    return 0;
}

2. sizeof 关键字

  • sizeof 是编译器的内置指示符,不是一个函数
  • sizeof 用于计算类型或变量所占的内存大小
  • sizeof 的值在编译期就已经确定

EG:

#include <stdio.h>

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

int main()
{
    int var = 0;
    
    int size = sizeof(var++);
    
    printf("var = %d, size = %d\n", var, size); // 打印 var=0 , size=4
    
    size = sizeof(f());  // 函数并没有执行
    
    printf("size = %d\n", size); // 打印 size = 4
    
    return 0;
}

解析:14行的代码在编译期间就已经被替换为 sizeof(1) 所以没有运行,就对var 变量没有影响,第18行同理

3. typedef 关键字

  • typedef 用于给一个已经存在的数据类型重命名
  • typedef 本质上不能产生新的类型
  • typedef 重命名的类型可以在 typedef 语句后被定义
  • typedef 重命名的类型不能被 unsigned 和 signed 修饰

EG:

#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;        // int 
    //unsigned Int32 ii = 0;  // error
    Point p;               // struct _tag_point
    SoftArray* sa = NULL;   
    ListNode* node = NULL; // struct _tag_list_node*
    
    return 0;
}

4. 总结

  • enum 用于定义离散值类型
  • enum 定义的的值是真正意义上的常量
  • sizeof 是编译器的内置指示符,不参与程序的执行过程
  • typedef 用于给类型重命名,重命名的类型可以在 typedef 语句之后定义
<think>嗯,用户问的是C语言中需要掌握的关键词汇,特别是表达式和关键字。首先,我需要回忆一下C语言的基础知识。根据引用[3],里面有提到一些必备单词,比如关键字中的auto、break、case这些,还有表达式相关的术语比如operator、operand、constant等等。用户可能刚开始学C语言,所以需要明确区分这些基本概念。 然后,用户提到“表达式”和“关键字”,这两个部分确实是C语言的核心。关键字是语言本身定义的保留字,有固定的用途,不能作为变量名或函数名使用。而表达式则是由操作符和操作数组成的,用来计算值。引用[3]中的列表可以作为参考,但需要确认是否全面,比如是否包括C99或C11新增的关键字,比如_Bool、_Complex等,可能需要补充说明。 接下来,用户可能希望了解这些关键词汇的具体用法和例子。比如,关键字中的控制结构如if、else、for、while,还有数据类型相关的int、char、float等。表达式部分则需要解释不同类型的操作符,如算术、关系、逻辑、位操作等,以及它们的优先级和结合性,引用[2]提到词法分析和语法分析,这里可以联系到运算符的处理步骤。 另外,用户的问题可能隐含了更深层次的需求,比如如何正确使用这些关键字和表达式来编写程序,或者常见的错误有哪些。例如,误用关键字作为变量名会导致编译错误,或者表达式中的类型转换问题。需要结合引用中的内容,比如编译器的词法分析和语义分析阶段,解释这些错误是如何被检测出来的。 最后,生成相关问题时,要覆盖用户可能感兴趣的扩展内容,比如关键字的分类、表达式的优化、常见错误等,帮助用户全面理解。同时,确保引用正确的来源,比如引用[3]提供的单词列表,引用[2]提到的编译过程,可以增强回答的可信度。</think>### C语言必备关键词与表达式解析 #### 一、**C语言关键字** 关键字是C语言预定义的保留标识符,具有特定功能,**不可作为变量名或函数名**。以下是核心分类: 1. **数据类型** - 基础类型:$int$, $char$, $float$, $double$ - 修饰符:$short$, $long$, $signed$, $unsigned$ - C99扩展:$_Bool$, $_Complex$(需包含头文件`<stdbool.h>`和`<complex.h>`)[^3] 2. **流程控制** - 条件分支:$if$, $else$, $switch$, $case$ - 循环结构:$for$, $while$, $do$ - 跳转语句:$break$, $continue$, $return$, $goto$[^3] 3. **存储类别** - 作用域控制:$auto$, $static$, $extern$, $register$ - 例如:`static int count;` 定义静态变量[^3] 4. **其他核心关键字** - 运算符相关:$sizeof$, $const$, $volatile$ - 结构体与联合:$struct$, $union$, $enum$ - 类型定义:$typedef$[^3] #### 二、**表达式与运算符** 表达式由**操作数**和**运算符**构成,返回计算结果。 1. **运算符分类** - 算术运算:$+$, $-$, $*$, $/$, $\%$ - 关系运算:$>$, $<$, $==$, $!=$, $>=$, $<=$ - 逻辑运算:$&&$, $||$, $!$ - 位运算:$&$, $|$, $^$, $~$, $<<$, $>>$ - 赋值运算:$=$, $+=$, $-=$ 等复合形式[^3] 2. **表达式示例** ```c int result = (a * b) + (c >> 2); // 混合算术与位运算 ``` #### 三、**编译过程与表达式解析** 编译器处理表达式时: 1. **词法分析**:拆分表达式为标记(如运算符、常量)[^2] 2. **语法分析**:构建抽象语法树(AST),例如: $$ \text{AST示例:} \quad \text{‘+’} \\ \quad / \quad \backslash \\ \text{‘*’}(a,b) \quad \text{‘>>’}(c,2) $$ 3. **语义分析**:检查类型匹配,如`int + float`隐式转换为`float`[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值