当前位置:首页 » 编程语言 » c语言里的运算符号大全
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言里的运算符号大全

发布时间: 2022-07-03 19:08:11

‘壹’ c语言中各个运算符代表什么就是++ —— ==啥的

a++:表示a加1
a--:表示a减1
a==b:表示a和b相等,用在条件判断里,比如
if(a==b){……};//如果a等于b,就执行{……}里的内容

‘贰’ 求大神整理c语言指令符号及用法大全。

编译指令

编译指令

说明

#include

包含另一个文件

#define

定义一个宏(macro)或是常量

#undef

取消一个宏常量的定义

#asm和#endasm

在程序中加入汇编语言的程序

#ifdef、#ifndef、#else、#endif

用于条件式的编译

注解://—单行注解;
基本数据类型 (int,float,double,char,void)

数据类型

类型说明

长度(位)

数据长度

bit



1

0,1

char

字符

8

—128~127

unsigned char

无符号字符

8

0~255

signed char

有符号字符

8

—128~127

int

整型

16

—32768~32767

short int

短整型

16

—32768~32767

unsigned int

无符号整型

16

0~65535

signed int

有符号整型

16

—32768~32767

long int

长整型

32

—2147483648~2147483647

unsigned long int

无符号长整型

32

0~4294967295

signed long int

有符号长整形

32

—2147483648~2147483647

float

浮点数(实数)

32

0.175e-38~0.402e38

double

双精度浮点

32

0.175e-38~0.402e38

void



0

没任何数据

用户自定义数据类型格式
typedef struct{
数据类型 变量序列1;
数据类型 变量序列1;
...
}自定义数据类型的名称;
保留字
_at_,alien,bdata,break,bit,case,char,code,compact,const,continue,data,
default,do,double,far,else,enum,extern,float,for,goto,if,funcused,idata,int,
inline,interrupt,large,long,pdata,_priority_,reentrant,return,sbit,sfr,sfr16,
short,sigend,sizeof,small,static,struct,switchc_task_,typedef,using,union,
unsigned,void,volatile,while,xdata

常量表示法

常数

规则

范例

十进制

一般十进制格式

1234567890

二进制

开头加上0b

0b00001110

八进制

开头加上O

O0123

十六进制

开头加上0x

0xFF45

无符号整数常量

结尾加上U

30000U

长整数常量

结尾加上L

299L

无符号长整数常量

结尾加上UL

327800UL

浮点数的常量

结尾加上F

4.234F

字符常量

以单引号括起来

‘a’

字符串常量

以双引号括起来

“hello”

-----------------------------------------------------运算符-----------------------------------------------------
算术运算

运算符

说明

范例

执行结果

+



c=a+b;

c 等于10





d=a—b;

d 等于6

*



e=a*b;

e 等于16

/



f=a/b;

f 等于4

%

取余数

g=a%b;

g 等于0

++

加1

c++;相当于c=c+1;

c 等于11

——

减1

d——;相当于d=d—1;

d 等于5

=

等于

a=8;

设置a等于8

+=

先相加在等于

e+=5;相当于e=e+5;

e 等于21

—=

先相减在等于

f—=5;相当于f=f—5;

f 等于—1

*=

先相乘在等于

b*=5;相当于b=b*5;

b 等于0

/=

先相除在等于

a/=5;相当于a=a/5;

a 等于1

%=

先取余数在等于

a%=5;相当于a=a%5;

a 等于3

※假设a等于8,b等于2
比较运算

运算符

说明

范例

执行结果

==

等于

a==5

F

!=

不等于

a!=5

T

<<o:p>

小于

a<5

F

>

大于

a>5

T

<=

小于等于

a<=5

F

>=

大于等于

a>=5

T

※比较运算结果是个布尔值既TRUE(真值)或FALSE(假值)。假设a等于8

逻辑运算

运算符

说明

范例

执行结果

&&

AND

(a>5)&&(a<10)

T

||

OR

