第 2章基本数据类型和运算第 2章 C语言的基本知识
2.1 C语言的数据类型
2.2 常量及其类型
2.3 变量及其类型
2.4 运算符与表达式
2.5 不同数据类型的输入
2.6 不同数据类型的输出
2.1 C语言的数据类型
2.1.1 C语言具有的数据类型
2.1.2 C 语言的基本数据类型
2.1.3 基本数据类型的修饰
2.1.1 C语言具有的数据类型
数据类型是指数据的内在表现形式。不同的数据类型在内存中的存储方式不同,在内存中所占的字节数也不相同。
通俗地说,数据在加工计算中的特征就是数据类型。
例如,职工的年龄和工资都可以进行加减等算术运算,
具有一般数值的特点,在 C语言中称为数值型。其中年龄是整数,所以称为 整型 ;工资一般为实数,所以称为 实型 。
C语言的数据类型有以下几种,如图 2-1所示。
图 2-1 C语言的数据类型
2.1.2 C 语言的基本数据类型
基本数据类型是不可再分的最基本的数据类型,是构造其他数据类型的基础。
C语言提供的五种基本的数据类型及其对应的关键字如表 2-1所示。
字符型用来描述单个的字符;
整型用来描述整数;浮点型和双精度型用来描述实数,
其中双精度型比浮点型表示的精度高;无值类型用来描述无形式参数的 C函数、无返回值的 C函数或无定向指针等。
数据类型 关键字字符型 char
整型 int
浮点(单精度)型 float
双精度型 double
无值型 void
表 2-1 C语言基本的数据类型及其对应的关键字
C语言规定,可以在基本数据类型关键字前面加上类型修饰符,signed,unsigned,short,long”,
从而扩展基本数据类型的数值范围或提高基本数据类型的精度 。
Turbo C 编译系统中的基本数据类型修饰有如下的规定:
( 1) char型数据可以用 signed,unsigned加以修饰,
即可以有 char,signed char,unsigned char 三种形式。
2.1.3 基本数据类型的修饰
( 2) int 型数据可以用 signed,unsigned,short、
long加以修饰,即可以有 int,signed int、
unsigned int,short int,long int,signed
long int,unsigned long int等形式。对于 int
而言,当使用类型修饰后,关键字 int可省略不写,
例如 signed long int可以写成 long,unsigned
long int可以写成 unsigned long。
( 3) C语言的 ANSI C标准指出:各种变量的取值范围应在标题文件 limits.h和 float.h中作出定义。
2.2 常量及其类型
2.2.1 整型常量
2.2.2 实型常量
2.2.3 字符型常量
2.2.4 字符串常量
2.2.5 符号常量
2.2.1 整型常量
1,十进制整数
2,八进制整数
3,十六进制整数
十进制是整数的通常写法,十进制整数没有前缀,
其数码为 0~ 9。
例如,437
八进制整数必须以数字 0开头,即以 0作为八进制数的前缀。数码取值范围为 0~ 7。
例如,0123
十六进制整常数的前缀为 0X或 0x。其数码为 0~ 9,
A~ F或 a~ f。
例如,0x123
2.2.2 实型常量
1,小数形式
2,指数形式
1,小数形式
由正负号、整数部分、十进制小数点和小数部分组成。整数部分和小数部分是由数字 0~ 9和小数点组成,其中小数点是不能缺少的。
2,指数形式
在小数的基础上,后面加阶码标志 (,e” 或
,E” ) 以及阶码组成 。 其一般形式为:
a E n或 a e n
其中的 a为十进制数,E或 e为阶码标志,n为十进制整数 。 需要注意的是,字母,e” 或,E” 之前必须有数字,且 e后面的指数必须为整数,如 e5、
3.24e3.2,e等都是不合法的指数形式 。
例 2.1?以实数的形式输出三个数。
main()
{
printf("%f\n ",365.);
printf("%f\n ",365);
printf("%f\n ",365f);
}
该程序的运行结果如下:
从输出结果可以看出第二行输出的 0.000000不是期望的数值。原因是实数不仅要有数字部分,而且还要有小数点,否则,C程序运行结果将不是期望值。
365.000000
0.000000
365.000000
2.2.3 字符型常量
1,单引号表示法
2,转义字符表示法
1,单引号表示法
对于可显示的字符常量,可直接用单引号将该字符括起来,如 ' a ',' 9 ',' Z ',' = ',' + ',
'? '等。也可用字符的 ASCII码值表示字符,如十进制的 85表示大写字母 ' U ',八进制数 0102表示大写字母 ' B ' 。
2,转义字符表示法
对于不能显示的字符(主要指控制字符,如回车符、换行符、制表符等)和一些在 C语言中有特殊含义和用途的字符(如单引号、双引号、
反斜杠线等),只能用转义字符表示。
转义字符是一种特殊的字符常量。转义字符以反斜线,\”开头,后面跟一个或几个字符。转义字符具有特定的含义,它不同于字符原有的意义,所以称“转义”字符。常用的转义字符及其含义如表 2-3所示。
转义字符 含义 ASCII代码
\n 换行 10
\r 回车 13
\f 换页 12
\t 水平制表( Tab) 9
\v 垂直制表 11
\b 退格符( backspace) 8
\\ 反斜杠符 "\" 92
\’ 单引号符 39
\” 双引号符 34
\ddd 1~ 3位八进制数所代表的字符
\xhh 1~ 2位十六进制数所代表的字符表 2-3 常用的转义字符及其含义
说明,C语言字符集中的任何一个字符均可用转义字符来表示 。 表中的 \ddd和 \xhh正是为此而提出的 。
ddd和 hh分别为八进制和十六进制的 ASCII代码 。
如 \101表示字母,A”,\102表示字母,B”,\X0A
表示换行等 。
字符常量的特点:
( 1)字符常量只能用单引号括起来,不能用双引号或其他符号。
( 2)字符常量只能是单个字符,不能是字符串。
( 3)字符常量可以是字符集中任意字符。
( 4) C语言对字符型和整型是不加区分的,字符型常量被视为 1字节的整数,其值就是该字符的 ASCII码,
可以像整数一样参加数值运算。 例如,'C'的 ASCII
码为 67,'C'-2的值为 65,即字符 'A'的 ASCII码。
2.2.4 字符串常量
字符串常量 是用双引号括起来的零个或多个字符序列。
例如:,”,” Gold human!”,” 010278” 等都是字符串常量。
其中,两个双引号连写表示 空字符串 ;当字符串中包含像单引号、双引号或反斜杠线这类有特定用途的字符时,
应该分别用转义字符 \’,\”,\\表示 。
例如,” He said:\”hello!\”” 代表的英文句子是:
He said:”hello!”
一个字符串中所有字符的个数称为该 字符串的长度,其中每个转义字符只当做一个字符。例如,” 1234567”,” xyz”,” BbedsQd”,” \\
ABCD\\”,” \101\102\ x43\x44”的长度分别为 7、
3,7,6,4。
C语言规定,每个字符串在内存中占用的字节数等于字符串的长度加 1。 其中最后一个字节存放的字符称为,空字符,,其 ASCII码为 0,书写时常用转义字符 ’ \0’来表示,是字符串结束的标记 。
例如字符串,MN”和,M”的长度分别为 2和 1,它们在内存中分别占用 3个字节和 2个字节 。
字符串常量和字符常量是两个不同的量,它们之间的主要区别有以下几点:
( 1)字符常量由单引号括起来,字符串常量由双引号括起来。
( 2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
( 3)可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C
语言中没有相应的字符串变量,但是可以用一个字符数组来存放一个字符串常量(详见第 4章的介绍)。
( 4) 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加 1。增加的一个字节用来存放字符串结束的标志 '\0'
( ASCII码为 0)。
2.2.5 符号常量
1.符号常量的定义
2.符号常量的优点
1.符号常量的定义
符号常量 是用标识符表示的常量。
定义符号常量有三种方法:
宏定义
const修饰符
枚举
这里先介绍前两种,第三种在第 7章介绍。
1)宏定义
宏定义是用指定的标识符来代表一串字符,其一般形式为:
#define 标识符 字符串
例如,#define PI 3.14159265
2) const定义
const定义的符号常量既有类型又有值,与宏定义不同,其一般的形式为:
const 数据类型 标识符 =常量表达式;
例如:
const int max=300;
const float x=max+3.14;
2.符号常量的优点
符号常量具有以下优点:
( 1)用符号常量可以清晰地看出常量所代表的物理意义。
( 2)如果一个程序中多次出现某一个常量(例如,
3.14159265),就要多次书写,使用符号常量就可以较短的符号代替较长的数字,从而可以有效地避免多次书写同一个常量,并减少出错的几率。
( 3)当程序中多次出现同一个常量需要修改时,
必须逐个修改,很可能漏改或错改。 用符号常量只需修改定义,就可以做到统改,减少出错的几率。
2.3 变量及其类型
2.3.1 变量及其定义
2.3.2 整型变量
2.3.3 实型变量
2.3.4 字符型变量
2.3.5,字符串变量
2.3.1 变量及其定义
变量是指在程序运行过程中其值可以发生变化的量。
一般情况下,变量用来保存程序运行过程中输入的数据、计算获得的中间结果以及程序的最终结果。
变量的定义格式为:
类型说明符 变量名表 ;
其中,类型说明符包括 int,float,double,char等,
用来指定变量的数据类型;变量名表如果有多个变量,
则彼此间要用逗号分隔开;分号是语句结束符。
例如:
int x; /*定义了一个类型为整型的变量 x*/
int y,z; /*定义了一个整型变量 y和一个整型变量 z*/
float a,b,c; /*定义了三个浮点型变量 a,b,c*/
在变量定义时,应注意以下几点:
( 1)允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号间隔。
( 2)类型说明符与变量名之间至少用一个空格间隔。
( 3)变量定义必须放在变量使用之前。一般放在函数体的开头部分。
( 4)最后一个变量名之后必须以 分号,;”结尾。
2.3.2 整型变量
整型变量的基本类型符为 int。可以根据数值的范围将整型变量定义为基本整型、短整型、长整型、无符号型,具体如下所述:
( 1)基本整型:类型说明符为 int,在内存中占 2个字节。
( 2)短整型:类型说明符为 short int或 short,所占字节和取值范围均与基本型相同。
( 3)长整型:类型说明符为 long int或 long,在内存中占 4个字节。
( 4)无符号型:类型说明符为 unsigned。其中,
无符号型又可与上述三种类型匹配而构成如下类型:
无符号基本型:类型说明符为 unsigned int或
unsigned。
无符号短整型:类型说明符为 unsigned short。
无符号长整型:类型说明符为 unsigned long。
说明,各种无符号类型的量所占的内存空间字节数与相应的有符号类型的量相同 。 但由于省去了符号位,所以不能表示负数 。 有符号整型变量的最大取值为 32767,而无符号整型变量的最大取值为
65535。
类型 类型说明符 字节 取值范围基本整型 int 2 -32768~ 32767
短整型 short int 2 -32768~ 32767
长整型 long int 4 -2147483648~
2147483647
无符号整型 unsigned int 2 0~ 65535
无符号长整型 unsigned long 4 0~ 4294967295
表 2-4 各类整型变量所分配的内存字节数及数的表示范围表 2-4列出了 C语言中各类整型变量所分配的内存字节数及数的表示范围。
例 2.2?整型变量的定义与使用举例一。
#include<stdio.h>
main()
{
int x,y,m,n; /* 指定 x,y,m,n 为整型变量 */
unsigned u; /* 指定 u 为无符号整型变量 */
x=-21; y=18; u=40;
m=x+u; n=y+u;
printf("x+u=%d,y+u=%d\n",m,n);
}
程序的运行结果为:
x+u=19,y+u=58
例 2.3?整型变量的定义与使用举例二。
#include<stdio.h>
main()
{ int a,b,c,d; /*定义整型变量 a,b,c,d*/
long x,y; /*定义长整型变量 x,y*/
x=7; /*变量赋初值 */
y=8;
a=9;
b=10;
c=x+a; /*求 x与 a的加和 */
d=y+b; /*求 y与 b的加和 */
printf("c=x+a=%d,d=y+b=%d\n",c,d); /*输出 c,d的值 */
}
程序的输出结果为:
c=x+a=16,d=y+b=18
C语言中,可以在程序的一行中写入多条语句,因此上面的程序可以调整为:
main()
{ int a,b,c,d;
long x,y;
x=7; y=8; a=9; b=10;
c=x+a; d=y+b;
printf("c=x+a=%d,d=y+b=%d\n",c,d);
}
调整后的程序只是其表示形式发生了变化,
程序的本质并没有改变,该程序的运行结果为:
c=x+a=16,d=y+b=18
2.3.3 实型变量
在 C语言中,实型变量分为单精度、双精度两类 。
单精度型:类型说明符为 float。
双精度型:类型说明符为 double。
在一般系统中一个 float型的数据占 4个字节( 32位)
内存空间,一个 double型的数据占 8个字节( 64位)
内存空间。单精度实数提供 7位有效数字,双精度实数提供 15~16位有效数字,数值的取值范围随机器系统而异。
每一个实型变量都应在使用前进行定义。例如:
float m,n; /*定义两个单精度实型变量 x和 y */
double a,b,c; /*指定 a,b,c为双精度实型量 */
例 2.4?实型变量的定义和应用举例。
#include<stdio.h>
main()
{ float a;
double b;
a=5555.55555;
b=5555.5555555555;
printf("%f\n%f\n",a,b);
} 该程序的运行结果如下:5555.555664
5555.555556
说明:实型常量不分 float型和 double型。一个实型常量可以赋给一个 float型或 double型变量。根据变量的类型截取实型常量中相应的有效位数字。
2.3.4 字符型变量
字符型变量用来存放字符常量,一个字符型变量只能存放一个字符。
字符变量的类型说明符是 char。
下面是几个字符型变量的定义:
char m1,m2,m3;
上述语句将 m1,m2和 m3定义为字符型变量,
其内可以各放一个字符,下面给这三个字符变量分别赋值 a,b,c:
m1='a';
m2='b';
m3='c';
例 2.5?字符型变量的定义与使用举例。
#include<stdio.h>
main()
{ char c1,c2;
c1=97;c2=98; /*97和 98分别为字符 A和 B的 ASCII码 */
printf("%c %c ",c1,c2);
printf("%d %d\n",c1,c2);
/*小写字母的 ASCII码值比对应的大写字母大 32*/
c1=c1-32;
c2=c2-('a'-'A');
printf("%c %c\n",c1,c2);
} 程序的运行结果为:a b 97 98
A B
分析:这里的 97和 98是字符 A和 B的 ASCII码值,程序执行时 C语言把 97和 98按照输出语句中格式控制符的规定转化成了其对应的字符。
说明:字符型数据和整型数据是通用的 。 它们既可以用字符形式输出,也可以用整数形式输出 。 但是应注意字符数据只占一个字节,
只能存放 0~ 255范围内的整数 。
2.3.5 字符串变量
C语言没有专门的字符串变量,可以用字符数组来实现,详见第 4章的介绍。
2.4 运算符与表达式
2.4.1 运算符及运算对象
2.4.2 表达式
2.4.3 算术运算符
2.4.4 关系运算符
2.4.5 逻辑运算符
2.4.6 逗号运算符和条件运算符
2.4.7 长度(求字节)运算符
2.4.8 位操作
2.4.9 赋值运算符
2.4.10 数据之间的混合运算
2.4.1 运算符及运算对象
1.运算符
2.运算对象基本运算符
C语言运算符号专用运算符算术运算符关系运算符逻辑运算符赋值运算符逗号运算符长度运算符位运算符基本算术运算符自增自减运算符位移位运算符位逻辑运算符强制类型转换运算符下标运算符成员运算符指针运算符图 2-3 C语言运算符的分类用来表示各种运算的符号称为 运算符,也称为操作符。 C
语言中运算符的分类如图 2-3 所示。
1.运算符
2.运算对象
运算对象也称为操作数,C语言中的运算对象有下列三种情况:
( 1)运算符的运算对象可以是一个,此时的运算符称为“单目运算符”。
( 2)运算对象最常见的是有两个,此时参与运算的运算符称为“双目运算符”。
( 3)运算对象还可以是三个,称“三目运算符”。
三目运算符在 C语言中只能是条件运算符,夹在三个运算对象之间。
例如,a>b?4:5
2.4.2 表达式
1.表达式的定义
2.表达式语句
1.表达式的定义
表达式 是用运算符与圆括号将操作数(运算对象)连接起来所构成的式子。
C语言的操作数包括常量、变量、函数值等。
例如,表达式 sin(2.0)+(a-b)*5/sqrt(2.0)中包括的运算符有 +,-,*,/,操作数包括常量 5,变量 a,b以及函数 sin(2.0)和 sqrt(2.0)。
表达式按照运算符的运算规则进行运算可以获得一个值,称为,表达式的值” 。
当表达式中出现多个运算符时,表达式的计算按照教材中 附录一 中规定的运算符的优先级和结合性进行。
2.表达式语句
C语言中,在一个表达式的后面加上分号,;”就构成了表达式语句,即简单语句。
有的表达式语句是有意义的简单语句。
例如,x=x+1;和 x++;都表示使 x单元的内容加 1。
而有的表达式语句是无意义的。
例如,3++;是无意义的表达式语句,因为这条语句没有引起任何存储单元中数据的变化。
2.4.3 算数运算符
1,基本算术运算符
2,自增、自减运算符
3,算术表达式
4,算术运算符的结合性和优先级
1.基本算数运算符
( 1)加法运算符,+”:加法运算符为双目运算符,即应有两个操作数参与加法运算。如 a+b,5+4等。但,+”也可作正值运算符,此时为单目运算,如 +5等。
( 2)减法运算符,-”:减法运算符为双目运算符。但,-”也可作负值运算符,此时为单目运算,如 -5等。
( 3)乘法运算符,*”:乘法运算符为双目运算符,如 8*9。
但,*” 在指针运算中,也可以表示单目的“取内容”运算。
( 4)除法运算符,/”:除法运算符为双目运算符。参与的操作数均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为实型。
( 5)求余运算符,%”:求余运算符也叫求模运算,为双目运算符,用来求两个整数的( int 型或 char型)的余数,
如 9%2=1。
基本算术运算符的运算对象,运算规则与结合性如表 2-5所示 。
表 2-5基本算术运算符的运算对象、运算规则与结合性对象数 名称 运算符 运算规则 结合性单目 正 + 取正值 自右向左负 ﹣ 取负值双目加 + 加法自左向右减 ﹣ 减法乘 * 乘法除 / 除法模 % 整除取余
说明,两个整数相除结果也为整数,如 3/2的结果值为 1,舍去小数部分 。 但是,如果除数或被除数中有一个为负值时,则舍去的方法不一定相同,例如 -
3/2在有的机器上得到的结果是 -1,而有的机器则得出其他的值如 -2。 但多数机器采取,向零取整,的方法,也就是哪个值靠近 0,取哪个值 。
例 2.6?运算符,/”应用举例。
#include<stdio.h>
main()
{
printf("%d,%d\n",30/8,-30/8);
printf("%f,%f\n",30.0/8,-30.0/8);
}
程序的运行结果为:
3,-3
3.750000,-3.750000
2.自增、自减运算符
自增自减运算符都是单目运算符,用来对整型、
字符型、指针型以及数组元素等变量进行算术运算,其运算结果与原来的类型相同,并存回原来的运算对象。
例如:
( 1) ++m:先使 m的值加 1,再使用变量 m。
( 2) m++:先使用 m的值,再使变量 m加 1。
( 3) --m:先使 m的值减 1,再使用变量 m。
( 4) m--:先使用 m的值,再使变量 m减 1。
在理解和使用上容易出错的是,m++和 m--。特别是当它们出现在较复杂的表达式或语句中时,常常难于弄清,所以在开始学习时一定应仔细分析。
例如:设整型变量 m为 4,则:
++m+1:在计算时,先计算 m= m+1=5后,再使用
m的值 5和 1进行相加;结果为 6。
m--+1:应理解为先进行 m+1得出结果 5,再进行
m= m-1=3。
当出现难以区分的若干个 +或 -组成的表达式运算时,
C语言规定,自左向右取尽可能多的符号组成运算符。
例如:设整型变量 m和 n的值均为 6,则:
m+++n:应理解为 (m ++)+n,最后的计算结果为 12,
m的值为 7,n不变。
m---n:则理解为 (m--)-n,最后的计算结果为 0,m的值为 5,n不变。
自增和自减运算符只能用于变量,而不能把它强加给常量和表达式,例如,8++,(m+n)--都是不合法的表示方法 。 自增和自减的结合方向是自右向左的 。
例 2.7?自增自减运算符应用举例。
#include<stdio.h>
main()
{ int y=6;
printf("%d\n",++y);
printf("%d\n",--y);
printf("%d\n",y++);
printf("%d\n",y--);
printf("%d\n",-y++);
printf("%d\n",-y--);
}
程序的输出结果为:
7
6
6
7
-6
-7
例 2.8?由自增运算符构成的表达式应用举例。
#include<stdio.h>
main()
{ int x=8,y=8,p,q;
p=(x++)+(x++)+(x++);
q=(++y)+(++y)+(++y);
printf("%d,%d,%d,%d",p,q,x,y);
}
分析:在本程序中,对 p=(x++)+(x++)+(x++);应理解为三个 x相加,所以 p的值为 24。然后 x再自增 1三次相当于加 3,所以 x的最后值为 11。对
q=(++y)+(++y)+(++y;应理解为 q先自增 1,再参与运算,由于 q自增 1三次后值为 11,三个 11相加的和为
33,y的最后值仍为 11。
程序的输出结果为:
24,33,11,11
3.算术表达式
算术表达式是用算术运算符连接数值型的运算对象构成的表达式,用来完成数值计算的功能。如
5%6+12,(3+5)/(6%4),(a++)*j-(++b)等。
使用算术运算符时,应注意以下几点:
( 1)乘法运算符,*”在表达式中既不能省略,也不能用,·”或,×,代替;除法运算符也不能用,÷,
代替。
( 2) C语言没有乘方运算,当需要进行乘方运算时,
可以通过连乘的方式实现乘方运算,也可以使用 C
编译系统提供的数学函数,如,pow(10,n)表示 10
的 n次方,pow(x,y)表示 x的 y次方。
( 3)表达式中不允许使用方括号或花括号,但允许使用多重圆括号嵌套配对使用。如 x/(12*(a+b))。
( 4)算术表达式应能正确地表达数学公式。例如:
数学表达式 (4+y)/2b对应的 C语言算术表达式为:
(4+y)/(2*b)或 (4+y)/2/b。
( 5)算术表达式的结果应该不超过其所能表示的数的范围。例如,最大的整数是 32767,则
32767+12就是错误的结果。
4.算术运算符的结合性和优先级
运算符的结合性是指如果一个操作数左边和右边的两个运算符的优先级相同,应该优先计算的操作符。
计算机在进行表达式的计算时,通常严格按照运算符的优先级和结合性进行,就算术表达式而言,
括号最优先,其次是一元运算符,然后是乘、除和求模,最后是加、减;当同一优先级的运算符同时出现时,按它们的结合性确定其优先次序。
详见附录一。
2.4.4 关系运算符
1,关系运算符
2,关系运算符的优先次序
3,关系表达式
1,关系运算符
所谓,关系运算,实际上是,比较运算,,首先将两个值进行比较,然后判断其比较的结果是否符合给定的条件 。
例如,m<8是一个简单的关系表达式,小于号( <)
是其中的关系运算符,如果 m的值小于 8,则满足给定的条件,因此关系表达式的值为“真”;如果
m的值等于或大于 8,则其值为“假”。
说明:关系运算符可以用来比较两个数值型数据的大小,也可以比较两个字符数据的大小,字符数据的比较按该字符对应的 ASCII代码值的大小进行,
其实质也是数值比较。
关系运算符的运算对象,运算规则和结合性如表 2-6
所示 。
表 2-6关系运算符的运算对象、运算规则和结合性对象数目 名称 运算符 运算规则 结合性双目小于 <
条件满足则为真,
结果为 1;
否则为假,
结果为 0。
自左向右小于等于 <=
大于 >
大于等于 >=
等于 = =
不等于 !=
2,关系运算符的优先次序
在C语言中所有关系运算符优先级别如表 2-7所示。
表 2-7关系运算符优先级别序号 关系运算符 优先级别
1 <
优先级相同
(级别高)
2 <=
3 >
4 >=
5 = = 优先级相同
(级别低)6 !=
3.关系表达式
用关系运算符将两个表达式连接起来的式子称为关系表达式。其中,表达式可以是算术表达式或关系表达式,也可以是随后将要学习到的逻辑表达式和字符表达式。 例如,c-d>a+b和 x>5/2均是合法的关系表达式。
由于关系表达式中的表达式也可以又是关系表达式。因此,C语言也允许出现嵌套的情况。 例如:
a!=(c==d)
关系表达式的值是一个逻辑值,即“真”或
“假”,分别用,1”和,0”表示。 如 (a=3)>(b=5),
由于 3>5不成立,故其值为 0。
例 2.9?关系表达式应用举例。
#include<stdio.h>
main()
{ char c='k';
int i=4,j=2,k=5;
float x=3e+5,y=7.56;
printf("%d,%d\n",'a'+3<c,-i-2*j>=k+1);
printf("%d,%d\n",j<6,x-4.85<=x+y);
printf("%d,%d\n",i+j+k==-3*j,k==j==i+7);
}
程序的运行结果为:
1,0
1,1
0,0
例 2.10?几个学习怎样使用关系运算符的例子。
设变量定义如下:
char a1='a',a2='A';
/*a1,a2可以看成整型,其值分别为 97,65*/
int n1=65,n2=97;
float f1=0.3E1,f2=3.0001;
则:
a1>a2,n1<n2,f1==f2的值依次是 1,1,0。
a1>=n1,a2>=n2,f1==n1,a1==n2的值依次是 1,0,0,1。
f1>a1,f2<a2,f1==n1-62的值分别为 0,1,1。
2.4.5 逻辑运算符
1.逻辑运算符及其运算规则
2.逻辑运算符的优先级和结合性
3.逻辑表达式
1.逻辑运算符及其运算规则
C语言中的逻辑运算符对两个关系式或逻辑值进行运算,
共有三个运算符:逻辑与 &&、逻辑或 ||、逻辑非!。
其中逻辑与和逻辑或是双目运算符,逻辑非是单目运算符。
逻辑运算的结果只有两个:逻辑真和逻辑假,分别用二进制的 1和 0表示。
C语言系统对任何非 0值都认定是逻辑真,而将 0认定为逻辑假。
逻辑运算符必须连接逻辑量,运算的结果也是逻辑量,
即只能取 0或 1。
表 2-8 逻辑运算符的运算规则
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
逻辑运算符的运算规则常用真值表表示,如表 2-8所示。
2.逻辑运算符的优先级和结合性
逻辑运算符中逻辑非!的优先级最高,其次是逻辑与
&&,最后是逻辑或 ||。
三种逻辑运算符的结合性如下所述:
( 1)逻辑运算符,!”的结合性是自右向左的,也就是先计算最右边的,!”,再依次向左计算其他的逻辑运算。例如:
,!!!!8”的计算顺序相当于,!(!(!(!8)))”,其结果为 1。
( 2)逻辑运算符,&&”和,||”的结合性是自左向右的,即先计算最左边的,&&”或,||”,再依次向右计算其他的
,&&”或,||”。例如:,8&&2&&0”的计算顺序相当于
“( 8&&2) &&0”,表达式的结果很显然为 0。再例如:
,0||2||0”的计算顺序相当于,(0||2)||0”,结果为 1。
3.逻辑表达式
用逻辑运算符连接关系表达式或其他任意数值型表达式就构成 逻辑表达式 。
通常用逻辑运算符连接关系表达式,这时先计算关系表达式的值,然后再进行逻辑运算。
逻辑表达式也可以连接任何非数值型的表达式。
说明,C语言规定任何非 0值都被视为逻辑真,而 0
则被视为逻辑假,所以当用逻辑运算符连接非数值表达式时,运算结果也是非 0即 1。
例如:为了判断变量 char1的值是不是字母,可以用下面的表达式表示:
char1>=’A’&&char1<=’Z’||char1>=’a’&&char1<=’z’
在用 &&对两个表达式进行计算时,如果第一个表达式的值为,假,,则后面的表达式就可以不用去理会,
结果肯定为,假,,所以 C语言规定此时的第二个表达式将不再参与计算 。
同样的道理,用 ||对两个表达式进行计算时,若第一个表达式的值为,真,,则计算结果与第二个表达式的结果也没有关系,计算结果肯定为,真,。
例如,0&&(5>4)的运算结果为 0,1||(5<4)的运算结果为 1。
在一个逻辑表达式中,如果有多个逻辑运算符,如下面的表达式:
! m&&n ||a<b&&c
则 C将按以下原则进行处理:
( 1)逻辑运算符!优先于逻辑运算符 &&,逻辑运算符 &&又优先于逻辑运算符 ||,即“!”为三者中最高的。
( 2)逻辑运算符中的,&&”和,||”低于关系运算符,而“!”高于算术运算符。 例如:
(m<n)&&(a>=b)可以写成 m<n && a>=b
表 2-9逻辑运算符、算术运算符和关系运算符之间的优先级比较运算符 优先级逻辑非(!) 高低算术运算符关系运算符逻辑与( &&)和逻辑或 (||)
逻辑运算符、算术运算符和关系运算符之间的优先级如表 2-9所示。
2.4.6逗号运算符和条件运算符
1.逗号运算符和逗号表达式
2.条件运算符
1.逗号运算符和逗号表达式
在C语言中逗号,,,也是一种运算符,称为 逗号运算符 。其功能是把两个表达式连接起来组成一个表达式,称为 逗号表达式,有时也称为,顺序求值运算符,。如,8+9,6+3。
逗号表达式的一般形式为:
表达式 1,表达式 2
表达式的求值过程为:首先分别求两个表达式的值,
得出结果后,以表达式 2的值作为整个逗号表达式的值。
例如,逗号表达式 8+9,6+3求值时,首先得出两个表达式的值分别为 17,9;然后整个逗号表达式的值为 9。
2.条件运算符
条件运算符的语法格式为:
表达式 1?表达式 2:表达式 3
上述由条件运算符构成的表达式称为条件表达式,其执行过程如图 2-4所示。
表达式 1
条件表达式取表达式 2的值 条件表达式取表达式 3的值真(非 0) 假( 0)
图 2-4 条件表达式的执行过程
分析:在图 2-3中,先求解表达式 1的值,若为真
(非 0)则求表达式 2,此时表达式 2的值就作为整个条件表达式的值。如果表达式 1的值为假( 0),
则求解表达式 3的值,表达式 3的值就是整个表达式的值。
条件表达式通常用于赋值语句之中。例如条件语句
( 详见教材的第 3章 ):
if(m<n)min=m;
else min=n;
用条件表达式可写为:
min=(m<n)?m:n;
该语句的语义是:如果 m<n为真,则把 m赋予 min,
如果 m<n为假,则把 n 赋予 min。
例 2.12?条件运算符应用举例。
#include<stdio.h>
main()
{
int m,n,max;
printf("\nPlease input two numbers:");
scanf("%d,%d",&m,&n);
printf("max=%d",m>n? m:n);
}
程序的运行情况为(用 ↙ 代表回车符):
Please input two numbers,45,690↙
max=690
2.4.7长度(求字节)运算符
长度运算符 sizeof是一种单目运算符,用来求某一类型变量的长度。其运算对象可以是任何数据类型符或变量。其语法格式为:
sizeof(表达式 )
其中的表达式可以是变量名、常量以及数据类型名。
其功能 是:求表达式中变量名所代表的存储单元所占的字节数;或求表达式中常量的存储单元所占的字节数;或是求表达式中的数据类型表示的数据在内存单元中所占的字节数。
说明:对于不同的机型,相同的数据类型可能占不同长度的内存空间,使用 sizeof运算符就可以了解自己所用的机型所有数据类型所占的存储空间。 sizeof运算符使用上较灵活,例如求整型 int数据所占的字节数,可以使用以下 三种方法,
( 1)求 sizeof(int)。
( 2)求 sizeof(100)。
( 3)使用 int a;定义一个整型变量 a,求 sizeof(a)。
2.4.8 赋值运算符
所谓赋值是将一个数据值存储到一个变量中,其中赋值的对象必须是变量,但数据值可以是常量、
变量或具有确定值的表达式。 C语言中在赋值表达式的末尾加上分号就是 赋值语句 。
赋值表达式的格式为:
变量名 =表达式
其中,=”称为赋值号或 赋值运算符,赋值表达式的功能是计算,=”右边表达式的值并存入,=”左边的变量中。
C语言提供两种赋值运算符:简单赋值运算符和复合赋值运算符。
1.简单赋值运算符
简单赋值运算符,=”是一种二元运算符,必须连接两个运算量,其左边只能是变量或数组元素( 详见第 4章 ),右边可以是任何表达式。
例如,a=a+1,b=a+c等是正确的赋值表达式。
而 2=c,a+2=1等则是错误的赋值表达式。
2.复合赋值运算符
复合赋值运算符由简单赋值运算符,=”和另外一个二元运算符组成,具有计算和赋值双重功能,共有 10种,分别是,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=。
其中,前五种复合赋值运算符 具有算术运算和赋值的双重功能 ;后五种复合赋值运算符则 具有位运算和赋值的双重功能。
复合赋值运算符的规则是,设 op为一个二元运算符,M、
N为两个操作数,则,Mop=N 等价于 M=MopN
例如,x/=2等价于 x=x/2,
x%=y+5等价于 x=x%(y+5)。
2.4.9数据之间的混合运算
1.自动转换
2.强自转换
3.赋值表达式的类型转换
1.自动转换
自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。
自动转换遵循以下规则:
( 1)若参与运算量的类型不同,则先转换成同一类型,
然后进行运算。
( 2)转换按数据长度增加的方向进行,以保证精度不降低。如 int型和 long型运算时先把 int型转成 long型后再进行运算。
( 3)所有的浮点运算都是以双精度进行的,即使仅含
float单精度型运算量的表达式,也要先转换成 double型,
再作运算。
( 4) char型和 short型参与运算时,必须先转换成 int型。
( 5)在赋值运算中,赋值号两边量的数据类型不同时,
赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据(这样会降低精度),丢失的部分按四舍五入处理。
2.强自转换
强自转换的格式为:
(数据类型名 )操作对象例如,
(float)x表示将 x转换成浮点型参与运算 ;
(long)y表示将 y转换成长整型参与运算。
注意:强自转化并不改变操作对象的数据类型和数值,例如( float) x确切的含义将 x转换成浮点型参与运算,而 x本身的数据类型和数值并没有任何改变。
例 2.15?高精度整数转换成低精度整数应用举例。
#include<stdio.h>
main()
{
double m=65536;
double n=65535;
printf("\n%d,%d",(int)m,(int)n);
/*把 m和 n分别转换成 int型的整数后输出 */
}
程序的运行结果为:
0,-1
例 2.16?强制类型转换在函数参数方面的应用举例。
#include<math.h>
#include<stdio.h>
main()
{
int a=100;
double b;
b=sqrt((double)a);/*求 a的平方根 */
printf("\n%f",b);
}
程序的运行结果为:
10.000000
3.赋值表达式的类型转换
当赋值表达式左边的变量与赋值运算符右边的表达式的数据类型相同时,不需要进行数据类型的转换。
当赋值表达式左边的变量与赋值运算符右边的表达式的数据类型不相同时,系统负责将右边的数据类型转换成左边的数据类型。此时会发生以下两种情况:
( 1)转换后不丢失数据。
( 2)转换后丢失数据。
2.5 不同数据类型的输出
2.5.1 printf()函数
2.5.2 单字符输出函数 putchar()
2.5.1 printf()函数
程序中用到 printf函数时要在程序的开头部分用以下的命令:
#include<stdio.h>

#include"stdio.h"
printf()函数的调用格式为:
printf("格式控制字符串 ",输出项清单 );
普通字符转义字符格式转换说明符格式控制字符串包含三种:
1.格式转换说明符格式转换说明符 功能
%d 以带符号的十进制形式输出整数(正数不输出符号)
%f 以小数形式输出单、双精度数,隐含输出 6位小数
%c 以字符形式输出,只输出一个字符
%s 输出字符串
%e 按指数格式输出浮点数(规格化表示)
%g 选用 %f或 %e格式中输出宽度较小短的一种格式,不输出无意义的 0
%u 以无符号十进制形式输出整数
%o 以无符号八进制形式输出整数(不输出前导符 0)
%x 以无符号十六进制形式输出整数(不输出前导符 0x)
格式转换说明符与各个输出项相对应,用来规定待输出项的显示格式。表 2-11列出了与不同种输出项对应的格式说明符。
表 2-11printf函数的格式转换说明符
%d
%d,按整数的实际长度进行输出。
%md,m为指定的输出宽度。如果整数的位数小于 m,则左补空格,如果整数的位数大于 m,则按实际的位数输出。
%ld,输出长整型。长整型的输出也可以指定宽度,即 %mld 。
例如:
int a=567,b=12345;
printf(”a=%4d,b=%4d”,a,b);
注:本书用,?”表示空格。
格式控制符,%d”的应用举例上述程序段的输出结果是:
a=?567,b=12345。
%f
%f,不指定字段宽度,由系统自动指定,整数部分全部输出,小数部分输出
6位。
%m.nf,指定输出的实数的宽度为 m,
其中 n位为小数位。如果实际长度小于
m,则左补空格。
%-m.nf,指定输出的实数的宽度为 m,
其中 n位为小数。如果实际长度小于 m,
则右补空格。
格式控制符,%f”的应用举例
#include<stdio.h>
main()
{
float a=345.678;
printf("%f,%10f,%10.2f,%.2f,%-10.2f",a,a,a,a,a);
}
程序的输出结果为:
345.678009,345.678009,345.68,345.68,345.68
%c %c用来输出单个字符。
#include<stdio.h>
main()
{
int a=100;
char ch='c';
printf("\na=%d,%c\n",a,a);
printf("ch=%d,%c\n",ch,ch);
}
程序的输出结果为:
a=100,d
ch=99,c
举例
%s:基本字符串输出形式
%ms,输出的字符串占 m列。如果待输出的字符串的长度大于 m,则按实际长度输出,如果待输出的字符串的长度小于 m,
则左侧补空格。
%-ms:如果待输出的字符串的长度小于 m,则右侧补空格。
%m.ns,字符串输出占 m列。如果 n小于
m,则只取字符串左端的 n个字符,这些字符输出在右侧,左侧补空格;如果 n大于 m,则 n个字符全部输出 。
%-m.ns,含义与
%m.ns相反 %s
例 2.21?格式控制符,%s”的应用举例。
#include<stdio.h>
main()
{
char *ch="Human";
printf("%s,%7s,%-7s,%7.3s,%-7.3s,%3.2s",
ch,ch,ch,ch,ch,ch);
}
程序的输出结果为 (?代表空格 ):
Human,Human,Human,Hum,Hum,?Hu
%e
%e
%m.ne -%m.ne
指定输出位共占 m
列,n为小数的位数。
如果实际长度小于
m,则右侧补空格。
指定输出位共占 m
列,n为小数的位数。
如果实际长度小于
m,则左侧补空格。
不指定输出数据所占的宽度和数字部分小数位数,由系统指定给出的 6位小数;指数部分占
5位,其中,e”占 1位,指数符号( +或 -)占 1位,指数占 3位。
%e的应用举例
#include<stdio.h>
main()
{
float a=123.789;
printf("%e",a);
}
程序的输出结果为:
1.23789e+02
2.转义字符
转义字符主要用于控制数据的显示位置,如换行、
换页等,常用的转义字符 见表 2-3。 使用转义字符可以使程序的输出更加整齐。
转义字符应用举例
#include<stdio.h>
main()
{
printf("\na\tb\nc\td");
}
程序的输出结果为:
a b
c d
3.普通字符
格式控制字符串中除格式控制符和转义字符以外的其他字符都视为普通字符,与输出项无关,输出时按原样显示。
2.5.2单字符输出函数 putchar()
C语言提供的 putchar()用于单字符的输出,其调用的一般格式为:
putchar(c);
其中 c是一个字符型常量或变量,也可以是一个不大于 255的整型常量或变量。该函数的功能是向标准输出设备(一般指屏幕终端)输出一个字符。
程序中用到 putchar函数时要在程序的开头部分用以下的命令:
#include<stdio.h>或 #include "stdio.h"
用 putchar输出可以显示的字符时,只需把待输出的字符作为其参数即可。例如,输出字符 c可以有以下几种形式:
( 1) char x; x='c'; putchar(x);
( 2) putchar('c');
( 3) putchar(99);/*99为 c的 ASCII码的十进制形式 */
用 putchar还可以输出不可显示的字符,例如,
输出一声响铃可以用以下两种形式:
( 1) putchar(007);
( 2) putchar('\007');
再如用 putchar('\n');可以控制换行。
2.6 不同数据类型的输出
2.6.1 scanf()函数
2.6.2单字符输入函数 getchar(),getche()
和 getch()
2.6.1 scanf()函数
1.格式控制字符串
2.地址列表
3.scanf()函数的几个特殊控制
4.使用 scanf()函数的注意事项
scanf()函数可以用于所有类型数据的输入,
使用不同的格式转换符可以将不同类型的数据从标准输入设备读入内存 。
程序中用到 scanf函数时要在程序的开头部分用以下的命令:
#include<stdio.h>或 #include"stdio.h "
scanf()函数的调用格式为:
scanf("格式控制字符串 ",地址表列 );
1.格式控制字符串
scanf函数中“格式控制字符串”只包含格式转换说明符和分隔符,没有转义字符和普通字符。
常用的格式转换说明符如表 2-12所示。
表 2-12 scanf格式转换说明符格式转换说明符功能
%d 用来输入十进制整数
%o 用来输入八进制整数
%x 用来输入十六进制整数
%f 用来输入实数,可以用小数形式或指数形式输入
%e 输入一个浮点数
%c 用来输入单个字符
%s 用来输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志 '\0'作为其最后一个字符
%h 用来输入短整型数据(可用 %hd,%ho,%hx)
%l 用来输入长整型数据(可用 %ld,%lo,%lx),以及
double型数据(用 %lf或 %le)
2.地址列表
scanf函数中的“地址列表”由一个或几个地址组成,多个地址之间用逗号隔开。
例 2.24?使用 scanf函数输入四个整数。
#include<stdio.h>
main()
{ int a,b,c,d;
printf("Please input four number:");
scanf("%d,%d,%d,%d”&a,&b,&c,&d); /*输入 4个整数 */
printf("The number you input are:\n ");
printf("%d,%d,%d,%d "a,b,c,d); /*输出 4个整数 */
} 程序的输出结果为(本书约定 ↙ 表示回车):
Please input four number:1,2,3,4↙
The number you input are:
1,2,3,4
说明:上述程序中 scanf()函数中的各个格式控制符用逗号隔开(,%d,%d,%d,%d”)因此输入的各个数也要用逗号隔开。
如果格式控制中没有逗号,则输入的各个数之间可以使用一个或多个空格键、回车键,Tab键来分隔。例如对于如下的语句:
scanf("%d%d%d%d"&a,&b,&c,&d);
则以下的输入均是合法的:
( 1) 1?2?3?4(?代表空格键)?
( 2) 1?
2?
3?
4?
( 3) 1(按 Tab键) 2?
3?4?
强调,scanf函数中的,&”是取地址运算符,后面接变量。
如,&a表示取变量 a的地址,scanf("%d"&a);的意思是将输入的数据存放到变量 a所指的存储单元中。
3,scanf()函数的几个特殊控制
1)抑制赋值,在百分号,%”之后、转换控制字符之前加上一个星号,*” 时,scanf函数将正常读入对应的数据,但不赋值。例如,%*c将抑制一个输入的字符; %*d将抑制一个输入的整数。
2)限制接收字符的个数,在百分号,%”之后、转换控制字符之前加上一个整数,可以规定从输入数据中接收的字符的个数。如果连续输入的字符个数超过指定的长度,则多余的字符被截断;反之若连续输入的字符的个数尚未达到指定的长度而提前遇到分隔符,则只接收分隔符之前的字符。
例 2.25?scanf()函数中的特殊控制符,*”应用举例。
#include<stdio.h>
main()
{ int a,b;
scanf("%d%*c%d",&a,&b);
printf("%d,%d",a,b);/*输出 a和 b的值 */
}
分析:程序运行时若从键盘输入,10/20回车,则
scanf函数把 10赋给 a,20赋给 b,字符,/”被忽略。
即 %*c的作用是跳过一个输入的字符。
因此对应的程序输出结果为:
10,20
例 2.26?scanf()函数中限制接收字符个数的特殊控制举例。
#include<stdio.h>
main()
{ int a,b;
printf("Please input two number:\n");
scanf("%4d%4d",&a,&b);
printf("a=%d,b=%d\n",a,b);
}
分析:程序运行时,如果输入,123空格 32658回车,
则将 123赋给变量 a(分隔符空格之前的输入数据不足 4位,只接收分隔符之前的字符),将 3265赋值给变量 b(输入的数据超过 4位,只取前 4位)。
因此程序对应的输出结果为,a=123,b=3265
说明:在 printf函数中可以用 %m.nf 来控制输出数据的宽度和小数位数,在 scanf函数中只能控制接收的数据的位数,不能控制小数位数。
例如:如果用
scanf(“%4.3f”,&a);
实现读入有 3位小数的实数是错误的。
4.使用 scanf()函数的注意事项
在使用 scanf()函数时需要注意以下几个问题:
( 1)用 %c作格式控制字符时,输入的任何字符均被当成有效的输入。
( 2)在 scanf()函数中可以规定输入的字符的宽度,系统对输入的数据自动截取。
( 3)用 scanf()函数输入实数时,不能规定精度。
( 4) scanf()函数中至少有一个输入项,输入项必须用地址表示。
( 5)在格式控制字符串中通常只出现格式转换说明符,如果出现格式转换说明符以外的字符,这些字符应该按原样输入,否则当 scanf()函数从输入数据中找不到这样的字符时,将自行终止输入。
( 6)调用 scanf()函数时,格式转换说明符与输入项必须在顺序和数据类型上一一对应和匹配。例如,用 %d格式对应一个浮点型变量地址时,会得到错误的结果。
( 7)当一个 scanf函数中包含若干个输入项或几个
scanf函数连续出现时,格式转换说明符在没有其他字符时,对于数值型数据默认分隔符为空格或制表符或回车;对于字符型数据没有分隔符,
字符串输入时以空格或回车结束。
例 2.29?scanf函数使用说明举例三。
#include<stdio.h>
main()
{ int a,b,c,d;
printf("Please enter four number:\n");
scanf("%d%d",&a,&b);
/*输入两个数存放到变量 a,b中 */
scanf("%d%d",&c,&d);
/*输入两个数存放到变量 c,d中 */
printf("The result is:\n");
printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d) ;
}
程序的运行情况为:
Please enter four number:
1?2?3?4↙
The result is:
a=1,b=2,c=3,d=4
Please enter four number:
1,2?3?4↙
The result is:
a=1,b=0,c=64,d=3129
分析:由程序的运行结果可以看出,当输入
,1?2?3?4”时,程序输出了正确的结果。但当输入,1,2?3?4”时,由于用“,”和,?”作了间隔符,
程序输出了错误的结果。
2.6.2单字符输入函数 getchar(),getche()
和 getch()
1,getchar()
2,getche()和 getch()
1.getchar()
getchar()是一个不带参数的输入函数。其功能是从标准输入设备输入一个字符,调用格式为:
getchar();
程序中用到 getchar函数时要在程序的开头部分用以下的命令:
#include<stdio.h> 或 #include"stdio.h"
说明:用 getchar函数从键盘上接收的字符既可以是可打印的字符,也可以是非打印的字符(如换行符等),但从键盘上敲不进去的字符除外。
例 2.30?getchar()函数应用举例。
#include<stdio.h>
main()
{ int ch;
printf("Please enter a character:");
ch=getchar(); /*输入一个字符存放到变量 ch中 */
printf("ch=%d",ch); /*输出变量 ch的内容 */
}
程序的运行情况为:
Please enter a character:c↙
ch=99( 99为字符 c的 ASCII码值)
说明,系统的仿效返回
,系统的仿效返回”是指用户在输入数据时,系统会马上显示出相应的字符,这个字符不是程序的输出,而是系统的仿效返回。一般要在敲一个回车键之后,再次显示的字符才是程序所做的。尽管 getchar()只接收一个字符,但实际上,用户键入回车键以后,系统才开始接收字符。因此运行上述例程时,输入 c↙ 和输入 cdf↙,输出的结果是一样的。
2,getche()和 getch()
getche()和 getch()的功能也是从标准输入设备输入一个字符,与 getchar()不同的是,getchar()输入一个字符后必须按回车键才能被接收;而
getche()和 getch()输入字符后不必按回车键,其中 getch()不回显输入的字符。
getche()和 getch()定义在标题文件,conin.h”中。