目录
前言
本文给出了C语言中基础知识速查表,其中包括了转义字符、分隔符、运算符及其结合性优先级、占位符、表达式、数据类型占用空间,持续更新中,欢迎大家批评指正。
一、转义字符
转义字符用于表示ASCII码字符集中的格式控制符和特定功能字符,这些字符都是不可直接打印的,需要在前添加转义字符()或用一个八进制或十六进制数表示。
⭐️使用转义字符的注意事项:
- 在C51程序中,不可打印字符必须用转义字符表示
- 转义字符只能用小写字符来表示,每个转义字符只能看做一个字符
\v
和\f
换页符在屏幕显示时没有影响,但在打印输出时,会影响到打印机的操作
转义字符 | 含义 | ASCII码值(十进制) |
---|---|---|
\a | 响铃(BEL) | 007 |
\b | 退格(BS) | 008 |
\f | 换页(FF) | 012 |
\n | 换行(LF) | 010 |
\r | 回车(CR) | 013 |
\t | 水平制表(HT) | 009 |
\v | 垂直制表(VT) | 011 |
\ | 反斜杠 | 092 |
? | 问号字符 | 063 |
’ | 单引号字符 | 039 |
“ | 双引号字符 | 034 |
\0 | 空字符(NULL) | 000 |
\ddd | 任意字符 | 三位八进制数 |
\xhh | 任意字符 | 二位十六进制 |
二、分隔符
分隔符在C51中起辅助标识和分界的作用,简单的分隔符是由除字母、数字、下划线以外的单个ASCII字符组成的符号,复合分隔符则产生于特定的简单分隔符的组合,它们常用于数组、结构、指针以及语句等情况。
序号 | 分隔符 | 说明 |
---|---|---|
1 | ; | 用于语句末尾,隔离语句 |
2 | [] | 主要用于对数组的说明 |
3 | () | 隔离参数,如s=area® |
4 | , | 隔离,可用于多个相同类型的变量标识符定义、函数语句等 |
5 | {} | 复合语句的隔离,如for{i=0;i<4;i++}及块结构等 |
6 | * | 作指针,如 char *p1; |
7 | # | 预处理的伪命令,如 #define PI=3.14159; |
8 | ^ | 用于标识特殊寄存器的位,如 sbit 10=P1^0 |
三、运算符
运算符时表示特定的算术或及逻辑操作的符号,也称操作符。
👉在C语言中,主要有四大类运算符:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
👉还有一些用于辅助完成复杂功能的特殊运算符,如:
- “,”(逗号)运算符
- “?”(问号)运算符
- 地址操作运算符
- 联合操作符
- sizeof 运算符
- 类型转换运算符
1. 算术运算符
序号 | 算术运算符 | 说明 | 实例 |
---|---|---|---|
1 | – | 进行减法或取负值的运算 | 5-3=2 |
2 | + | 进行加法运算 | 2+2=4 |
3 | * | 乘法运算 | 1*2=2 |
4 | / | 除法运算,取结果的整数部分 | 10/4=2 |
5 | % | 除法运算,取结果的余数部分,不能用于浮点数的运算 | 9%4=1 |
6 | – | 进行自减(减一),a–为先赋值后减一,–a为先减一后赋值 | 见程序 |
7 | ++ | 进行自增(加一),a++为先赋值后加一,++a为先加一后赋值 | 见程序 |
#include "stdio.h"
void main()
{
int x, y, z1, z2;
x=10, y=21;
z1 = (x++) + (x++); // x先赋值后加一:第一个括号的值为10,x加一为11,第二个括号内的值为11,x加一为12
printf("x=%d, z1=%d\n", x, z1); // z1 = 10+11 = 21, x = 12
z2 = (++y) + (++y); // y先加一后赋值:y加一为22,第一个括号的值为22,y加一为23,第二个括号内的值为23
printf("y=%d, z2=%d\n", y, z2); // z2 = 22+23 = 45, y = 23
}
2. 逻辑运算符
序号 | 逻辑运算符 | 说明 |
---|---|---|
1 | ! | 进行逻辑非运算 |
2 | || | 进行逻辑或运算 |
3 | && | 进行逻辑与运算 |
逻辑运算符操作对象可以是整型数据、浮点型数据以及字符型数据,非零值为真(1),零值为假(0)。
⭐️其真值表如下:
A | B | A&&B | A||B | !A |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 0 |
3. 关系运算符
关系运算符主要用于比较操作数的大小关系,常与逻辑运算符联合使用:若表达式为True(真)则返回值为1,若表达式为False(假)则返回值为0。
序号 | 关系运算符 | 说明 |
---|---|---|
1 | > | 判断是否大于 |
2 | >= | 判断是否大于等于 |
< | 判断是否小于 | |
4 | <= | 判断是否小于等于 |
5 | == | 判断是否相等 |
6 | != | 判断是否不等 |
4. 位运算符
位运算符是对字节或字的二进制位(bit)进行逐位逻辑处理或移位的运算符,它的操作对象是整型和字符型数据的字节或字,**不能用于float、double、long double、void或其它聚合类型 **。
位运算中的AND、OR和NOT(1的补码)的真值表与逻辑运算等价,唯一不同的是,位操作首先将操作数分解成二进制,然后逐位进行计算。
C51语言中的位运算符如下:
- “&”运算符
- “|”运算符
- “^”运算符
- “~”运算符
- “>>”运算符
- “<<”运算符
例如,将a=56和b=37分别进行进行按位与、按位或、按位非、按位异或运算:
56 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
---|---|---|---|---|---|---|---|---|
37 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
& | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
^ | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
4.1 按位与运算符
&
运算符是将两个操作数按二进制展开,然后将对应位进行逻辑与运算。它是二目运算符,即要求有两个源操作数。如果操作数对应的二进制位均为1,则逻辑与的结果为1,否则为0。如 a&b=32;
4.2 按位或运算符
|
运算符是将两个操作数按二进制展开,然后将对应位进行逻辑或运算。是二目运算符。如果操作数对应的二进制位均为0,则逻辑或的结果为0,否则为1。a|b=61
4.3 按位非运算符
~
运算符是将两个操作数按二进制展开,然后每位取反,即0变1、1变0。是一目运算符。
4.4 按位异或运算符
^
运算符是将两个操作数按二进制展开,然后对应位进行逻辑异或运算。是二目运算符。如果对应的二进制为均为0或均为1,则逻辑异或的结果为0;否则,只要对应位不相同,则逻辑异或的结果为1。a^b=29
A | B | A^B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
4.5 移位运算符
变量名(操作数)>> 右移位数
表示右移运算,对无符号位数左端补0,称为“逻辑右移”;如果为负数,即符号位为1,则左端补1,称为“算术右移”变量名(操作数)<< 左右位数
表示左移运算,与右移运算操作相反- C51语言中的移位不是循环移位,当某位从一端移出时,一端移入0,移出的位永远丢失。
- 左移运算有时可用来作乘法,右移运算有时可用来作除法。如下表可看出,每左移一位,结果乘2,每右移一位相当于除以2
字符x | 每个语句执行后的x | x的值 |
---|---|---|
x=7 | 00000111 | 7 |
x<<1 | 00001110 | 14 |
x<<3 | 01110000 | 112 |
x<<2 | 11000000 | 192 |
x>>1 | 01100000 | 96 |
x>>2 | 00011000 | 24 |
#include "stdio.h"
void main()
{
int a, b, c;
a=23, b=217;
printf("a&b = %d\n", a&b); // a&b = 17
printf("a|b = %d\n", a|b); // a|b = 223
printf("a^b = %d\n", a^b); // a^b = 206
printf("~a = %d\n", ~a); // ~a = -24
printf("a<<3 = %d\n", a<<3); // a<<3 = 184
printf("b>>2 = %d\n", b>>2); // b>>2 = 54
}
5 特殊运算符
5.1 ,
运算符
,
运算符是把几个表达式串在一起,并用括号括起来,按照顺序从左向右计算的运算符。该运算符左侧表达式的值不作为返回值,只有最右侧表达式的值作为整个表达式的返回值。
#include "stdio.h"
void main()
{
int a, b, c;
a = 37;
b = 179;
c = (a++, ++b, a+b);
printf("c=%d\n", c); // 输出为 c=218
}
5.2 ?
运算符
EXP1?EXP2:EXP3;
首先计算表达式1的值,如果为真,则计算表达式2的值;如果为假,则计算表达式3的值。等价于if...else
#include "stdio.h"
void main()
{
int x, y;
x = 17;
y = x>5?10:20;
printf("y = %d\n", y);
}
5.3 sizeof
运算符
sizeof
运算符返回变量所占的字节或类型长度字节。是单目操作符。
#include "stdio.h"
void main()
{
int x, y;
char ch[] = "hello world";
x = sizeof(ch);
y = sizeof(float);
printf("ch字符串长度为%d,float型数据长度为%d", x, y);
}
5.4 赋值运算符
(DataType)left value = (DataType)right value
其中,左值为变量、右值为常量且两者数据类型必须一致,否则要进行cast(类型转换)。
cast(类型转换):去掉声明中的变量名和末尾的分号,再用括号将剩下的部分“封装”起来,例如,因为声明一个浮点型的函数指针:
float (*h)()
,则(float(*)())
表示“指向浮点类型的函数指针”的类型转换符。再看例子,
(*fp)()
是一个函数指针,调用时可直接通过其函数名调用,而ANSIC标准允许程序员将fp()
作为其简写形式,就好比*(fp())
与ANSIC中的*((*fp)())
一样。因此,要在计算启动时调用首地址位置为0的子例程(即表示为(void(*)(void))0
,表示“返回值为void类型、参数为void类型的函数指针”),可以表示为(*(void(*)(void))0)
,表示“将常数0转化为指向void类型的函数的指针”;同时,也可用typedef void (*funcptr)()
替代。
5.5 ⭐️地址操作符
用来对变量的地址进行操作。主要分为两种:
*
运算符是单目操作符,返回位于某个地址内存储的变量值&
运算符是一个单目操作符,返回操作数的地址
#include "stdio.h"
void main()
{
char ch1, ch2;
char *p; // 定义指针型变量
ch1 = 'A';
p = &ch1; // 将变量ch1的地址赋值给p
ch2 = *p; // 对指针p解引用,将p所指向的地址内的值赋给ch2
printf("ch2 = %c\n", ch2); // 输出为:ch2 = A
}
5.6 联合操作符
<变量1>=<变量1><操作符><表达式>
联合操作符简化后的🔽
<变量1><操作符>=<表达式>
举个例子🌰
- a=a+b => a+=b
- a=a/(b+1) => a/=b+1
- a=a&b => a&=b
5.7 类型转换运算符
(类型)表达式
👉详见文章
四、 运算符优先级和结合性
- 可以用括号
()
修改计算的优先级顺序 - 右结合性即变量(或常量)与右边的运算符结合,C51语言中具有右结合性的运算符包括所有单目运算以及三目运算符,其他都是左结合性
运算符(高→低) | 结合性 | 运算符类型 |
---|---|---|
() [] – > . | 从左至右 | 双目运算符 |
! ~ ++ – sizeof + – * &(类型转换) | 从右至左 | 单目运算符 |
* / % | 从左至右 | 双目运算符 |
+ – | 从左至右 | 双目运算符 |
<< >> | 从左至右 | 双目运算符 |
< <= > >= | 从左至右 | 双目运算符 |
== != | 从左至右 | 双目运算符 |
& | 从左至右 | 双目运算符 |
^ | 从左至右 | 双目运算符 |
| | 从左至右 | 双目运算符 |
&& | 从左至右 | 双目运算符 |
|| | 从左至右 | 双目运算符 |
?: | 从右至左 | 三目运算符 |
= += -= *= /= %= &= ^= |= <<= >>= | 从左至右 | 双目运算符 |
- 依据上表可以得出优先级:
- 数组下标、函数调用操作符及各结构成员选择操作符
- 单目运算符
- 双目运算符
- 算术运算符
- 移位运算符
- 关系运算符
- 逻辑运算符
- 赋值运算符
- 三目运算符(条件运算符)
五、 C语言表达式
表达式可分为以下几种类型:
- 算术表达式
- 赋值表达式
- 逗号表达式
- 关系表达式
- 逻辑表达式
1. 算术表达式
#include "stdio.h"
void main()
{
int x, y, i, j;
i=105, j=2;
x=i+j*2;
y=(i-j*2)%3;
printf("x=%d, y=%d\n", x, y);
}
2. 赋值表达式
<变量><赋值运算符><表达式>
首先求解赋值运算符右边的表达式的值,然后将该值赋给左边的变量。注意:C51同C语言一样都是强数据类型,在使用赋值表达式时,要注意数据类型的转换。
3. 逗号表达式
表达式1, 表达式2, 表达式3, .......
- 一个逗号表达式还可以与另一个表达式组成新的逗号表达式,计算时从左向右计算
- 逗号表达式可以构成嵌套结构,即逗号表达式中的表达是可以是逗号表达式,计算时从左向右,整个表达式的值为最后一个表达式的结果
- 在程序中,需要区分逗号分隔符和逗号表达式。例如,在变量声明、函数参数表中逗号只是用作变量之间的分隔符
4. 关系表达式
关系表达式又称比较运算,它的计算结果为逻辑”真“或逻辑”假“。当结果为真时,表达式的值为1;当结果为假时,表达式的值为0。
5. 逻辑表达式
逻辑表示的操作对象可以是任意数据类型,返回值为逻辑值。
关系表达式常与逻辑表达式结合在一起使用的,常用于程序控制语句中控制流程运算。用于控制程序的流程时,要配合if、while和for语句来使用。
六、占位符
格式化占位符 | 说明 |
---|---|
%d | 有符号的十进制整型数(signed int) |
%nd | 输出n位整数 |
%u | 十进制整型数(unsigned int) |
%o | 八进制整型数 |
%x | 十六进制整型数 |
%hd | 短整型数(short) |
%ld, %Ld | 长整型(long) |
%lld | 长长整型(long long) |
%lu | 无符号长整型(unsigned long) |
%llu | 无符号长长整型(unsigned long long) |
%c | 一个字符(char) |
%s | 一个字符串 |
%f | 单精度浮点型数据 |
%n.mf | 整数位保留n位数(自右向左),小数位保留m位数(自左向右) |
%-n.mf | 整数位保留n位数,小数位保留m位,左对齐输出(若数值小于指定输出格式,右端补空格) |
%p | 输出为指针类型 |
七、数据类型占用的内存空间
👉数据类型在不同系统的编译器下占有不同的存储空间,如在老式IBM PC中,int的宽度是16位,而在Windows XP、Windows Vista、Windows 7、Macintosh OS X及其他系统中,int的宽度为32.:
数据类型 | 16位编译器 | 32位编译器 | 64位编译器 |
---|---|---|---|
char | 1Byte | 1B | 1B |
int | 2B | 4B | 4B |
float | 4B | 4B | 4B |
double | 8B | 8B | 8B |
short int | 2B | 2B | 2B |
unsigned int | 2B | 4B | 8B |
long | 4B | 4B | 8B |
unsigned long | 4B | 4B | 8B |
long long | 8B | 8B | 8B |
表1 不同系统下的编译器位数
👉以32位系统为例,不同数据类型的取值范围不同:
类型 | 字节数 | 位数 | 取值范围 |
---|---|---|---|
signed char | 1 | 8 | -128~127 |
unsigned char | 1 | 8 | 0~255 |
signed short | 2 | 16 | -32768~32767 |
unsigned short | 2 | 16 | 0~65535 |
signed int | 4 | 32 | -2147483648~2147483647 |
unsigned int | 4 | 32 | 0~4294967295 |
signed long | 4 | 32 | -2147483648~2147483647 |
unsigned long | 4 | 32 | 0~4294967295 |
signed long long | 8 | 64 | |
unsigned long long | 8 | 64 |
表2 不同数据类型所占空间
头文件limits.h定义了符号常量来表示类型限制👇
符号常量 | 表示 |
---|---|
CHAR_BIT | char的位数 |
CHAR_MAX | char的最大值 |
CHAR_MIN | char的最小值 |
SCHAR_MAX | signed char的最大值 |
SCHAR_MIN | signed char的最小值 |
UCHAR_MAX | unsigned char的最大值 |
UCHAR_MIN | unsigned char的最小值 |
SHRT_MAX | short的最大值 |
SHRT_MIN | short的最小值 |
USHRT_MAX | unsigned short的最大值 |
INT_MAX | int的最大值 |
UINT_MAX | unsigned int的最大值 |
LONG_MAX | long的最大值 |
ULONG_MAX | unsigned long的最大值 |
LLONG_MAX | long long的最大值 |
ULONG_MAX | unsigned long long的最大值 |
表3 limits.h中定义的符号常量
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84791.html