(a<5)||(a>10)

F

!

NOT

!(a>10)

T

※逻辑运算结果是个布尔值既TRUE(真值)或FALSE(假值)。假设a等于8
位逻辑运算

运算符

说明

范例

执行结果

&

AND

a&0x01

a等于1

|

OR

a|0x80

a等于0x85

~

NOT

~a

a等于0xFA

^

XOR

a^0xFF

a等于0xFA

<<

左移

a<<1

a等于0x0A

>>

右移

a>>1

a等于0x0A

※假设a等于5
----------------------------------------------------控制命令---------------------------------------------------
if语句
if(条件) 语句1;
else 语句2;
例:if(d==4) d=0; //如果d等于4就设置d等于0
else d++; //否则就将d加1
if(ticks==0) { //如果ticks等于0
ticks=1000; //ticks 设置成1000
counter[0]++; //counter[0]加1
}

嵌套if语句
例:if(counter[0]==10) {
counter[1]++;
counter[0]=0;
if(counter[1]==10) {
counter[2]++;
counter[1]=0;
}
}

switch语句
switch (变量) {
case 常量1:语句1; break;
case 常量2:语句2; break;
case 常量3:语句3; break;
......
default ; 语句n;
}
for循环
for (初值,条件,变化值) 语句;
例:for(i=0;i<10;i++) x=x+i;
for(i=1;i<10,i++)
for(j=1;j<10,j++)
printf(“%d %d”,i,j);
无穷循环:
for( ; ; );

while循环
while (条件) 语句;
例:while (ch!=!’A’) ch=getche();
无穷循环:
while(1);

do/while循环
do {
语句;
...
} while(条件);
例:do {
ch=getche();
} while (ch!=”A”);

goto语句
loop1:
x++;
if(x<100) goto loop1;
----------------------------------------------------指针和函数------------------------------------------------
指针的定义
数据类型 *指针变量的名字;
例: char *p;
int *x;

指针与数组
例: char filename[80];
char *p;
p=filename; //指针p存放filename的开始地址

int x[5]={1,2,3,4,5};
int *p,sum,i;
p=x; //指针p存放数组x的开始地址
for(i=0;i<5;i++)
sum=sum+p[i]; //p[i]相当于x[i]

指针的运算
1.针变量前面加上*号就是取得指针所指向位置的内容。
例:int x[5]={1,2,3,4,5};
int *p;
p=x; //指针p存放数组x的开始地址
*p=10; //相当于设置x[0]等于10
2.变量前面加上&符号,可以取得一个变量的位置。
例:int x,y;
int *p;
p=&x; //指针p存放x的地址,相当于p是指向x 的指针
*p=1; //相当于设置x等于1
3.&符号也可以加在数组的前面
例:int x[5];
int *p;
p=&x[2]; //指针p存放x[2]的地址,相当于p是指向x[2]的指针
*p=50; //相当于设置x[2]等于50
函数
函数类型 函数名称(参数序列);
参数说明
{
函数的主体
}
例:void delay (void) { //不返回任何数据的函数
unsigned char i,j; //没有任何参数的函数
for(i=0,i<255,i++)
for(j=0,j<255,j++);
}
main()
{
...
delay(); //调用函数
}
例:unsigned char sum(unsigned chat a,unsigned chat b)
{
unsigned chat x;
check_GLCD_busyflag(); //函数中可以调用另一个函数
x=a+b;
return x; //return会返回x的数据
}
中断服务函数
void 中断服务程序的名称(void) interrupt 中断号码using 寄存器组号码
{
中断服务子程序主体
}

