C基础——学习笔记(2)
在上一篇文章里面,我们介绍了C语言的历史、编译器的选择,以及撰写了第一个C语言程序,接着再让我们继续看看C语言的其他基础知识吧
文章目录
在C语言中,令牌(Token)是程序的基本组成单位,编译器通过对源代码进行词法分析,将代码分解成一个个的令牌。
C语言的令牌主要包括以下几种类型
- 关键字(Keywords)
- 标识符(Identifiers)
- 常量(Constants)
- 字符串字面量(String Literals)
- 运算符 (Operators)
- 分隔符(Separators)
下面我们便来逐个解释这几种类型
1.关键字
C语言中有一批保留名字的符号,比如:int,if,else等,这些符号被称为保留字或者关键字,是编程中用于指定数据类型,控制结构等功能的保留字。
- 关键字都有其特殊的意义,是保留给C语言实现某些功能所使用的
- 程序员在编写代码时,不能创建和关键字重复的标识符
- 关键字是C语言官方规定的,不可以自己创造
以下是C语言中的常见关键字
关键字 说明 auto 声明自动变量 break 跳出当前循环 case 开关语句分支 char 声明字符型变量或函数返回值类型 const 定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变 continue 结束当前循环,开始下一轮循环 default 开关语句中的"其它"分支 do 循环语句的循环体 double 声明双精度浮点型变量或函数返回值类型 else 条件语句否定分支(与 if 连用) enum 声明枚举类型 extern 声明变量或函数是在其它文件或本文件的其他位置定义 float 声明浮点型变量或函数返回值类型 for 一种循环语句 goto 无条件跳转语句 if 条件语句 int 声明整型变量或函数 long 声明长整型变量或函数返回值类型 register 声明寄存器变量 return 子程序返回语句(可以带参数,也可不带参数) short 声明短整型变量或函数 signed 声明有符号类型变量或函数 sizeof 计算数据类型或变量长度(即所占字节数) static 声明静态变量 struct 声明结构体类型 switch 用于开关语句 typedef 用以给数据类型取别名 unsigned 声明无符号类型变量或函数 union 声明共用体类型 void 声明函数无返回值或无参数,声明无类型指针 volatile 说明变量在程序执行中可被隐含地改变 while 循环语句的循环条件 C99 新增关键字
_Bool
_Complex
_Imaginary
inline
restrict
C11 新增关键字
_Alignas
_Alignof
_Atomic
_Generic
_Noreturn
_Static_assert
_Thread_local
常见的关键字有:
- 数据类型关键字:包括int(整数)、float(浮点数)、double(双精度浮点数)、char(字符)和void(无类型)。
- 控制结构关键字:包括if(条件语句)、else(条件语句的另一种选择)、switch(多条件选择语句)、case(switch语句中的选项)、while(循环语句)、do(循环语句)、for(循环语句)、break(跳出循环)和continue(继续下一次循环)。
- 存储类别关键字:包括auto(自动存储变量)、register(寄存器存储变量)、extern(外部声明变量)和static(静态存储变量)。
- 其他关键字:包括return(从函数返回)、const(定义常量)、volatile(指示变量可能被外部因素更改)、typedef(为数据类型定义别名)和enum(枚举类型)。
[C关键字官方网址](C 关键词 - cppreference.com)
2.标识符
标识符是程序中变量、函数、数组等的名字。标识符由字母(大写或小写)、数字和下划线组成,但第一个字符必须是字母或下划线,不能是数字。
一个标识符以字母A-Z或a-z或下划线_开始,后跟零个或多个字母、下划线和数字0-9。
C标识符内不允许出现标点字符,如@、$和%。C是区分大小写的编程语言。因此,在C中,Apple和apple是两个不同的标识符,以下是几个有效的标识符:
mohd zara abc move_name a_123 myname50 _temp j a23b9 retVal
3.常量
常量是固定值,在程序执行期间不会发生改变。
常量可以是整型常量、浮点型常量、字符常量、枚举常量等。
const int MAX = 100; // 整型常量 const float PI = 3.14; // 浮点型常量 const char NEWLINE = '\n'; // 字符常量
4.字符、ASCII编码与字符串字面量
4.1 字符
在进行编程时,我们可以通过键盘输入各种字符,如a,h,&,@等,这些都被成为字符,C语言中的字符使用单引号括起来的,如’a’、‘b’、'@'等。单个字符的打印可以用**%c**来指定格式。
#include <stdio.h>
int main()
{
printf("%c\n",'a');
return 0;
}
(打印字母a)
4.2 ASCII编码
在计算机中,所有的数据在存储和运算时都要使用二进制数表示,例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。C语言中的字符就遵循了ASCII编码的方式。
可以尝试记忆以下几组比较特殊的数据
-
字符AZ的ASCII码值从6590
-
字符az的ASCII码值从97122
-
对应的大小写字符(a和A)的ASCII码值的差值是32
-
数字字符09的ASCII码值从4857
-
换⾏ \n 的ASCII值是:10
-
在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,无法打印在屏幕上观察
-
字符其实也属于整型家族
4.3 字符串字面量
字符串字面量是由双引号 “” 括起来的字符序列,字符串的打印格式为%s。
字符串末尾会自动添加一个空字符\0
。
空字符\0
是字符串结束的标志,电脑需要遇到\0
才认为该字符串停止,下面做一个验证
我们知道arr1中有abcd\0,因此在打印arr1时,打印完abcd就停止了,而arr2中后面还打印了一些随机值,说明计算机在内存中找到了别的\0
并将其前面的值打印,才产生了报错的现象,由此可以证明\0
作为字符串结束标志的重要性。
5.分隔符
分隔符用于分隔语句和表达式,常见的分隔符包括:
- 逗号(,):用于分隔变量声明或函数参数。
- 分号(;):用于结束语句。
- 括号:
- 圆括号(
()
)用于分组表达式、函数调用。 - 花括号(
{}
)用于定义代码块。 - 方括号(
[]
)用于数组下标。
- 圆括号(
在 C 程序中,分号 ; 是语句结束符,也就是说,每个语句必须以分号结束,它表明一个逻辑实体的结束。
例如,下面是两个不同的语句:
printf("Hello, World! \n");
return 0;
一个单独的分号也可以作为一个空语句,表示什么都不做。例如:
;
6.运算符
运算符用于执行各种操作,如算术运算、逻辑运算、比较运算等。
C语言中的运算种类繁多,常见的包括:
- 算术运算符:
+
,-
,*
,/
,%
- 关系运算符:
==
,!=
,>
,<
,>=
,<=
- 逻辑运算符:
&&
,||
,!
- 位运算符:
&
,|
,^
,~
,<<
,>>
- 赋值运算符:
=
,+=
,-=
,*=
,/=
,%=
- 其他运算符:
sizeof
,?:
,&
,*
,->
,.
6.1 算术操作符:+、-、*、/、%
C语言中为了方便运算,提供了一系列的操作符(也叫运算符)。其中有一组被称为算术操作符。分别为常见的加减乘除和求余(对应±*/%),这些操作符都是双目操作符。
6.1.1 加和减
+和 -都用来完成加法和减法,其中+和-都是有两个操作数的,位于操作符两端的就是他们的操作数,因此这种操作符也被称为双目操作符。
#include <stdio.h>
int main()
{
int x = 4+16;
int y = 77-56;
printf("%d\n",x);//输出20
printf("%d\n",y);//输出21
return 0;
}
6.1.2 乘
运算符*用来完成乘法。
#include <stdio.h>
int main()
{
int a = 12;
int b = 3;
printf("%d\n",a*b);//输出36
return 0;
}
6.1.3 除
运算符/用来表示除法。
注意:除号的两端如果是整数,执行的就是整数除法,得到的结果也是整数。
如果需要得到浮点数的结果,两个运算数必须至少有一个是浮点数,这个时候C语言会自动进行浮点数除法。
6.1.4 求余
运算符%表示求模(余)运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。
#include <stdio.h>
int main()
{
int a = 8 % 5;
printf("%d\n",a);//输出3
return 0;
}
负数的求余规则是,结果的正负号由第一个运算数的正负号决定
#include <stdio.h>
int main()
{
printf("%d\n", 11 % 5);//1
printf("%d\n", -11 % 5);//-1
printf("%d\n", 11 % -5);//1
printf("%d\n", -11 % -5);//-1
return 0;
}
上面示例中,第一个运算数的正负号(11或-11)决定了结果的正负号。
6.2 赋值操作符:=和复合赋值
在创建变量的时候,给变量一个值叫初始化,在变量创建好后,再给一个值,这称为赋值。如果不给变量进行初始化,则不同的编译器可能会报错。
int a = 10;//初始化
a = 2;//赋值,这里使用了“=”赋值操作符
6.2.1 连续赋值
赋值操作符也可以连续赋值,如:
int a = 2;
int b = 3;
int c = 0;
c = b = a+3;
虽然C语言支持这种连续赋值,但是写出的代码不容易理解,建议还是才开来写,这样方便观察代码的执行细节。
int a = 2;
int b = 3;
int c = 0;
b = a+3;
c = b;
这样在调试的时候方便我们进行观察。
6.2.2 复合赋值法
在写代码的时候,我们有时需要对一个变量进行自增或者自减的操作,具体演示为
C语言中提供了更为方便的写法,及+=、-=等
*=、/=、%=等运算大体相同,此处不多赘述,以代码为例
int a =10;
a *= 3 => a = a * 3 //a的结果是30
a /= 2 => a = a / 2 //a的结果是5
a %= 3 => a = a % 3 //a的结果是1(求余数)
6.3 单目操作符
前面介绍的操作符都是双目操作符,有2个操作数的。C语言中还有一些操作符只有一个操作数,被称为单目操作符。**++、–、+(正)、-(负)**就是单目操作符的。
6.3.1 ++与–
++是一种自增1的操作符,又分为前置++和后置++,–是一种自减1的操作符,也分为前置–和后置–.
- 前置++:先+1,再使用(先将变量+1,再讲+1后的值赋给所需的变量)
- 后置++:先使用,再+1
–同理,分为前置–与后置--,运算规则与++相同,这里就不多赘述了。
6.3.2 +(正)与-(负)
比较简单,用代码演示即可
还有一些操作符只有一个操作数,被称为单目操作符。**++、–、+(正)、-(负)**就是单目操作符的。
6.3.1 ++与–
++是一种自增1的操作符,又分为前置++和后置++,–是一种自减1的操作符,也分为前置–和后置–.
- 前置++:先+1,再使用(先将变量+1,再讲+1后的值赋给所需的变量)
- 后置++:先使用,再+1
[外链图片转存中…(img-vLfrlKdt-1722360658090)]
–同理,分为前置–与后置--,运算规则与++相同,这里就不多赘述了。
6.3.2 +(正)与-(负)
比较简单,用代码演示即可