【速查表】之C语言关键字、转义字符、运算符、占位符、数据类型占用空间等(持续更新中...)

前言

本文给出了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)。

⭐️其真值表如下:

ABA&&BA||B!A
00001
01011
10010
11110

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分别进行进行按位与、按位或、按位非、按位异或运算:

5600111000
3700100101
&00100000
|00111101
^00011101

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

ABA^B
000
011
101
110

4.5 移位运算符

  • 变量名(操作数)>> 右移位数 表示右移运算,对无符号位数左端补0,称为“逻辑右移”;如果为负数,即符号位为1,则左端补1,称为“算术右移”
  • 变量名(操作数)<< 左右位数表示左移运算,与右移运算操作相反
  • C51语言中的移位不是循环移位,当某位从一端移出时,一端移入0,移出的位永远丢失。
  • 左移运算有时可用来作乘法,右移运算有时可用来作除法。如下表可看出,每左移一位,结果乘2,每右移一位相当于除以2
字符x每个语句执行后的xx的值
x=7000001117
x<<10000111014
x<<301110000112
x<<211000000192
x>>10110000096
x>>20001100024
#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 + - * &(类型转换)从右至左单目运算符
* / %从左至右双目运算符
+ -从左至右双目运算符
<< >>从左至右双目运算符
< <= > >=从左至右双目运算符
== !=从左至右双目运算符
&从左至右双目运算符
^从左至右双目运算符
|从左至右双目运算符
&&从左至右双目运算符
||从左至右双目运算符
?:从右至左三目运算符
= += -= *= /= %= &= ^= |= <<= >>=从左至右双目运算符
  • 依据上表可以得出优先级:
  1. 数组下标、函数调用操作符及各结构成员选择操作符
  2. 单目运算符
  3. 双目运算符
    1. 算术运算符
    2. 移位运算符
    3. 关系运算符
    4. 逻辑运算符
    5. 赋值运算符
  4. 三目运算符(条件运算符)

五、 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位编译器
char1Byte1B1B
int2B4B4B
float4B4B4B
double8B8B8B
short int2B2B2B
unsigned int2B4B8B
long4B4B8B
unsigned long4B4B8B
long long8B8B8B
表1 不同系统下的编译器位数

👉以32位系统为例,不同数据类型的取值范围不同:

类型字节数位数取值范围
signed char18-128~127
unsigned char180~255
signed short216-32768~32767
unsigned short2160~65535
signed int432-2147483648~2147483647
unsigned int4320~4294967295
signed long432-2147483648~2147483647
unsigned long4320~4294967295
signed long long864
unsigned long long864
表2 不同数据类型所占空间

头文件limits.h定义了符号常量来表示类型限制👇

符号常量表示
CHAR_BITchar的位数
CHAR_MAXchar的最大值
CHAR_MINchar的最小值
SCHAR_MAXsigned char的最大值
SCHAR_MINsigned char的最小值
UCHAR_MAXunsigned char的最大值
UCHAR_MINunsigned char的最小值
SHRT_MAXshort的最大值
SHRT_MINshort的最小值
USHRT_MAXunsigned short的最大值
INT_MAXint的最大值
UINT_MAXunsigned int的最大值
LONG_MAXlong的最大值
ULONG_MAXunsigned long的最大值
LLONG_MAXlong long的最大值
ULONG_MAXunsigned long long的最大值
表3 limits.h中定义的符号常量
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Larissa857

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值