中断号码
#define IE0_VECTOR 0 //0x03
#define TF0_VECTOR 1 //0x0B
#define IE1_VECTOR 2 //0x13
#define TF1_VECTOR 3 //0x1B
#define SIO_VECTOR 4 //0x23
对于S51有定时器2
#define TF2_VECTOR 5 //0x2B
例:static void xint0_isr(void) interrupt IE0_VECTOR(或0) using 1
{
unsigned char i,j=0xFF;
for(i=0,i<16,i++)
{
j++;
P1=j; //将数值输出到P1口
delay_4isr();
}
}
-----------------------------------------------------汇编语言--------------------------------------------------
在C中加入汇编语言
例:void delay100us()
{
#pragma asm
mov r7,#1
more: mov r3,#48
djnz r3,$
djnz r7,more
#pragma endasm
}
----------------------------------------------------宏(macro)----------------------------------------------
宏的定义
%*define (macro名称) (macro的指令)
例:%*define (write_1) (
setb DI
serb SK
clr SK
)

#define 宏的名称 宏的指令
例:#define uchar unsigned char

C语言中的符号总结
运算符的种类C语言的运算符可分为以下几类;
1. 算术运算符
用于各类数值运算,包括加减乘除求余自增自减共七种运算
{ ( + ) ,( - ),(* ) ,( / ) ,( % ),( ++ ),(-- )}。
2. 关系运算符
用于比较运算,包括大于(>),小于(<</span>),等于(==),大于等于(>=),
小于等于(<=),不等于(!=)共六种。
3.逻辑运算符
用于逻辑运算,包括与(&&)或(||)非(!)三种.
4.位操作运算符
参与运算的量,按二进制位进行运算,包括:
位与(&),位或(|),位非(~),为异或(^),左移(<<),右移(>>)共六种。
5.赋值运算符
用于赋值运算,分为:
简单赋值(=)
复合算术赋值(+=,-=,*=,/=,%=)
复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6.条件运算符
这是一个三目运算符,用于条件求值(?:)。
7.逗号运算符
用于把若干表达式组合成一个表达式(,)。
8.指针运算符
用于取内容(*)和取地址(&)两种运算。
9.求字节数运算符
用于计算数据类型所占用的字节数(sizeof)。
10.特殊运算符
有括号(),下标[],成员(→, .)

1.C的数据类型
基本类型,构造类型,指针类型,空类型
2.基本类型的分类及特点
类型说明符 字节 数值范围
字符型char 1 C字符集
基本整型int 2 -32768~32767
短整型short int 2 -32768~32767
长整型 long int 4 -214783648~214783647
无符号型 unsigned 2 0~65535
无符号长整型 unsigned long 4 0~4294967295
单精度实型 float 4 3/4E-38~3/4E+38
双精度实型 double 8 1/7E-308~1/7E+308
3.常量后缀
L或l 长整型
U或u 无符号数
F或f 浮点数
4.常量类型
整数,长整数,无符号数,浮点数,字符,字符串,符号常数,转义字符。
5.数据类型转换
a自动转换
在不同类型数据的混合运算中,由系统自动实现转换, 由少字节类型向多字节类型转换。 不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左边的类型。
b强制转换
由强制转换运算符完成转换。
6.运算符优先级和结合性
一般而言,单目运算符优先级较高,赋值运算符优先级低。 算术运算符优先级较高,关系和逻辑运算符优先级较低。 多数运算符具有左结合性,单目运算符、三目运算符、 赋值
7.表达式
表达式是由运算符连接常量、变量、函数所组成的式子。 每个表达式都有一个值和类型。 表达式求值按运算符的优先级和结合性所规定的顺序进行。

表示输出类型的格式字符 格式字符意义
d 以十进制形式输出带符号整数(正数不输出符号)
o 以八进制形式输出无符号整数(不输出前缀O)
x 以十六进制形式输出无符号整数(不输出前缀OX)
u 以十进制形式输出无符号整数
f 以小数形式输出单、双精度实数
e 以指数形式输出单、双精度实数
g 以%f%e中较短的输出宽度输出单、双精度实数
c 输出单个字符
s 输出字符串
标志字符为-、+、#、空格四种,其意义下表所示:
标志格式字符 标 志 意 义
- 结果左对齐,右边填空格
+ 输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号
# 对c,s,d,u类无影响;对o类, 在输出时加前
缀o 对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点
格式字符串

