C基础——学习笔记(2)

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_Imaginaryinlinerestrict

C11 新增关键字

_Alignas_Alignof_Atomic_Generic_Noreturn
_Static_assert_Thread_local

常见的关键字有:

  1. 数据类型关键字:包括int(整数)、float(浮点数)、double(双精度浮点数)、char(字符)和void(无类型)。
  2. 控制结构关键字:包括if(条件语句)、else(条件语句的另一种选择)、switch(多条件选择语句)、case(switch语句中的选项)、while(循环语句)、do(循环语句)、for(循环语句)、break(跳出循环)和continue(继续下一次循环)。
  3. 存储类别关键字:包括auto(自动存储变量)、register(寄存器存储变量)、extern(外部声明变量)和static(静态存储变量)。
  4. 其他关键字:包括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编码的方式。

img

参考: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才认为该字符串停止,下面做一个验证

image-20240730224524302

我们知道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语言会自动进行浮点数除法。

image-20240730231644993

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 复合赋值法

在写代码的时候,我们有时需要对一个变量进行自增或者自减的操作,具体演示为

image-20240731000436009

C语言中提供了更为方便的写法,及+=、-=等

image-20240731000647684

*=、/=、%=等运算大体相同,此处不多赘述,以代码为例

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

image-20240731003655009

–同理,分为前置–后置--,运算规则与++相同,这里就不多赘述了。

6.3.2 +(正)与-(负)

比较简单,用代码演示即可

还有一些操作符只有一个操作数,被称为单目操作符。**++、–、+(正)、-(负)**就是单目操作符的。

6.3.1 ++与–

++是一种自增1的操作符,又分为前置++后置++,–是一种自减1的操作符,也分为前置–后置–.

  • 前置++:先+1,再使用(先将变量+1,再讲+1后的值赋给所需的变量)
  • 后置++:先使用,再+1

[外链图片转存中…(img-vLfrlKdt-1722360658090)]

–同理,分为前置–后置--,运算规则与++相同,这里就不多赘述了。

6.3.2 +(正)与-(负)

比较简单,用代码演示即可

image-20240731004208488

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值