在C语言中,词法符号(也称为词法单元或标记)是构成C语言程序的基本元素。以下是C语言的主要词法符号:
1. 关键字:这些是C语言预定义的保留字,如int, char, if, else, for, while等。
2. 标识符:这些是程序员定义的变量,函数,数组等的名称。
3. 常量:这些是固定的值,如数字123, 字符'a', 字符串"hello"等。
4. 运算符:这些是用于执行各种操作的符号,如+, -, *, /, =, ==等。
5. 分隔符:这些是用于分隔语句和表达式的符号,如,(逗号),;(分号),{(左大括号),}(右大括号)等。
6. 空白字符:这些包括空格,制表符,换行符等,主要用于分隔其他词法符号。
举个例子
int main() { // "int" 和 "main" 是标识符,"()" 和 "{}" 是分隔符
int a = 10; // "int" 是关键字,"a" 是标识符,"=" 是运算符,"10" 是常量,";" 是分隔符
if (a == 10) { // "if" 是关键字,"a" 是标识符,"==" 是运算符,"10" 是常量,"()" 和 "{}" 是分隔符
printf("Hello, world!"); // "printf" 是标识符,"Hello, world!" 是常量,"();" 是分隔符
}
}
关键字(32)
C语言有一些预定义的保留字,也被称为关键字。这些关键字不能用作变量名
分类:
存储类型:auto static extern register
数据类型:char int long short float double signed unsigned
构造类型:struct union enum
选择类型:if else switch case default
循环类型:for while goto do break continue
其他:void typedef const sizeof return volatile
标识符
在C语言中,标识符是用来识别变量、函数、数组等编程元素的名称
用于标识变量 宏定义 函数名…
命名规范:
- 由数字、字母、下划线(_)组成
- 不能以数字开头
- 不能和关键字重名
- 见名知义
- 标识符是区分大小写的
运算符
在C语言中,运算符是用于执行特定的数学或逻辑操作的符号
参与运算的符号
算数运算符 逻辑运算符 位运算符 关系运算符 赋值运算符 三目运算符
算术运算符:如 +(加),-(减),*(乘),/(除),%(取余)等
/ 整数进行相除 向下取整
% 取余
求7890个位、十位、百位、千位数
++ 在自身进行加1操作
int a=1;
++a-->a=a+1--->2
--a -->a=a-1---->0
输出语句时
++在前 先运算再输出
++在后 先输出再运算
在赋值运算时
++在前:先计算再赋值
++在后:先赋值后计算·
逻辑运算符
&& || !
需要的操作数
单目运算(1个 ):++ --
双目运算(2个):+ - && ||
三目运算(3个):?:
&&(逻辑与):全真为真 一假则假(真:1 假:0)
|| (逻辑或):全假为假 一真全真
! (逻辑非):取反 非真即假 非假即真
截断法则
逻辑与运算中,前面为假后面不进行运算
逻辑或运算中,前面为真后面不进行计算
位运算符
& | ~ ^ << >>
& (位与):全1则1 有0则0;
| (位或):有1则1 全0则0;
~ (按位取反):1-->0 0-->1
^ (异或):相同为0 不同为1
对于整数来说有原码 反码 补码
int ---> 4个字节 ---> 32位(1个字节 = 8位)
原码 | 反码 | 补码 | |
正数 + | 二进制本身 | 本身 | 本身 |
负数 - | 二进制本身 | 原码取反 | 反码加1 |
1:0000 0000 0000 0000 0000 0000 0000 0001
原码 反码 补码一致
-1:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
最高位是符号位
& 按位与
int a=5, b=-2, c=a&b;
printf("%d,c");
a= 5 原码 反码 补码:
0000 0000 0000 0000 0000 0000 0000 0101
b=-2原码 反码 补码:
原码:1000 0000 0000 0000 0000 0000 0000 0010
反码:1111 1111 1111 1111 1111 1111 1111 1101
补码:1111 1111 1111 1111 1111 1111 1111 1110
&:
0000 0000 0000 0000 0000 0000 0000 0101
1111 1111 1111 1111 1111 1111 1111 1110
结果补码:0000 0000 0000 0000 0000 0000 0000 0100
结果:4(因为结果补码是正数所以原码也是补码)
| 按位或
5 | -2
5的原码 反码 补码:
0000 0000 0000 0000 0000 0000 0000 0101
-2补码:1111 1111 1111 1111 1111 1111 1111 1110
结果的补码:1111 1111 1111 1111 1111 1111 1111 1111
反码:1111 1111 1111 1111 1111 1111 1111 1110
原码:1000 0000 0000 0000 0000 0000 0000 0001
结果:-1(因为结果补码是负数所以补码要还原成原码)
^ 按位异或
5^-2
5 原码 反码 补码:
0000 0000 0000 0000 0000 0000 0000 0101
-2补码:1111 1111 1111 1111 1111 1111 1111 1110
^: 补码:1111 1111 1111 1111 1111 1111 1111 1011
反码:1111 1111 1111 1111 1111 1111 1111 1010
原码:1000 0000 0000 0000 0000 0000 0000 0101
结果:-5
~ 按位取反
~5
5 原码 反码 补码:
0000 0000 0000 0000 0000 0000 0000 0101
~:补码:1111 1111 1111 1111 1111 1111 1111 1010
反码:1111 1111 1111 1111 1111 1111 1111 1001
原码:1000 0000 0000 0000 0000 0000 0000 0110
结果:-6
练习1
~ 15
5的原码 反码 补码:0000 0000 0000 0000 0000 0000 0000 1111
~:补码:1111 1111 1111 1111 1111 1111 1111 0000
反码:1111 1111 1111 1111 1111 1111 1110 1111
原码:1000 0000 0000 0000 0000 0000 0001 0000
结果:-16
变量x和y的值相等,且为非零值,则以下选项中,结果为0的表达式是(D)
A.x||y B.x|y C.x&y D.x^y
-4&9
a= 9 原码 反码 补码:
0000 0000 0000 0000 0000 0000 0000 1001
b=-4原码 反码 补码:
原码:1000 0000 0000 0000 0000 0000 0000 0100
反码:1111 1111 1111 1111 1111 1111 1111 1011
补码:1111 1111 1111 1111 1111 1111 1111 1100
&:
0000 0000 0000 0000 0000 0000 0000 1001
1111 1111 1111 1111 1111 1111 1111 1100
结果补码:0000 0000 0000 0000 0000 0000 0000 1000
结果:8 (因为补码是正数所以原码也是补码)
左移<<
操作的补码 左边丢弃 右边补0
5 的原码 反码 补码: 0000 0000 0000 0000 0000 0000 0000 0101
5<<3 补码:000 0000 0000 0000 0000 0000 0000 0101 000 ---> 32+8=40
-5的原码:1000 0000 0000 0000 0000 0000 0000 0101
反码:1111 1111 1111 1111 1111 1111 1111 1010
补码:1111 1111 1111 1111 1111 1111 1111 1011
-5<<3
补码:1 1111 1111 1111 1111 1111 1111 1011 000(左移3位)
反码:1 1111 1111 1111 1111 1111 1111 1010 111
原码:1 0000 0000 0000 0000 0000 0000 0101 000 ---> -40
右移>>
正数移动
右边丢弃 左边补0
5>>2
5的原码 反码 补码:
0000 0000 0000 0000 0000 0000 0000 0101
00 0000 0000 0000 0000 0000 0000 0000 01 ---> 1
负数移动
右边丢弃 左边补1
-5>>2
补码:11 1111 1111 1111 1111 1111 1111 1111 10
反码:11 1111 1111 1111 1111 1111 1111 1111 01
原码:10 0000 0000 0000 0000 0000 0000 0000 10 ---> -2
练习2
以下程序输出结果是(A)
int main( )
{
char x=040;
printf("%o\n",x<<1);
return 0;
}
- 100 B.80 C.64 D.32
过程:040 ---> 000 ..... 001 000 000 ---> 100
置1公式、置0公式
置1公式:a | ( 1 << n )
置0公式:a & ( ~ ( 1 << n ) )n:要置0或者1的位数
a:原本数(要改变的数)
1:0000 0000 0000 0000 0000 0000 0000 0001
1 | (1<<1)
0000 0000 0000 0000 0000 0000 0000 0010( 先将原本数 << 1位 )
0000 0000 0000 0000 0000 0000 0000 0001( 原本数 )
0000 0000 0000 0000 0000 0000 0000 0011( 与原本数进行按位或 )
---> 3
关系运算符
< > <= >= == !=
注意:
1<x<=10 --->x>1&&x<=10
a != b--->a=1, b=2 --->1真
a != b--->a=1, b=1 --->0假
赋值运算符
= += -= *= /=……
a =10;
a+=10; --->a=a+10;
a* =10; --->a=a*10;
条件运算符(三目运算符)
?:
格式:表达式1 ?表达式2 :表达式3
运算规则:判断表达式1是否成立,如果成立执行表达式2,不成立执行表达式3
int a=3, b=5;
int c= a>b ? a++ : ++b;
c ---> 6
运算符的优先级
单目运算:! ~ ++ --
算术运算:* / % + -
移位运算:<< >
关系运算:> < >= <= == !=
位与运算:&
异或运算:^ |
逻辑运算:&& ||
条件运算:?:
赋值运算:= += -= *=....
口诀:
单算移动关与 异或逻条赋
单目运算,从右向左运算
标点符号:, ; () {} []
分隔符:换行 空格 tab
变量
在C语言中,变量是用来存储数据的标识符。每个变量都有特定的类型,决定了变量存储的大小和布局,以及在存储位置中的位模式。
概念:在程序运行过程中会发生变化的量
定义格式:存储类型 数据类型 变量名
赋值方式:
1. 在定义的同时进行赋值
int a=10;
int a=10,b=20,c=30;
2. 定义之后进行赋值
int a;
a=10;
int a,b,c;
a=10;
b=20;
c=30;
变量的分类:
全局变量:在函数外声明的变量,可以在全局使用
局部变量:在函数内声明的变量,只能在内部使用
两者区别
局部变量 | 全局变量 | |
定义位置 | 定义在函数内部 | 定义在函数外部 |
作用域 | 在声明函数内可以使用 | 在全局可用 |
初始值(未赋值) | 随机值 | 值为0 |
存储位置 | 栈区 | 全局区 |
生命周期 | 和定义函数共存亡 | 和整个程序共存亡 |
数据类型
类型 | 长度 | |
char | 字符型 | 1个字节 |
short | 短整型 | 2个字节 |
int | 整型 | 4个字节 |
long | 长整型 | 4个字节 |
float | 单精度浮点型 | 4个字节 |
double | 双精度浮点型 | 8个字节 |
常量
C语言中的常量是指在程序运行过程中其值不会发生改变的量。常量可以是整数、浮点数、字符或字符串。在C语言中,常量可以使用关键字const来声明,并且在声明时必须进行初始化。
在使用常量时,需要注意以下几点:
1. 常量的值在程序运行过程中不能被修改。
2. 常量的命名通常使用全大写字母,以便与变量区分开来。
3. 常量可以用于表达式中,但不能作为左值(即不能被赋值)。
概念:在程序运行过程中不会发生变化的量
分类:
字符型常量
用单引号(' ')引起来的数据就是字符型的数据
只能包裹单个字符
'a' ----> 字符a( a ---->变量)
' ' ----> 空格字符
'\n'----> 换行符
'A' '\x41'(16进制) '\101'(8进制) ----> 字符A
字符串常量
多个字符拼接起在一起,使用双引号(" ")引起来
"hello"----->6个字节 \0:字符串结束的标志
对于一个字符串来说字符串的个数是实际个数+1
sizeof():查看数据所占内存大小 返回值是所占内存的字节数
整型常量
1 2 3 4
一般使用int定义存储
浮点型常量
0.9 1.23小数都是浮点型常量
一般定义使用:float double
指数常量
3*10^3 ---> 3e3
5*10^3------>5e3
注意:e的前面可以是整数或者小数,e的后面只能是整数
标识常量
宏定义:起标识作用(宏替换 宏代替)
定义格式:#define 宏名 常量或者常量表达式
宏名遵循标识符的命名规则
特点:只能单纯的替换 不可以进行运算()
练习:
#define N 2
#define M N+3 // 2+3
#define NUM N+M/2+1 //2+2+3/2+1 ---> 2+2+1+1=6
void main()
{
int a = NUM;
printf("%d\n",a);
}
答案:6
#define N 2
#define M 3*N //3*2
#define T M+N //3*2+2
#define NUM N*T+M/2+1 // 2*3*2+2+3*2/2+1 ---> 12+2+3+1=18
void main()
{
int a = NUM;
printf("%d\n",a);
}
答案:18
2*3*2+2+3*2/2+1
12 2 3 1
18
练习:结合宏定义、三目运算实现输出宏时是两个数中最大值
答案:
1. int a=1,b=20;
#define MAX a>b?a:b
2. #define MAX(a,b) a>b?a:b;
printf("%d\n",MAX(10,12));
制作不易,点个关注再走呗!!!