格式字符串的一般形式为: %[*][输入数据宽度][长度]类型 其中有方括号[]的项为任选项。各项的意义如下:
1.类型
表示输入数据的类型,其格式符和意义下表所示。
格式 字符意义
d 输入十进制整数
o 输入八进制整数
x 输入十六进制整数
u 输入无符号十进制整数
f或e 输入实型数(用小数形式或指数形式)
c 输入单个字符
s 输入字符串
转义字符
转义字符是一种特殊的字符常量。转义字符以反斜线”\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面各例题printf函数的格式串中用到的“\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。
常用的转义字符及其含义
转义字符 转义字符的意义
\n 回车换行
\t 横向跳到下一制表位置
\v 竖向跳格
\b 退格
\r 回车
\f 走纸换页
\\ 反斜线符”\”
\’ 单引号符
\a 鸣铃
\ddd 1~3位八进制数所代表的字符
\xhh 1~2位十六进制数所代表的字符
广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表2.2中的\ddd和\xhh正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如\101表示字?quot;A” ,\102表示字母”B”,\134表示反斜线,\XOA表示换行等。转义字符的使用
在C语言中,对变量的存储类型说明有以下四种:
auto 自动变量
register 寄存器变量
extern 外部变量
static 静态变量
自动变量和寄存器变量属于动态存储方式, 外部变量和静态变量属于静态存储方式。在介绍了变量的存储类型之后, 可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型。 因此变量说明的完整形式应为: 存储类型说明符 数据类型说明符 变量名,变量名…; 例如:
static int a,b; 说明a,b为静态类型变量
auto char c1,c2; 说明c1,c2为自动字符变量
static int a[5]={1,2,3,4,5}; 说明a为静整型数组
extern int x,y; 说明x,y为外部整型变量
与指针有关的各种说明和意义见下表。
int *p; p为指向整型量的指针变量
int *p[n]; p为指针数组,由n个指向整型量的指针元素组成。
int (*p)[n]; p为指向整型二维数组的指针变量,二维数组的列数为n
int *p() p为返回指针值的函数,该指针指向整型量
int (*p)() p为指向函数的指针,该函数返回整型量
int **p p为一个指向另一指针的指针变量,该指针指向一个整型量。

指针变量的赋值
p可以有以下两种方式:
(1)指针变量初始化的方法 int a;
int *p=&a;
(2)赋值语句的方法 int a;
int *p;
p=&a;

(1)取地址运算符&
(2)取内容运算符*

‘叁’ c语言符号且与或

C语言中的逻辑运算符:&&(与运算)、||(或运算)、!(非运算)。

与运算符(&&)和或运算符(||)均为双目运算符。具有左结合性。非运算符(!)为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:

本来没有错误,关系运算符都是按“非与或”顺序来运算的。但是,不同的编译器设计者可能对这个的认识不同,因此,如果不加括号就会有歧义,因此,编译器就会提醒应该加括号(编译中有警告:waring),但你不加,也不算错,只是其结果就是按编译器的运算顺序来操作了。

&&是与,||是或;

&是位与,|是位或;

|就是按住shift在按回车上面一个按钮;

两下就是||;

这个不是错误,是警告warning,编译器怕记不住操作符优先级,而导致错误,因此提示||的优先级高于!=。

(3)c语言里的运算符号大全扩展阅读

C语言内置了丰富的运算符,大体可分为10类:算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符和特殊运算符。

根据运算符可操作的操作数的个数,可把运算符分为一元运算符、二元运算符和多元运算符(一般三元)。优先级:当不同运算符优先级不同时,先计算谁后计算结合性:当不同运算符优先级相同时,先计算谁后计算谁。

‘肆’ C语言中算术运算符%,++,— —,都是什么意思能举例子说明吗

C语言中,算术运算符“%”代表模(取余)运算,“++”代表变量自增运算,“--”代表变量自减运算。

