1. C语言是什么?
C语言是一种计算机语言——人与人之间是通过自然语言来进行交流的,如两个中国人之间用中文进行沟通,而人与计算机则是通过计算机语言进行交互的,人通过用计算机语言写出的程序来给计算机下达指令,让计算机进行各种各样的工作。已知的计算机语言有上千种,如C++/Java/Go/Python等都是计算机语言,C语言就是其中的一种。
2. 第一个C语言程序
写一个C语言代码,在屏幕上打印“Hello World”。
经过:编译+链接+运行代码(Ctrl+Fn+F5)
运行结果:
3. main函数
main函数也叫主函数,每个C语言程序不管有多少行代码,都是从main函数的第一行开始执行的。
按Fn+F10——逐过程调试:
按一次Fn+F10:
再按一次Fn+F10:
F10按了以后,代码就开始运行了。
- main函数是程序的入口;
- main函数有且仅有一个;
- 即使一个项目中有多个.c文件,但也只能有一个main函数(因为程序的入口只能有一个)。
(1).在test.c源文件下使用main函数:
(2).在add.c源文件下同样也使用main函数:
(3).任意运行其中的一个源文件中的程序,发现程序报错:
(4).错误信息:“main已经在add.obj中定义”说明“即使一个项目中有多个.c文件,但也只能有一个main函数”。
main函数的标准模板:
注:
- 代码中不能使用中文符号,比如使用频繁的括号和分号,中英文符号一定要区分;
- 一条语句结束后,一定要记得写分号 。
main函数的多种写法:
4. printf和库函数
printf 是函数,是标准C语言库中提供的现成的函数,所以也是库函数。
功能:在标准输出设备(一般指屏幕上)打印信息。
printf——print format——按照格式来打印信息。
(1).printf 打印字符串:
(2).printf也可以用来打印其他类型的数据:
注:这里的%s、%d等是占位符,会被后边的值替换。
printf 是库函数,我们在使用库函数时,是需要包含头文件的:
printf 函数需要包含的就是stdio.h这个头文件,包含方法是:#include<stdio.h>,
其中 :
- std—standard— 标准;
- i—input— 输入;
- o—output— 输出。
若使用printf 函数不包含头文件,则程序运行时会报错:
(双斜杠//表示注释符号,在C语言程序中任意使用此符号可使其后的语句无效)
那什么是库函数呢?
C语言最先创立出来是不够完善、有些简陋的,只规定了一些语法,如:if 语句怎么写,for 循环语句怎么写?什么是数组,什么是函数?让程序员们按照语法规则来写代码。
而程序员们会经常需要重复地完成一些代码的书写,如:
- 在屏幕上打印信息;
- 输入信息;
- 求字符串的长度;
- ……
且每位程序员写的代码可能各不相同,最终导致开发效率低下。
为了使程序员不用再重复实现常见的代码,提升开发效率,C语言标准规定了一组函数,如:printf、scanf、strlen等函数,分别阐释它们的函数名、参数、返回类型、实现功能等,组成一个函数库,即标准库,标准库中的函数就被称为库函数。
这些库函数先由不同的编译器厂商根据标准进行具体实现,然后再提供给程序员使用。在这个基础上一些编译器厂商可能还会额外扩展提供其他部分函数(不同编译器不一定支持)。
内存相关的函数、输入相关的函数等分别是不同系列的函数,一个系列的库函数,一般会声明在同一个头文件中,所以库函数的使用要包含对应的头文件。
需要提前了解更多的库函数可参考链接:https://cplusplus.com/reference/clibrary/
8. 关键字介绍
C语言中有一批提前保留好名字的符号,如:int、if、return,这些符号被称为保留字或者关键字。
- 关键字都有特殊意义,如int—整型,if—判断,return—返回,是预留给C语言使用的;
- 程序员自己在创建标识符的时候不能和关键字重复;
- 关键字也不能自己创建。
C语言的32个关键字如下:
注:在C99标准中加入了inline、restrict、_Bool、Complex、_Imaginary等关键字。
还有其他的关键字可自行去了解,不过使用最频繁的还是上面的32个关键字。
C语言关键字的全部介绍:https://zh.cppreference.com/w/c/keyword
9. 字符和ASCll编码
通过键盘我们可以在屏幕上敲出各种各样的符号,如:a、b、@、#等,这些符号在C语言中都被称为字符,且都是用单引号' '括起来的,如:'a'、'b'、'@'、'#'。
已知在计算机中所有的数据都是以二进制的形式存储的,那么这些字符在内存中分别是以什么样的二进制存储的?
有人试着给每个字符都编了一个二进制序列,这个过程称为编码,当越来越多的人给字符编码后,为了方便大家相互通信,不造成混乱,美国国家标准学会(ANSI)出台了一个ASCll编码标准,从此C语言中的字符就都遵循ASCll编码的方式。
参考:https://zh.cppreference.com/w/cpp/language/ascii
不需要记住所有ASCll码表中的数字,使用时查看就好,但最好能掌握几组特殊的数据:
- 字符 A~Z 的ASCll码值是:65~90;
- 字符 a~z 的ASCll码值是:97~122;
- 对应大小写字符(如A和a)ASCll码值的差值是:32;
- 数字字符 0~9 的ASCll码值是:48~57;
- 换行符号 \n 的ASCll码值是:10
- 在这些字符中ASCll码值从 0~31 中这32个字符是不可打印字符,无法打印到屏幕上观察。
一些代码实现
(1).单个字符的打印可以使用%c来指定格式:
(2).可打印字符展示 :
10.字符串和\0
C语言中使用双引号括起来的一串字符被称为字符串 ,如:"abcdef" 就是一个字符串。
字符串的打印格式可以用 %s 来指定,也可以直接打印:
C语言字符串中有一个特殊的知识,就是在字符串的末尾隐藏着一个 \0 字符,这个 \0 字符是字符串的结束标志。
因为字符串的末尾隐藏着一个 \0 ,且 \0 是字符串的结束标志,所以我们在使用库函数printf()打印字符串或strlen()计算字符串的长度时,遇到 \0 会自动停止。
代码验证
两个字符数组对比,含有字符串的arr1数组确实包含 \0 :
当我们使用printf函数打印数组时:
(1).打印arr1数组时遇 \0 停止打印,而因为arr2中无 \0 作为结束标志,其后打印出了一堆乱码:
在arr2数组中无 \0,那么printf函数就会继续在 arr2 数组之外的内存空间中继续打印,直至遇到\0 停止,所以arr2的最终打印结果是未知的。
(2).当我们在arr2数组中放一个 \0 字符:
当我们使用strlen函数计算字符串长度时:
(1).arr1有 \0,arr2没有:
(2).两个数组都含 \0 :
在strlen计算字符串长度时,因为arr1中含 \0 ,strlen 遇到 \0 停止,所以 arr1 中包含的 \0 之前“abcdef” 六个字符的个数就被作为计算结果输出了。
而在arr2数组中无 \0,那么strlen函数就会继续在 arr2 数组之外的内存空间中继续计算,直至遇到\0 停止,所以arr2的最终计算结果是无法预料的。
从上述两个例子中我们可以直观感受到 \0 的作用和重要性了吧。
11.转义字符
在上文我们接触到了几个特殊的字符,如:\n、\0,已知 \n 的含义是换行,\0 的含义是字符串结束标志,这些特殊字符就是转义字符。转义字符顾名思义:转变原来字符的意义。
代码示例
(1).普通字符n:
(2).转义字符n:
\n 是一个转义字符表示换行,我们可以简单理解为 \ 让 n 的意思发生了转变——n 本来是一个普通的字符,被 \ 转义成了换行的意思。
C语言中像这样的转义字符还有很多,具体如下:
- \?:在书写连续多个问号时使用,防止他们被解析成三字母词(在新编译器上没法验证);
- \':用于表示字符常量 ‘ ;
- \":用于表示一个字符串内部的双引号;
- \\:用于表示一个反斜杠,防止 \ 与其后字符被解释为一个转义字符;
- \a:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生;
- \b:退格键,光标回退并删除一个字符;
- \f:换页符,光标移到下一页(在现代系统上,这已经反映不出来了,行为改成类似于\v);
- \n:换行符;
- \r:回车符,光标移到同一行的开头;
- \t:制表符,光标移到下一个水平制表位,通常是下一个4或8的倍数;
- \v:垂直分隔符,光标移到下一个垂直指标位,通常是下一行的同一列。
下面两种转义字符可以理解为:字符的八进制或十六进制ASCll码值表示形式
- \ddd:d d d 表示1~3个八进制数字,如:\130 表示字符X;
- \xdd:d d 表示2个十六进制数字,如:\x30 表示字符 0。
\0 :null字符,代表没有内容,\0 就是 \ddd 这类转义字符的一种,用于作为字符串的结束标志,其ASCll码值是0。
关于转义字符我们首先要了解,然后要能在字符串中识别出来。
转义字符参考:https://zh.cppreference.com/w/c/language/escape
12.语句和语句分类
C语言的代码是由一条一条的语句构成的,C语言中的语句可分为以下五类:
- 空语句;
- 表达式语句;
- 函数调用语句;
- 复合语句;
- 控制语句。
12.1 空语句
空语句是最简单的,一个分号就是一条空语句。
应用场景:这里需要一条语句,但是这条语句不需要做任何事。
12.2 表达式语句
在表达式的后边加上分号就是一条表达式语句。
12.3 函数调用语句
12.4 复合语句
复合语句也就是代码块,成对大括号中的代码构成一个代码块,也被称为复合语句。
for循环循环体中的大括号中的语句就是复合语句:
12.5 控制语句
控制语句用于控制程序的执行流程,以实现程序中的各种结构(C语言支持三种结构:顺序结构、选择结构、循环结构),它们各由特定的语句定义符组成。
C语言有九种控制语句,可分成以下三类:
- 条件判断语句也叫分支语句:if 语句、switch 语句;
- 循环执行语句:do while 语句、while 语句、for 语句;
- 转向语句:break 语句、goto 语句、continue 语句、return 语句。
13.注释是什么?为什么写注释?
注释是对代码的说明,当编译代码时,编译器会忽略注释,也就是说注释实际上对代码没有影响。
注释是给程序员自己,或其他程序员看的。
好的注释可以帮我们更好地理解代码,但是不要过度注释,也不要写没必要的注释。
不写注释可能会让后期阅读代码的人抓狂。
写注释在一定程度上反映了程序作者的素质,建议写一些必要的注释(在未来找工作时,在代码上留下必要注释也会给面试官留下好印象)。
13.1 注释的两种形式
C语言中的注释有两种形式。
13.1.1 /**/ 的形式
这种写法是将注释内容放在/*……*/之间,内部可以分行:
这种注释也可以插在行内:
这种注释一定不要忘记写结束符号 */,否则很容易导致错误。
/**/ 这种注释也不支持嵌套注释,当 /* 开始注释后,遇到第一个 */ 就认为注释结束了:
13.1.2 // 的形式
这是C99标准新增的语法。
这种写法是将注释内容放在双斜杠 // 的后面,从双斜杠 // 位置到此行行尾都属于注释部分:
这种注释只能是单行的,可以放在行首也可以放在一行语句的结尾:
不管是哪一种注释,都不能放在双引号里面,因为双引号里面的注释符号会成为字符串的一部分,解释为普通符号,最终失去注释作用:
13.2 注释会被替换
在C语言代码进行编译时,注释会被替换成一个空格。如:main/* 这里是注释 */value 会变成 main value,而不是 mainvalue.