一文讲解C语言关键字

C 语言中的标识符可以使用下划线、字母和数字组成,但也有一些词汇不能当作标识符,即关键字。经过多年的发展,C 语言到现在已经有了 40 多个关键字,如下图所示。

一文讲解C语言关键字

C 语言在 C90 版本,总共有 32 个标识符作为关键字,C99 增加了 5 个关键字,C11 又增加了 7 个关键字,这些关键字皆不能用于其他用途。根据关键字的作用可以将关键字进行分类,如用于表示数据类型的、用于流程控制的等等。

数据类型

C 语言有一些关键字用来表示数据类型,告知编译器声明的变量是存储整型还是字母等数据。

一文讲解C语言关键字

C语言中的数据类型都是通过上面的关键字来表示,如 int 表示缺省的整型类型,省略了 signed 修饰符,可表示的最小取值范围为 -32767~32767,当使用 unsigned 修饰 int 时,就只能表示非负值了。

shortlong 也是用于修饰 int 的关键字,修饰后所占用的存储空间会不同,如 short int 占用 2 字节,long int 占用 4 字节。

floatdouble 用来声明浮点数,并且使用 long 修饰 double 后,可以存储比 double 更高的精度。

C99标准新增了三个关于数据类型的关键字, _Bool 类型表示布尔值,即 true 表示 1,, false 表示 0。_Complex_Imaginary 分别表示复数和虚数。

除此之外,还有 struct 用于声明结构体,union 声明联合,enum 来声明枚举,void 在没有可用的值时使用,typedef 可以对上述数据类型声明类型别名,sizeof 用来计算类型或类型变量所占字节数大小。

存储类型

C语言通过存储类型来指定变量存储的内存类型、生命周期、和作用域。总共提供了 5 种关键字来表示,其中有一个是在C11标准中新增的。

一文讲解C语言关键字

auto 指定为变量,在块作用域内使用,但通常省略;当想要将变量存储到寄存器中时,可以使用 register 关键字来修饰;当想要变量在整个程序执行过程中一直存在,就使用 staticextern 关键字用来指定外部变量,即在其他文件中定义,要在本文件中引用。C11又新增了 _Thread_local 关键字来修饰具有线程周期的线程局部变量,可将线程之间数据分开,避免对象在共享中被竞争。

限定类型

C语言中有四个关键字表示限定类型,C90标准加入的 constvolatile,C99标准加入的 restrict 和 C11 标准加入的 _Atomic

一文讲解C语言关键字

const 在修饰指针时,共有三种情况,第一种情况写法是 const int *  或 int const *

int a = 10;
const int *p = &a;
*p = 20;  // error: assignment of read-only location '*p'

*p = 20 报错,这是因为 p 指向的值不能被改变,但可以通过 p 的引用来改变变量的值。

int a = 10;
const int *p = &a;
a = 20;

除了改变引用外,还可以改变指针本身的值。

int a = 10;
const int *p = &a;
int b = 20;
p = &b;

第二种写法是 float * const,该写法的指针必须指向同一个地址,但所指向的值可以改变。

int a = 10;
int * const p = &a;
*p = 20;

第三种写法是 const int * const,表明指针不能指向别处,所指向的值也不能更改。

int a = 10;
const int * const p;
int b = 20;
p = &b;  // error: assignment of read-only variable 'p'

但还是可以通过改变 a 的值来改变。

int a = 10;
const int * const p;
a = 20;

流程控制

流程控制是决定程序运行的关键,其主要有顺序控制、分支控制和循环控制,通过 C 语言提供的关键字来控制,如下图所示。

一文讲解C语言关键字

实现循环结构可以使用 forwhiledo 三个关键字来实现,分支结构则使用 ifelseswitchcasedefault 来实现,并且在循环或分支中得到想要的结果后,想要从流程中跳转,就可以用上 breakcontinuereturngoto 了,当然,goto 最好少使用,它会让程序变得复杂,难以维护。

其它关键字

除以上介绍的关键字外,还有一些其他作用的关键字如下图所示。

一文讲解C语言关键字

函数调用过程包括建立调用、传递参数、跳转到函数代码并返回。使用宏定义使代码内联,可避免函数调用的开销,而 C99 标准提供的 inline 关键字可用来定义内联函数。

inline static int sum(int a, int b) {    // 内联函数
    return a + b;
}
int main() {
    ...
    sum(1020);    // 函数调用
    ...
    return 0;
}

编译器可能会用 sum 中的代码替换函数调用,并可能会执行一些 优化

_Noreturn 修饰的函数不会将控制权交还给主调函数,以免滥用,并通知编译器可优化一些代码。

_Noreturn void failed() {
    printf("failedn");
}

int main() {

    printf("--start--n");
    failed();
    printf("--end--n");
    return 0;
}
/*
--start--
failed
*/

C语言本身是不支持泛型编程的,但C11标准新增 _Generic 关键字实现一个泛型表达式来实现泛型编程。

_Generic(exp. type1:exp1, type2: exp2,···, default:expn)

_Generic 关键字括号中的第 1 项是表达式,后面每个项都由 type: exp 组成。type用于匹配类型,exp 为匹配后的值。

#define TYPE(v) _Generic((v), 
    int:"int"
    char: "char"
    float: "float"
    double: "double"
    default: "other"
)

