【C语言|关键字】C语言32个关键字详解

news2025/1/19 19:43:02

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍标准C语言的32个关键字🍭
😎金句分享😎:🍭有机会一定要试试,其实试错的成本并不高,而错过的成本很高🍭

目录

  • 一、概述
  • 二、什么是定义?什么是声明?
  • 三、基本数据类型 : char、short、int、long、float、double
    • 3.1 数据类型 与 模子
    • 3.2 变量命名规则
  • 四、构造类型:struct、enum、union
    • 4.1 struct 关键字
      • 4.1.1 结构体大小
      • 4.1.2 柔性数组(可变长数组)
    • 4.2 enum 关键字
    • 4.3 union 关键字
  • 五、


在这里插入图片描述

一、概述

C语言有多少个关键字?各个关键字有什么作用?本文将详细介绍C语言的关键字,可能一篇文章写不完 ,将在后面文章继续完善。C语言的关键字有32个,我将它主要分成下面四个方面来介绍。

功能关键字
类型(10个)char、short、int、long、float、double、void、struct、union、enum
修饰类型(8个)auto、static、extern、register、volatile、const、signed、unsigned
结构语句(11个)do、for、while、break、continue、goto、if、else、switch、case、default
其他(11个)typedef、return、sizeof

在这里插入图片描述

二、什么是定义?什么是声明?

在学习下面的基本数据类型前,先弄清楚定义和声明有什么区别?怎么区分呢?
下面这两句代码,哪个是声明,哪个是定义?

char c;
extern int i;
  • 定义:是分配一块内存,并给这块内存取一个名字,这个名字就是变量名;
    在该变量的所在区域内,该变量只能被定义一次;
    定义的同时可以初始化。
  • 声明:告诉编译器,这个名字已经在使用了,下面代码用到该名字是在其他地方定义的;
    声明可以出现多次;
    声明不能初始化;
    如果变量或函数在其他文件定义的,声明时必须加extern修饰,如果定义在本文件,则加不加extern都可以。

可以参考下面代码加深理解:

//extern.c
int extern_val;
int get_extern_val()
{
	return extern_val;
}

复制上面代码保存为extern.c;

// main.c
#include <stdio.h>

extern int extern_val; 		// 声明,变量定义在其他文件(extern.c)
extern int get_extern_val();// 声明,函数定义在其他文件(extern.c)

extern int val;				// 声明,变量定义在本文件
extern int get_val();		// 声明,函数定义在本文件

// 下面是不加extern的声明,声明可以多次 2023-09-30 16:39:16
int val;		// 不加extern的声明,变量定义在本文件
int get_val();	// 不加extern的声明,变量定义在本文件

int main()
{
	extern_val = 0;
	get_extern_val();
	val = 1;
	get_val();
	return 0;
}

int val=1;
int get_val()
{
	return val;
}

复制上面代码保存为main.c;
在Ubuntu 18.04系统使用版本为7.5的gcc编译器,通过命令gcc main.c extern.c可以正常编译上面代码。
在这里插入图片描述

在这里插入图片描述

三、基本数据类型 : char、short、int、long、float、double

在32个关键字中,C语言的基本数据类型就占用了6个了,这些基本数据类型主要用来定义变量或者作为函数的参数或返回值类型。各个类型占用了多少个字节的内存?printf打印时用什么字符打印?这些基础知识,本文不涉及。有一点,long型在32位系统是4个字节 ,在64位系统是8个字节。
在这里插入图片描述

3.1 数据类型 与 模子

数据类型就像模子一样,以内存为材料,打造出具有不同字节的变量。
当你定义一个char型变量时,就像用拥有一个字节的“模子”从内存咔出来一个字节大小的“饼”;
当你定义一个int型变量时,就像用拥有四个字节的“模子”从内存咔出来四个字节大小的“饼”;

总之,当使用数据类型定义变量,本质上就是从内存中取出一块该类型大小的内存,并给这个内存定义一个唯一的名字。
在这里插入图片描述

3.2 变量命名规则

  • 命名最好采用英文单词或其组合,别使用拼音,可望文知意,便于记忆和阅读;

  • 尽量避免名字中出现数字编号,如 Value1,Value2 等

  • 对在多个文件之间共同使用的全局变量或函数要加范围限定符(建议使用模块名(缩写)作为范围限定符)。 (GUI_ , etc)

  • 由多个词组成时,每个词的第一个字母大写,其余全部小写,比如:int CurrentVal;,或用下划线隔开,如:int current_val;

  • 程序中不得出现仅靠大小写区分的相似的标识符,如:int x, X;

  • 所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词:
    const int MAX_LENGTH = 100;#define FILE_PATH “/usr/tmp”

  • 定义变量的同时千万千万别忘了初始化。定义变量时编译器并不一定清空了这块内存,它的值可能是无效的数据。

  • 不同类型数据之间的运算要注意精度扩展问题,一般低精度数据将向高精度数据扩展

  • 命名可以参考下图规范,按照标识符前缀(后缀) + 含义标识 。非全局变量可以不用使用范围限定符前缀。
    在这里插入图片描述

  • 作用域前缀命名规则:
    全局变量、函数(global):g
    静态变量、函数(native):n

  • 数据类型前缀命名规则:

数据类型前缀命令例子
boolean类型bboolean bVariable;
char类型cchar cVariable;
int类型iint iVariable;
short类型sshort sVariable;
long类型llong lVariable;
unsigned类型uunsigned int uiVariable;
double 类型ddouble dVariable;
float 类型ffloat fVariable;
  • 含义标识命名规则,变量命名使用名词性词组,函数命名使用动词性词组。

在这里插入图片描述

四、构造类型:struct、enum、union

4.1 struct 关键字

struct 关键字,会将一些相关联的数据打包成一个整体,方便使用。

程序开发过程中经常要传送的不是简单的字节流(char 型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体,如果将这样的数据放在char型数组中,再使用指针偏移去获取数据,会使编程变得很复杂,而使用struct关键字定义的结构体可以轻松解决这种问题。

另外,当函数参数超过4个时,使用起来容易出错,降低效率,可以使用结构体压缩形参。

4.1.1 结构体大小

结构体所占的内存大小是其成员所占内存之和。如果结构体里没有成员,它的大小会跟编译器有关,下面代码,在Ubuntu18.04 使用gcc编译器编译后,没有成员的结构体大小是0,使用g++编译器编译后,没有成员的结构体大小是1.

// main.c
#include <stdio.h>
typedef struct stStudent
{

}stStu;
int main()
{
    printf("%ld\n",sizeof(stStu));
    return 0;
}

在这里插入图片描述

4.1.2 柔性数组(可变长数组)

C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可变的数组。 sizeof 返回的这种结构大小不包括柔性数组的内存。柔性数组的定义可以参考下面代码,虽然定义了arr数组,但它并没有使结构体占用的内存增加,整个stStu的大小还是4个字节:

typedef struct stStudent
{
    int i;
    int arr[];	// 没指定数组大小
}stStu;typedef struct stStudent
{
    int i;
    int arr[0];// 指定数组大小为0
}stStu;

柔性数组的使用可以参考下面代码,定义结构体指针pStu指向malloc分配的一块内存,然后就可以通过pStu->arr[n]去访问数组元素,因为这块内存是malloc分配的,如果arr后面的空间不够的话,就可以动态去调整,这就是被成为柔性数组或可变长数组的原因:

stStu *pStu = (stStu*)malloc(sizeof(stStu)+100*sizeof(int));

完整使用例子如下:

// flexible_arr.c 2023-10-06 21:06:04
#include <stdio.h>
#include <stdlib.h>

typedef struct stStudent
{
        int i;
        int arr[];
}stStu;
int main()
{
        stStu *pStu = (stStu*)malloc(sizeof(stStu)+100*sizeof(int));
        printf("stStu=%ld pStu=%ld\n",sizeof(stStu),sizeof(*pStu));

        int i=0;
        for(i=0; i<10; i++)
        {
                pStu->arr[i] = i;
        }
        printf("arr:");
        for(i=0; i<10; i++)
        {
                printf("%d,",pStu->arr[i]);
        }
        printf("\n");
        return 0;
}

4.2 enum 关键字

4.3 union 关键字

在这里插入图片描述

五、

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1064383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不断优化的素数算法

前言&#xff1a;素数判断是算法中重要的一环&#xff0c;掌握优秀的素数判断方法是算法player的必修课。本文介绍的是由简到繁的素数算法&#xff0c;便于初学者从入门到精通。 素数&#xff08;质数&#xff09;&#xff1a;只能被 1 和它本身整除的数称作素数&#xff0c;如…

【Linux学习】05-2Linux上部署项目

Linux&#xff08;B站黑马&#xff09;学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 04Linux实用操作 05-1Linux上安装部署各类软件 05-2Linux上部署项目 文章目录 Linux&#xff08;B站黑马&#xff09;学习笔记前言05-2Linux上部署项目部署Springboot项目…

【AI视野·今日Sound 声学论文速览 第二十期】Fri, 6 Oct 2023

AI视野今日CS.Sound 声学论文速览 Fri, 6 Oct 2023 Totally 6 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Deep Generative Models of Music Expectation Authors Ninon Liz Masclef, T. Anderson Keller对音乐的情感反应的一个重要理论围绕着惊喜…

时间序列常用数据处理

1.组合技巧Compose 1.2 实例应用及其解释 # 用于组合多个数据处理方法 class Compose(object):def __init__(self, transforms):self.transforms transformsdef __call__(self, seq):for t in self.transforms:seq t(seq)return seq 这段Python代码定义了一个名为Compose的…

星火大模型AI接口Spring中项目中使用【星火、AIGC】

星火大模型AI接口使用 讯飞的星火大模型是有免费版本赠送200万个Token&#xff0c;就个人学习来说完全够用了。 免费申请过后&#xff0c;到控制台&#xff0c;两个红色方框是最要紧的。 星火认知大模型Web文档 | 讯飞开放平台文档中心 (xfyun.cn)这是官方文档对于接口的详细使…

【AI视野·今日NLP 自然语言处理论文速览 四十九期】Fri, 6 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 6 Oct 2023 Totally 44 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MathCoder: Seamless Code Integration in LLMs for Enhanced Mathematical Reasoning Authors Ke Wang, Houxi…

如何一键转发朋友圈,快速跟圈?

你是否曾为在微信上快速转发别人的朋友圈而烦恼&#xff1f;每天都要花费大量时间下载商品图片和复制粘贴商家的文案&#xff0c;让人疲惫不堪。我觉得这样太繁琐太麻烦了&#xff0c;每天都会上新货&#xff0c;上传朋友圈都要花将近一个小时的时间&#xff0c;花了大量时间在…

【C++设计模式之状态模式:行为型】分析及示例

简介 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为&#xff0c;看起来就像是改变了其类。状态模式将对象的状态封装成不同的类&#xff0c;并使得对象在不同状态下有不同的行为。 描述 状态模式通过…

C++ 类和对象篇(五) 析构函数

目录 一、概念 1. 析构函数是什么&#xff1f; 2. 为什么要有析构函数&#xff1f; 3. 怎么用析构函数&#xff1f; 3.1 创建析构函数 3.2 调用析构函数 二、特性 三、由编译器生成的默认析构函数 四、对象的析构顺序 1. 局部对象 2. new出来的堆对象 3. 全局对象 一、概念 1…

Linux指令示范(1)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇

小程序支付升级:实现微信支付V3接口接入

文章目录 用户付款流程业务流程讲解接入前准备快速接入1、引入开发库2、配置参数3、初始化商户配置4、微信支付对接5、支付回调-支付通知API 相较于 v2 版本&#xff0c;v3 版本的接口文档在阅读上可能显得相对凌乱。它的组织结构可能不太清晰&#xff0c;难以快速理解整个流程…

【Go语言实战】(25) 分布式算法 MapReduce

MapReduce 写在前面 身为大数据专业的学生&#xff0c;其实大学我也多多少少接触过mapreduce&#xff0c;但是当时觉得这玩意太老了&#xff0c;觉得这和php一样会被时代淘汰。只能说当时确实太年轻了&#xff0c;没有好好珍惜那时候的学习资源… 现在回过头来看mapreduce&a…

聊聊分布式架构——RPC通信原理

目录 RPC通信的基本原理 RPC结构 手撸简陋版RPC 知识点梳理 1.Socket套接字通信机制 2.通信过程的序列化与反序列化 3.动态代理 4.反射 思维流程梳理 码起来 服务端时序图 服务端—Api与Provider模块 客户端时序图 RPC通信的基本原理 RPC&#xff08;Remote Proc…

【算法练习Day13】二叉树的层序遍历翻转二叉树对称二叉树

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 二叉树的层序遍历翻转二叉树…

安装Ubuntu提示:系统找不到指定的文件。

今天我删除Ubuntu后重新下载&#xff0c;发现报错&#xff0c;错误信息如下&#xff1a; 这是因为系统没有卸载干净而导致的。 解决办法&#xff1a; 第一步&#xff1a; ##查询当前已安装的系统 wsl.exe --list --all 执行结果&#xff1a; 第二步&#xff1a; ##注销当前…

【GSEP202303 C++】1级 长方形面积

[GSEP202303 一级] 长方形面积 题目描述 小明刚刚学习了如何计算长方形面积。他发现&#xff0c;如果一个长方形的长和宽都是整数&#xff0c;它的面积一定也是整数。现在&#xff0c;小明想知道如果给定长方形的面积&#xff0c;有多少种可能的长方形&#xff0c;满足长和宽…

BF算法详解(JAVA语言实现)

目录 BF算法的介绍 图解 JAVA语言实现 BF算法的时间复杂度 BF算法的介绍 BF算法&#xff0c;即暴力(Brute Force)算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配&#xff0c;若相等&#xff0c;则继…

C++设计模式-桥接(Bridge)

目录 C设计模式-桥接&#xff08;Bridge&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-桥接&#xff08;Bridge&#xff09; 一、意图 将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。 二、适用性 你不希望在抽象和它…

[笔记] Microsoft Windows网络编程《三》网际协议

文章目录 前言3.1 IPv43.1.1 寻址3.1.1.1 单播3.1.1.2 多播(组播)3.1.1.3 广播 3.1.2 IPv4 管理协议&#xff08;ARP&#xff0c;ICMP&#xff0c;IGMP&#xff09;ARPICMPIGMP 3.1.3 Winsock 中的IPv4 寻址 3.2 IPv63.2.1 寻址3.2.1.1 单播链接——本地地址站点——本地地址&a…

ipa文件怎么把应用上架到苹果ios系统下载的App Store商城

注册为苹果开发者&#xff1a;首先&#xff0c;您需要注册为苹果开发者。前往苹果开发者网站&#xff08;https://developer.apple.com/&#xff09;&#xff0c;点击"Enroll"按钮&#xff0c;并按照相关步骤注册和付费&#xff08;开发者账号需要年度费用&#xff0…