1、模运算“%”

“模”是“Mod”的音译,模运算多应用于程序编写中。 Mod的含义为求余。模运算在数论和程序设计中都有着广泛的应用,从奇偶数的判别到素数的判别,从模幂运算到最大公约数的求法,从孙子问题到凯撒密码问题,无不充斥着模运算的身影。

C语言用“%”代表模运算,例如7%2=1、8%5=3等。

2、自增运算“++”

C语言用“++”代表自增运算,分为前缀自增和后缀自增,其效果均为自身变量值+1。前缀自增例如“a=5;b=++a;”,则运行结果是“a=6,b=6”。后缀自增例如“a=5;b=a++;”,则运行结果是“a=6,b=5”。

3、自减运算“--”

C语言用“--”代表自减运算,分为前缀自减和后缀自减,其效果均为自身变量值-1。前缀自减例如“a=5;b=--a;”,则运行结果是“a=4,b=4”。后缀自减例如“a=5;b=a--;”,则运行结果是“a=4,b=5”。

(4)c语言里的运算符号大全扩展阅读:

C语言常用运算符:

+:加法

-:减法

<<:位左移

>>:位右移

<:小于

<=:小于等于

>:大于

>=:大于等于

+=:加赋值运算

-=:减赋值运算

*=:乘赋值运算

/=:除赋值运算

%=:模赋值运算

‘伍’ c语言的运算符号 +,-,*,/,也就是数学里的+,-,*,/,%,!,>=,<=,>,<

c语言中的符号其实和数学中的差别是有点的。
1. 常用运算符
算术运算符: +, -, *, /, %
关系运算符: >, <, >=, <=, ==, !=
逻辑运算符: !, &&, ||
赋值运算符:=, +=, -=,*= ,/= ,++,--
2.
算术运算符: +,-,*没什么好说的,跟数学里边一样。
/ 在C中称为 整除运算符,运算规则,除号两边都是整数时结果是整数,否则是浮点数
举个例子: 3/2 的值是 1 ; 3.0/2 或 3/2.0 或 3.0/2.0 的值都是 1.5
% 求余运算符,就是求两数相除的余数。 有个要求,运算符两边的数必须都是整数,否则会报错,7%4 的值是3 ,7.0%4 在C中是错误的表达式。
3.关系运算符 就是数学中关系运算符的运算规则,注意区分 这里的 等于== 和赋值的 =
举个例子: int a=4; 的意思是 把4 赋值给a a== 4 的意思是比较 a 和4 是不是相等。
4.逻辑运算 ! 非 && 与 || 或
也跟数学中一样,
比如 5>3 的值是 真, 那么!(5>3) 就是假
&& 两边的表达式都是真的时候整个表达式是真,否则是假。 || 两边的表达式都是假的时候整个表达式是假,否则为真。
5.赋值
+= a+=5 等价于: a=a+5 其余类似。
++ a++ 等价于 a=a+1 --类似。

‘陆’ c语言中有哪些运算符,各有什么功能

1级优先级
左结合
()
圆括号
[]
下标运算符
->
指向结构体成员运算符
.
结构体成员运算符
++
后缀增量运算符
--
后缀增量运算符
2级优先级
右结合
!
逻辑非运算符
~
按位取反运算符
++
前缀增量运算符
--
前缀增量运算符
-
负号运算符
(类型)
类型转换运算符
*
指针运算符
&
地址与运算符
sizeof
长度运算符
3级优先级
左结合
*
乘法运算符
/
除法运算符
%
取余运算符
4级优先级
左结合
+
加法运算符
-
减法运算符
5级优先级
左结合
<<
左移运算符
>>
右移运算符
6级优先级
左结合
<、<=、>、>=
关系运算符
7级优先级
左结合
==
等于运算符
!=
不等于运算符
8级优先级
左结合
&
按位与运算符
9级优先级
左结合
^
按位异或运算符
10级优先级
左结合
|
按位或运算符
11级优先级
左结合
&&
逻辑与运算符
12级优先级
左结合
||
逻辑或运算符
13级优先级
右结合
?
:
条件运算符
14级优先级
右结合
=
+=
-=
*=
/=
%=
&=
^=
|=
<<=
>>=
全为赋值运算符
15级优先级
左结合

