第一节:C语言常见概念

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.

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值