ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

C语言介绍(一)

C语言介绍(一) 一、C语言的概念1.C语言是什么答C语言是一种计算机语言其他的计算机语言还有C/Java/GO/Python等。2.C语言的历史答C语言最初是作为Unix系统开发工具而发明的。3.编译器的选择-VS20223.1编译和链接C语言是一门编译型语言源码都是文本文件文本文件本身无法执行必须通过编译和链接生成二进制的可执行文件可执行文件才能执行。 C语言代码是放在.c为后缀的文件中要得到最终的可执行程序要经过编译和链接。 编译→**编译器cl.exe**→.obj目标文件 链接→**链接器 link.exe**→.exe二进制可执行文件 每个.c文件都会单独经过编译器处理生成对应的目标文件多目标文件和库文件经过连接器处理生成可执行文件。#includestdio.hintmain(){printf(hello world!);}3.2编译器的对比c语言是一门编译型的计算机语言需要以来编译器将计算机语言转换成机器语言能够执行的机器指令。常见的编译器msvc、clang、gcc集成开发环境IDEVS2022、XCode、CodeBlocks、DevC、Clion等。集成开发环境编辑器编译器调试器图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。几种编译器的对比• VS2022 集成了MSVC安装包较⼤⼀些安装简单⽆需多余配置使⽤起来⾮常⽅便• XCode 集成了clang苹果电脑上的开发⼯具• CodeBlocks 集成了gcc这个⼯具⽐较⼩众需要配置环境不太推荐• DevC 集成了gcc⼩巧但是⼯具过于简单对于代码⻛格的养成不好⼀些竞赛使⽤• Clion 是默认使⽤CMake编译器是可以配置的⼯具是收费所以暂时不推荐⼤家使⽤注意VSCode是编辑器可以安装插件搭建C/C的开发环境但是比较麻烦。3.3VS2022的优缺点优点主流的开发环境、企业使用普遍、包含编辑器编译器调试器、可直接安装不用配置环境、上手容易、界面是中文。缺点安装包大、占用空间大。3.4创建项目文件三步走step1创建项目创建空项目→起名字有意义、用英文、无空格→加路径固定位置step2创建.c文件源文件右键添加新建项→显示左右模板→C文件名称.cstep3写代码VS项目和源文件、头文件介绍在VS上写代码直接创建项目在项目中添加头文件.h和源文件.c。5.第一个C程序#includestidio.h//包含标准库的头文件intmain(){printf(hello C\n);}代码运行快捷键CtrlF56.main函数①每个C程序无论多少行代码都是从main函数开始执行的。②main函数式程序的入口。③main函数也被称为主函数。④main前面的int表示函数结束后返回一个整型的值程序结尾的return 0与之前后呼应。⑤main函数有且只有一个因为程序入口只能有一个。常见错误①关键字拼写错误②函数不能不能漏掉③代码中不能使用中文符号④一条语句结束后必须加上注意C语言中默认返回0表示正常返回返回非0表示异常返回。main函数的返回类型只能是int。7.printf和库函数printf函数是在标准输出设备一般只屏幕上进行信息的打印。printf函数可以直接打印字符串也可以打印指定类型的数据。intn100;printf(%d\n,n);//printf打印十进制整型printf(%u\n,n);//printf打印十进制无符号整型printf(%c\n,q);//printf打印字符printf(%lf\n,3.14);//printf打印双精度浮点型这里的%d等都是占位符会被后面输入的值替换。在使用库函数的时候是需要包含头文件的比如printf函数就需要包含stdio.h函数标准输入输出函数standard input output。What’s 库函数答为了不再重复实现常见的代码提升开发效率一个系列的库函数一般会声明在一个头文件中所以库函数的使用要包含对应的头文件。8.库函数C语言中有一批保留的名字的符号比如int、if、return等这些符号被称为保留字或关键字。·关键字都有管特殊的意义·自己创建的标识符不能和关键字重复·关键字不能自己创建C语言的32个关键字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile注在C99标准中加⼊了inline、 restrict 、_Bool、_Complex、_Imaginary等关键 字C语⾔关键字的全部介绍可参考如下链接C语言的关键字9.字符和ASCLL编码在键盘上可以敲出各种字符这些符号都被称为字符C语言中是用单引号括起来的如‘a’ ‘b’ 等。我们知道在计算机中所有的数据都是以二进制的形式储存的那这些字符在内存中分别以什么样的二进制进行储存呢为了方便大家相互通信不造成混乱美国国家标准学会ANSI出台了一个标准ASCLL编码C语言中的字符就遵循ASCLL编码。参考https://zh.cppreference.com/w/cpp/language/ascii我们不需要记住所有的ASCII码表中的数字使⽤时查看就可以不过我们最好能掌握⼏组特殊的数据• 字符 A~Z 的ASCII码值从65~90• 字符 a~z 的ASCII码值从97~122• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32• 数字字符0-9的ASCII码值从48~57• 换⾏ \n 的ASCII值是10• 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符⽆法打印在屏幕上观察。单个字符的打印可以使用%c来占位指定格式。#includestdio.hintmain(){printf(%c\n,Q);printf(%c\n,81);//这⾥的81是字符Q的ASCII码值也是可以正常打印的return0;}字符打印展示#includestdio.hintmain(){inti0;for(i32;i127;i){printf(%c ,i);if(i%1615)printf(\n);}return0;}打印结果10.字符串和\0C语言中使用双引号括起来的一串字符表示字符串如abcdefg就是一个字符串。字符串的打印格式可以使用%s来指定也可以直接打印演示如下intmain(){chara[]abcdef;printf(%s\n,a);printf(%s\n,hello C);printf(hello c);return0;}C语言字符串中有一个特殊的知识就是在字符串的末尾隐藏放着一个\0字符这个\0是是字符串的结束标志。可以调试观察。调试步骤F10调试起来→调试→窗口→监视随便点开一个→名称中输入要监视的量调试结果如下可以看到字符串展开结尾会有一个\0。\0是字符串的结束标志在使用printf打印字符串和strlen计算字符串长度的时候遇到\0就会停止。C语言也可以把一个字符串放在一个字符数组中如下所示#includestdio.hintmain(){chararr1[]{a,b,c};//arr1数组中存放3个字符chararr2[]abc;//arr2数组中存放字符串printf(%s\n,arr1);printf(%s\n,arr2);return0;}我们可以看到 arr1 字符数组在打印的时候打印了 a 、 b 、 c 后还打印了⼀些随机值这就是因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志在打印的时候没有停⽌。但是 arr2 的打印就是完全正常的就是因为 arr2 数组是使⽤字符串常量初始化的数组中有 \0。作为技术标志打印可以正常停⽌。如果我们在arr1数组中单独放⼀个 ‘\0’ 字符会怎么样呢看到三次打印的结果是⼀样的了都是打印到 \0 的时候就停⽌了那从上述的例⼦我们确实能够观察到 \0 的作⽤和重要性的。11.转义字符在字符中有⼀组特殊的字符是转义字符转义字符顾名思义转变原来的意思的字符。⽐如我们有字符 n 在字符串中打印的时候⾃然能打印出这个字符如下#includestdio.hintmain(){printf(abcndef\n);printf(abc\ndef);return0;}这就是转义字符的问题 \n 是⼀个转义字符表⽰换⾏的意思我们可以简单的理解为 \ 让 n 的意思发⽣了转变 n 本来是⼀个普通的字符被 \ 转义为换⾏的意思。C语⾔中像这样的转义字符还有⼀些具体如下• ? 在书写连续多个问号时使⽤防⽌他们被解析成三字⺟词在新的编译器上没法验证了。• ’ ⽤于表⽰字符常量’• ⽤于表⽰⼀个字符串内部的双引号• \ ⽤于表⽰⼀个反斜杠防⽌它被解释为⼀个转义序列符。• \a 警报这会使得终端发出警报声或出现闪烁或者两者同时发⽣。• \b 退格键光标回退⼀个字符但不删除字符。• \f 换⻚符光标移到下⼀⻚。在现代系统上这已经反映不出来了⾏为改成类似于 \v 。• \n 换⾏符。• \r 回⻋符光标移到同⼀⾏的开头。• \t 制表符光标移到下⼀个⽔平制表位通常是下⼀个4/8的倍数。• \v 垂直分隔符光标移到下⼀个垂直制表位通常是下⼀⾏的同⼀列。下⾯2种转义字符可以理解为字符的8进制或者16进制表⽰形式• \ddd d d d表⽰1~3个⼋进制的数字。 如 \130 表⽰字符X• \xdd d d表⽰2个⼗六进制数字。 如 \x30 表⽰字符0\0 null 字符代表没有内容 \0 就是 \ddd 这类转义字符的⼀种⽤于字符串的结束标志其ASCII码值是0.#includestdio.hintmain(){printf(%c\n,\);printf(%s\n,\);printf(c:\\test\\code\\test.c\n);printf(\a);printf(%c\n,\130);//130是8进制转换成10进制是88以88作为ASCII码值的字符是Xprintf(%c\n,88);printf(%c\n,\x30);//x30中的30是16进制转换成10进制是48以48作为ASCII码值的字符是0return0;}转义字符可自行测试。关于转义字符我们⾸先要了解然后要能在字符串中识别出来。转义字符参考12.语句和语句分类C语言代码是由一条条语句构成的C语言的语句可以分为以下五类①空语句②表达式语句③函数语句④复合语句⑤控制语句12.1空语句空语句是最简单的一个分号就是一条语句是空语句。#includestdio.hintmain(){;//空语句return0;}空语句一般出现的地方是这里需要一条语句但是这个语句不需要做任何事情就可以写一个空语句。12.2表达式语句表达式语句就是在表达句的后边加上分号如下所示#includestdio.hintmain(){inta20;intb0;ba5;//表达式语句return0;}12.3函数调用语句函数库函数自定义函数函数调用的时候也会加上分号就是函数调用语句如下所示#includestdio.hintAdd(intx,inty){returnxy;}intmain(){printf(hehe\n);//函数调⽤语句intretAdd(2,3);//函数调⽤语句return0;}12.4复合函数代码块复合函数其实就是代码块成对的括号就构成一个代码块也被称为复合语句。#includestdio.hvoidprint(intarr[],intsz)//函数的⼤括号中的代码也构成复合语句{inti0;for(i0;isz;i){printf(%d ,arr[i]);}}intmain(){inti0;intarr[10]{0};for(i0;i10;i)//for循环的循环体的⼤括号中的就是复合语句{arr[i]10-i;printf(%d\n,arr[i]);}return0;}12.5控制语句C语言是结构化的程序设计语言。控制语句用于控制程序的执行流程以实现程序的各种结构方式C语言支持三种结构顺序、分支、循环它们由特定的语句定义符组成C语言有九种控制语句。1.条件判断语句也叫分⽀语句if语句、switch语句2.循环执⾏语句dowhile语句、while语句、for语句3.转向语句break语句、goto语句、continue语句、return语句。13. 注释是什么为什么写注释注释是对代码的说明编译器会忽略注释也就是说注释对实际代码没有影响。注释是给程序员⾃⼰或者其他程序员看的。好的注释可以帮我们更好的理解代码但是也不要过度注释不要写没必要的注释。当然不写注释可能会让后期阅读代码的⼈抓狂。写注释⼀定程度上反应了程序作者的素质建议⼤家写必要的注释在未来找⼯作的时候写代码时留下必要的注释也会给⾯试官留下更好的印象。13.1注释的两种形式C语言有两种表示方法。13.1.1 /**/形式第⼀种⽅法是将注释放在 /…/ 之间内部可以分⾏。这是C语言早期的注释方式。/* 注释 *//* 这是⼀⾏注释 */这种注释可以插在⾏内。上⾯⽰例中 /* file name */ ⽤来对函数参数进⾏说明跟在它后⾯的代码依然会有效执⾏。这种注释⼀定不能忘记写结束符号 */ 否则很容易导致错误。printf(a );/* 注释⼀ printf(b ); printf(c ); /* 注释⼆ */printf(d );上⾯⽰例的原意是第⼀⾏和第三⾏代码的尾部有两个注释。但是第⼀⾏注释忘记写结束符号导致注释⼀延续到第三⾏结束。/**/ 的这个注释也不⽀持嵌套注释 /* 开始注释后遇到第⼀个 */ 就认为注释结束了。/* printf(a ); printf(b ); printf(c ); /* 注释⼆ */printf(d );*/13.1.2 //形式第⼆种写法是将注释放在双斜杠 // 后⾯从双斜杠到⾏尾都属于注释。这种注释只能是单⾏可以放在⾏⾸也可以放在⼀⾏语句的结尾。这是 C99 标准新增的语法。注释快捷键CtrlKC取消快捷键ctrlKV// 这是⼀⾏注释intx1;// 这也是注释不管是哪⼀种注释都不能放在双引号⾥⾯。双引号⾥⾯的注释符号会成为字符串的⼀部分解释为普通符号失去注释作⽤。printf(// hello /* world */ );上⾯⽰例中双引号⾥⾯的注释符号都会被视为普通字符没有注释作⽤。13.2注释会被替换编译时注释会被替换成⼀个空格所以 min/* 这⾥是注释*/Value 会变成 min Value ⽽不是 minValue 。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进