逗号运算符

‘柒’ 在C语言中11种赋值运算符的具体含义,用法

1.六个变量=表达式的赋值:

=是赋值运算符,/=是除后赋值,*=是乘后赋值,

%=是取模后赋值,+=是加后赋值,-= 是减后赋值,

2.<<=是左移后赋值,变量<<=表达式 左移就是将左边的数的二进制各位全部左移若干位,右边的数指定移动位数,高位丢弃,低位补0, 移几位就相当于乘以2的几次方。

3.>>=是右移后,变量>>=表达式,右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。

对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”);

对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。

如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统,系统移入0或系统移入1。

移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。

4.&= 按位与后,变量&=表达式,按位与是指:参加运算的两个数据,按二进制位进行“与”运算。

如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。

5.^= 按位异或后赋值,变量^=表达式,参与运算的两个量按照对应的位进行异或运算,且
0^0→0, 0^1→1, 1^0→1, 1^1→0

一个数与0异或仍保持不变,如a^0=a
一个数与自己异或结果为0,如a^a=0

11.|=是按位或后赋值,变量|=表达式,参与运算的两个量按照对应位进行或运算,且0|0→0, 0|1→1, 1|0→1, 1|1→1。

(7)c语言里的运算符号大全扩展阅读:

1.赋值表达式的功能是计算表达式的值再赋予左边的变量。

赋值运算符具有右结合性,因此a=b=c=5可理解为a=(b=(c=5))。

2.在其它高级语言中赋值构成了一个语句,称为赋值语句;

而在C语言中,

把“=”定义为运算符,从而组成赋值表达式。

3.凡是表达式可以出现的地方均可出现赋值表达式。

例如:式子x=(a=5)+(b=8)是合法的。它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x,故x应等于13。

4.在C语言中也可以组成赋值语句。

按照C语言规定,任何表达式在其未尾加上分号就构成为语句。

‘捌’ c语言运算符号的介绍

C语言中的符号运算符的种类语言的运算符可分为以下几类:1 算术运算符用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。2.关系运算符用于比较运算。包括大于(&gt;)、小于(&lt;)、等于(==)、 大于等于(&gt;=)、小于等于(&lt;=)和不等于(!=)六种。3.逻辑运算符用于逻辑运算。包括与(&amp;&amp;)、或(||)、非(!)三种。4.位操作运算符参与运算的量,按二进制位进行运算。包括位与(&amp;)、位或(|)、位非(~)、位异或(^)、左移(&lt;&lt;)、右移(&gt;&gt;)六种。5.赋值运算符用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&amp;=,|=,^=,&gt;&gt;=,&lt;&lt;=)三类共十一种。6.条件运算符这是一个三目运算符,用于条件求值(?:)。7.逗号运算符用于把若干表达式组合成一个表达式(,)。8.指针运算符用于取内容(*)和取地址(&amp;)二种运算。9.求字节数运算符用于计算数据类型所占的字节数(sizeof)。10.特殊运算符有括号(),下标[],成员(→,.)等几种。

‘玖’ c语言的算术运算符有哪些 各自的功能又是什么

算术运算符:+(加),-(减),*(乘),/(除),%(取余,操作数必须都是整数)。。
赋值运算符:=(右值赋值给左值,左值必须是变量)。。
逻辑运算符:||(或),&&(与),!(非),^(或非)。。
位运算符:|(位或),&(位与),!(位非),>>(右移),<<(左移)。。
条件运算符:?:(如,
a>b?a:b,如果a>b,则值为a,反之值为b)。。

C语言中的运算符大概就这些,具体的用法你可以参考一下书本。