int main() {
    int a = 5;
    printf("%sn", TYPE(a));    // int
    printf("%sn", TYPE(&a));    // other
    return 0;
}

C11标准加入的 _Static_assert 关键字与断言 assert() 类似,但 assert() 是在运行时检查,而 _Static_assert 是在编译时检查,检查不通过,程序就无法通过编译。

int main() {
    _Static_assert(sizeof(int) == 2"16 bit is not supported");
    return 0;
}
/*
error: static assertion failed: "16 bit is not supported"
*/


一文讲解C语言关键字


原文始发于微信公众号(海人为记): 一文讲解C语言关键字

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/27417.html

(0)
小半的头像小半
0 0

相关推荐

  • 架构师必备:系统容量现状checklist 后端开发

    架构师必备:系统容量现状checklist

    0 092
    小半的头像 小半
    2022年8月30日
  • 【Spring Cloud Alibaba】Swagger 聚合接口文档 架构设计

    【Spring Cloud Alibaba】Swagger 聚合接口文档

    0 0117
    小半的头像 小半
    2023年1月4日
  • MySQL索引经典15问! 后端开发

    MySQL索引经典15问!

    0 0102
    小半的头像 小半
    2022年9月20日
  • 代码美如画,装上这些主题,VSCode 还不得原地起飞!!! 技术分享

    代码美如画,装上这些主题,VSCode 还不得原地起飞!!!

    0 040
    明月予我的头像 明月予我
    2024年4月18日
  • 手写 Puppeteer:远程控制 Chromium 前端开发

    手写 Puppeteer:远程控制 Chromium

    0 0108
    神光的编程秘籍的头像 神光的编程秘籍
    2023年2月17日
  • 32. Vue组件的定义以及创建方式 前端开发

    32. Vue组件的定义以及创建方式

    0 0129
    小半的头像 小半
    2022年9月26日
  • Go中err那些事 Go语言

    Go中err那些事

    0 088
    小半的头像 小半
    2023年2月15日
  • 解密 Python 的弱引用 Python

    解密 Python 的弱引用

    0 055
    小半的头像 小半
    2024年3月23日
  • 解构标志性的 Apple Watch Bubble UI 微信精选

    解构标志性的 Apple Watch Bubble UI

    0 0113
    小半的头像 小半
    2022年11月23日
  • 大屏之页面监控系统 微信精选

    大屏之页面监控系统

    0 0102
    小半的头像 小半
    2023年2月14日
  • Leidenalg,一个非常好用的Python库 Python自学教程教程

    Leidenalg,一个非常好用的Python库

    0 043
    python学霸的头像 python学霸
    2024年4月26日
  • 前端实现docx、pdf格式文件在线预览 Vue

    前端实现docx、pdf格式文件在线预览

    0 0384
    小半的头像 小半
    2022年11月9日

发表回复

登录后才能评论

站长精选

  • 这款 MySQL、Oracle、HDFS 数据同步工具,有点牛逼!

    这款 MySQL、Oracle、HDFS 数据同步工具,有点牛逼!

    2022年12月26日

  • Java与MySQL的绝妙结合:打造高效审批流程

    Java与MySQL的绝妙结合:打造高效审批流程

    2023年12月22日

  • 三分钟了解 SpringBoot 的启动流程

    三分钟了解 SpringBoot 的启动流程

    2023年6月18日

  • 开放式远程教学平台Edrys

    开放式远程教学平台Edrys

    2022年11月21日

  • 12 张图 | 硬刚了一波,三层缓存架构

    12 张图 | 硬刚了一波,三层缓存架构

    2023年5月24日

  • 如何合理估算 Java 线程池大小:综合指南

    如何合理估算 Java 线程池大小:综合指南

    2023年11月12日

  • SpringBoot + Nacos 实现了一个动态化线程池,非常实用!

    SpringBoot + Nacos 实现了一个动态化线程池,非常实用!

    2024年2月16日

  • 10 个优化技巧,减少 Docker 镜像大小

    10 个优化技巧,减少 Docker 镜像大小

    2023年7月20日

  • 一个账号打通所有应用,这款开源的数字身份管控系统来搞定!

    一个账号打通所有应用,这款开源的数字身份管控系统来搞定!

    2023年8月14日

  • 升级SpringBoot版本,引出了一个大Bug

    升级SpringBoot版本,引出了一个大Bug

    2022年11月21日

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!

PHP网站源码怒江网站优化按天计费盐城如何制作网站河池网站推广方案公司宝安模板网站建设青岛SEO按效果付费公司昭通网站优化排名价格济源网站开发价格天水百度seo报价徐州关键词排名包年推广推荐盘锦网站建设报价百色品牌网站设计多少钱通化网站改版多少钱铁岭英文网站建设哪家好连云港建设网站哪家好海南关键词按天收费舟山网站搭建报价酒泉网站推广工具哪家好达州模板网站建设价格广安网站改版公司大丰模板制作哪家好防城港优秀网站设计多少钱常德seo排名哪家好德州阿里店铺托管报价文山seo公司大鹏网络营销价格民治网站改版哪家好兴安盟企业网站改版哪家好贵港网站设计哪家好枣庄网络广告推广多少钱丹东百姓网标王歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化