1、第三章,基本数据类型、运算符、输入输出函数,1 数据类型,为什么数据要分类 对数据进行分类,以便让计算机进行相应的存储和处理 C语言的基本数据类型有: char(字符型) int (整型) float (实型或浮点型) double(双精度实型),2 常量,概念: 程序运行过程中其值不能被改变的量 常量的分类: 整型常量 实型常量 字符常量 字符串常量 符号常量,整型常量,整型常量即整常数 1.整数 取值范围:一般占一个机器字,字长2字节,取值范围为 -32768 +32767 表示形式:十进制整数 以非0开头的整数八进制整数 以0开头的整数十六进制整数 以0x或0X开头的整数例:-123、4
2、56、0123、-0x123,2. 长整数 取值范围:占四字节2147483648 +2147483647 表示形式:在整数后面加字母L或l例:456l、-0456l、0x456l 3. 关于无符号数 若整数是无符号数,整常量能表示的取值范围将相应的扩大一倍,实型常量,1. 实型常量又称浮点数常量,只使用十进制,有两种表示形式: 定点数形式由正负号、整数部分、小数点、小数部分组成例:0.0、12.34、0.123、.123、-123.0 、-123. 指数形式 由正负号、整数部分、小数点、小数部分、E(e)后带或不带正负号的整数组成合法:1e-5、-3.14157E+7、-28e-005、12
3、3.45E0非法:E8、3E-5.6、.e2、4e、e 2. 实型常量不分单、双精度, 都按双精度double型处理,字符常量,1.字符常量是用一对单引号(作为定界符)括起来的一个字符,字符不能是单引号 、双引号 “ 、反斜杠 。例如:A, a, 5, ?, +, !, $。 2.字符常量具有数值,即其 ASCII 代码值。如: C = A; 与 C = 65; 等价。 3.一种特殊的字符常量转义字符(见表3-1)一对单引号括起来,里面是反斜线开头,后跟一个字符,如n。或反斜线开头,后跟一个一到三位八进制数,或后跟一个一到二位x开头的十六进制数。,常用转义字符,字符串常量,1.字符串常量一对双
4、引号括起来的字符系列。例:“hello!“, “program“, “a“, 123.45“ 2.存储形式字符串中的每个字符占一个字节,在其尾部自动追加一个字符0 。h e l l o ! 0104 101 108 108 111 33 0,符号常量,符号常量即用一个特定的符号来代表一个常量 定义:#define 符号常量 常量(字符串)例: #define R 5.179 符号常量须“先定义,后使用”,一般用大写字母例: #define PRICE 35#define NUM 10#define SUM PRICE*NUMmain ( ) printf(“total=%dn“, SUM);
5、结果:total=350,3 变量,概念: 在程序运行过程中,其值能被改变的量。 对所使用的变量要“先定义、后使用”(使用标识符进行定义),以便编译时为其分配相应的存储单元 。 普通变量定义形式 数据类型 变量名表; 例: int a,b; (定义两个整数) 分类 整型变量、实型变量、字符型变量 变量初始化,C标识符,用来标识变量名、符号常量名、函数名、数组名、文件名的有效字符序列。 标识符必须由字母或下划线开头,后跟字母或下划线或数字,字母区分大小写。 标识符的长度(字符个数)无统一规定,随系统而不同,一般只能识别前8个字符。 选择标识符时,提倡使用有意义的英文单词,注意做到“见名知义” 关
6、键字是由语言规定的具有特定意义的字符串,通常也称为保留字 ,不允许作标识符(见附录),整型变量,数据类型说明符:int,short,long,main() int a,b,s;scanf(“%d %d”, 输入:11 22 输出:33,实型变量,main() float x,y;x=111111.111; y=222222.222;printf(“%fn“,x+y); 运行结果为 333333.328125,数据类型说明符 :float,double,字符型变量, 一个字符变量在内存中占一个字节 将一个字符常量赋值给一个字符变量,实际上是把该字符的 ASCII 代码放到字符变量对应的内存单元中
7、去 字符数据与整型数据的存储形式相类似,可以相互赋值或混合运算,一个字符数据既可以以字符形式输出,也可以整数形式输出.,数据类型说明符:char,例1: main() char a, b;a=a; b=b;printf(“%c %cn“, a, b);printf(“%d %dn“, a, b);例2: main() int a ; char b;a=a; b=98;printf(“%c %cn“, a, b);printf(“%d %dn“, a, b);,运行结果:a b 97 98,变量初始化,定义变量时仅为变量分配内存,并不对这部分内存进行清空操作,分配作变量的内存中的原值被保留,且其
8、值无法确定。因此,变量在参与运算前应初始化,赋予初值,以免产生逻辑错误。 C语言规定,可以在定义变量的同时给变量赋初值。 例如:int a=2,c=3;float pi=3.14;char c1=a,c2=9; 如果要对n个同类型的变量赋相同的初始值,也要分别赋值。 例如: int a=10,b=10,c=10;int a=b=c=10;,错误!,4 运算符和表达式-1,运算符是告诉编译程序执行特定算术或逻辑操作的符号 算术运算符和算术表达式 赋值运算符和赋值表达式 关系运算符和关系表达式 逻辑运算符和逻辑表达式 条件运算符和条件表达式 逗号运算符和逗号表达式,4 运算符和表达式-2,指针运算
9、符* sizeof运算符 位运算符* 不同类型数据之间的转换 运算符优先级和结合性 表达式和表达式语句 (如何按照条件写表达式),4.1算术运算符,1. 加、减、乘、除和取余运算符:+ 、-、*、/、% 除号/- 当两个整型数相除时,结果为整数(商的整数部分)- 当被除数和除数只要有一个是实型数时,结果为实数的商。 取余号 % 只能对整型数运算。 比如取整数的个位数:53%10是3, 取整数的十位数1253/10%10是5,2. 自增、自减运算符:+、- 用法- 前置运算: +或-用在变量之前,先将变量的值增1或减1,再将该变量的新值用于表达式中- 后置运算: +或-用在变量之后,先将变量的值
10、用于表达式中,再将该变量的值增1或减1例: i=5+j-; i=5+-j; 该运算符只能用于变量,不能用于常量和表达式合法:i+; -j; i=(j+)*5;非法:6-; i=(j*5)+;,例1:main() int a=5,c;c = + a; /* a先增1,再运算 */c = c + a +; /* a先运算,再增1 */printf (“a = %d tc = %dn“,a,c); 结果:a = 7 c = 12*例2:执行下列语句后,输出结果是什么?main() int a=10, b=20, c;c=+a+b-;printf( “a=%d,b=%d,c=%d“, a, b, c
11、);,结果:a=11,b=19,c=31,算术表达式,是用算术运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合C语法规则的式子,如:x+ a+ba%bn/100%10,4.2 赋值运算符与赋值表达式,1. 基本赋值运算符: = 由“=”连接的式子称为赋值表达式。其一般形式为:变量=表达式功能是:计算右边表达式的值再赋予左边的变量。 例如:a = 3b = i+ + -jc=sin(x)+sin(y) 赋值运算符具有右结合性。 a=b=c=1 可理解为:a=(b=(c=1),2. 复合赋值运算符:+= 、-= 、*= 、/= 、 %= (算术运算)&= 、|= 、= 、= 、= (位
12、运算) 复合赋值符是在赋值符“=”之前加上其它二目运算符可构成,执行顺序是:先运算,再赋值。 复合赋值表达式的一般形式为:变量 双目运算符 = 表达式 等价于:变量 = 变量 双目运算符 表达式 例如:a+=5 等价于 a=a+5,x %= 8 等价于 x = x % 8n 后,x的值是?,-60,2,例: 复合赋值运算符示例 #include “stdio.h“ main() int a=2, b=3, c=4;a*=b/=c-=a;printf(“%d,%d,%dn“, a, b, c);a-=b*=c+=3;printf(“%d,%d,%dn“, a, b, c);a=b=c=1;c=(
13、a*=2)+(b+=3)+2;printf(“%dn“, c); ,运行结果:2,1,2-3,5,58,4.3 关系运算符和关系表达式,1. 关系运算符(比较运算符)用于比较两个表达式值的大小,有6种: 、= 、 b 的值为0,而 关系表达式 a b 的值为1。,这里的0和1 是逻辑值,它可以作为判断的条件,也可以和其它的关系表达式做逻辑运算(与、或、非等),也可以和其它的算术表达式做算术运算 运用关系表达式时的注意事项 1 关系表达式中字符型数据按其ASCII码值参加比较运算100 30 值为1 2 运算符两边的表达式可以是算术、字符、赋值、关系、或逻辑表达式。例:(a+x)(b+y) (x
14、=4)bc ) y的值为0。,4.4 逻辑运算符和逻辑表达式,逻辑运算符用于对逻辑量进行运算,有3种:逻辑运算符两边的操作数认为是逻辑值。非0为真,0为假。 逻辑表达式的结果也是逻辑值。真为 1,假为0。,运用逻辑表达式的注意事项 判断数值是否为真时,非0代表真,0代表假 逻辑运算符两侧的操作数不仅可以是整数,也可以是其他数据类型,只要该类型的数据值最终能得到0或非0值 逻辑表达式中,不一定对逻辑运算符两侧的表达式都求值 (&、|) 数学上的数值区间不能直接用在C语言的判断条件上 如:数学上的 1x10,不应写成:1x=10;而应写成:(1x)&(x=10),例1:int x, y, z, w
15、;x = y = z = -1;w = (+ + x | + + y) 输出是什么?,注: & 前的操作数值若是假,则后面的表达式无需运算| 前的操作数值若是真,则后面的表达式无需运算,0, 0, -1, 0,4.5 条件运算符和条件表达式,条件运算符(三目运算符) ? : 条件表达式的一般形式: 表达式1 ? 表达式2 : 表达式3 条件表达式求值过程:注:三个表达式的类型可以不同;表达式1要能得到逻辑值;整个表达式值类型取表达式2和表达式3中较高的类型,例1:执行下列程序段后,变量a,b,c的值和 x,y的值分别是什么?int x=10, y=9;int a, b, c;a=(-x=y+)
16、?-x:+y;b=x+;c=y;,8,8,10 9,10,*例2:请写出下列程序的运行结果main() int x=5, y=6;printf(“%dn“,(+x=y+)|(x=8)?-x:-y);printf(“%d,%d“, x, y);,结果:55,7,4.6 逗号运算符和逗号表达式,又称顺序运算符,用于把若干表达式组合成一个表达式,称之为逗号表达式或顺序表达式。如:3+5,7+9 逗号表达式的一般形式: 表达式1, 表达式2, , 表达式n表示由左到右依次计算各表达式之值,逗号表达式之值为表达式n之值。如:a=3*5, a*6 之值为90,4.7 指针运算符*,取址运算符 表示变量x的
17、值赋给指针所指向的变量,指针运算符示例,main ( ) int a=10,b=8,c,d,*p1,*p2;p1 = 详细的用法见指针一章,4.8 sizeof运算符,功能: 用于计算被运算对象所占字节数 使用格式:sizeof( 数据类型 )或 sizeof( 表达式 ) 例如: sizeof(double) 值为8 sizeof(char) 值为1 float f; int i, a10;i=sizeof(f); i的值将为4i=sizeof(a); i的值将为20,4.9 不同数据类型之间的转换,不同数据类型的常量、变量混合运算时,要先转换成同一类型后进行运算。转换方法有两种: 1. 自
18、动转换表达式运算时的转换规则:long double 高double floatunsigned long intlong intunsigned intint char, short int 低,例:10 + a+ i * f - d / eint char float float double long int,int,float,double, 赋值号两边的数据类型不同时的转换规则:赋值号右边的类型转换成左边的类型。当右边的数据类型比左边长时,右边的数据被截取所需的长度。 见示例 2. 强制转换形式: ( 类型名 ) 操作数其中操作数可以是常量、变量或表达式。例: float x;( i
19、nt ) 4.5 / 3 值为1(int)x 取变量x的整数部分x-(int)x 取变量x的小数部分,自动类型转换示例,main() char c;int i;i=11361; /* 0x2c61*/c=i; /* 0010110001100001*/ printf(“%c %d %x“, c, c, c);,运行结果:a 97 61,4.10 运算符的优先级和结合性, 优先级:操作数两边有两个运算符, 首先参加优先级高的运算符一侧的运算。( 附录) 结合性:操作数两侧的运算符优先级相同时,C规定了各种运算符的结合方向,即“自左至右”或“自右至左”。( 附录) 即:运算符的结合性是规定连续几个
20、相同优先级的运算符的计算顺序。结合性为从左到右时,计算就从左到右逐个进行;结合性为从右到左时,计算就从右到左逐个进行。,例1: y = 2 + 3 - 4 * 5 + 65 - 20-15 + 6 -9例2:表达式 a+b+c 等价于 (a+b)+c (左到右)表达式 a=b=c 等价于 a=(b=c) (右到左)表达式 *p+ 等价于 *(p+) (右到左)表达式 *+p 等价于 *(+p) (右到左)表达式 +*p 等价于 +(*p) (右到左),练习:如何用C语言写表达式,逻辑或关系表达式 判断某一年是否是闰年 整数x大于y且小于等于z 一个整数是偶数但不能被3整除 写表达式表示一个字符
21、是一个数字 写表达式表示一个字符是一个字母 数学表达式 写一个表达式使得一个小数x四舍五入 写一个表达式使得一个小数x在小数点后第三位四舍五入 分别写表达式描述一个整数n的个位数、十位数。 写出下面的代数式表达式,表达式:用运算符将运算对象连接起来得式子 表达式语句:表达式以分号结束称为表达式语句,5 输入输出函数,在语言中,所有的数据输入输出都是由库函数完成的。 使用语言库函数时,要用预编译命令#include 将有关“头文件”包括到源文件中。 使用标准输入输出库函数时要用到 “stdio.h“文件,因此源文件开头应有以下预编译命令:#include 或 #include“stdio.h“对
22、于下面介绍的printf和scanf函数,考虑到其使用频繁,系统允许在使用这两个函数时可不加上述预编译命令,5.1 格式输入和输出函数,1. 格式输出函数 printf ( ) 功能:向显示器输出信息 使用形式:printf (“输出格式“, 输出表列); 输出格式可由三部分组成:格式说明、按原样输出的字符、转义字符 输出表列是需要输出的一些数据,可以是表达式例:int a = 123;printf (“a=%dn“, a);,有多个输出数据,则: - 输出表列中各输出间用逗号分隔 - 格式说明与输出数据的个数相同且一一对应,注意左右对齐符号如:int i = -5;float j = 98;
23、printf (“i = %d , j=%-10.2f n“,I , j);printf (“i = %d , j=%10.2f n“,I , j);输出为:i = -5, j=98.00 i = -5, j=98.00,例1: main ( ) int a = 345, b = -1;float v=3.1.415;float u=3.1416;printf (“a = %d, %x, %o n“, a, a, a );printf (“b = %u n“, b );printf(“%.3f,%6.3f,%-6.3f”,v,v,v,v);printf(“%f,%.3f,%6.3f,%-6.3
24、f”,u,u,u,u); 结果为:a = 345, 159, 531b = 655353.141, 3.141,3.1413.141600,3.142, 3.142,3.142 /*进位问题*/,例2:main ( ) printf (“%3s,%7.2s,%.4s,%-5.3sn“, “CHINA“,“CHINA“, “CHINA“, “CHINA“ );结果为:CHINA, CH,CHIN,CHI说明:当指定的输出宽度小于输出值本身宽度时,则指定的输出宽度不起作用,比如上面%3s的格式规定,但仍然输出字符串CHINA,2. 格式输入函数 scanf( ) 功能:从键盘接受输入信息 使用形式
25、:scanf(“输入格式“ ,地址表列); 输入格式可由二部分组成:格式说明、按原样输入的字符格式说明和输出函数中的输出格式相似。 地址表列由需输入的变量的地址,或字符串首地址列表组成。如: int i;scanf (“%d“,运行时输入:14 , 有多个数据输入,则:写语句时:- 地址表列中各输入变量间用逗号分隔- 格式说明与输入变量的个数相同且一一对应- 执行输入语句需要输入数据时:数据之间以一个或多个空格分隔比如:int i, j;scanf (“%d%d“, 运行时输入:a = 3, b = 4 , 用“%c“格式输入字符,则空格和转义字符都作为有效字符输入如: scanf (“%c%
26、c%c“, 不允许。 下面情形之一发生时scanf语句对当前变量的读操作结束 1 遇到空格,回车或制表键 2 宽度限制 3 不合法不匹配的输入 不合法不匹配的输入将导致不正确的结果,例1:假设输入 12345,abc,写出下面程序的运行结果 main() int a;char ch;scanf(“%3d%3c”, 若输入 2223a123o.12, 那么a,b,c的值分别是什么 ? 若输入a2223asdf34, 那a,b,c的值又分别是什么?,123,4,2223,a,123.000123,5.2 字符输入输出函数,1. 字符输出函数 putchar ( ) 常用形式: putchar (c
27、)c可以是字符型和整型量,包括转义字符。 功能:向终端(显示器)输出一个字符。 如: #include “stdio.h“main ( ) char a;a= b;putchar(65); putchar(n); putchar(a);结果: Ab,2. 字符输入函数 getchar( ) 常用形式: getchar ( ) 功能:从终端(或系统隐含指定的输入设备)输入一个字符例:从键盘输入一个小写字母,转换为大写字母输出。main() char c;printf(“Enter character:“);c=getchar( );putchar(c-32);,补:位运算符(第十章),输出格式说
28、明,1. 输出格式说明由%后跟一个格式字符组成: %d 以十进制整数的实际长度输出 %f 以十进制实数形式输出, 小数部分6位 %c 输出单一字符 %s 输出字符串 % 输出一个百分号 %x 以十六进制无符号形式输出整数 %o 以八进制无符号形式输出整数 %u 以十进制无符号形式输出整数 %e 以指数形式输出实数 %g 选用%f和%e中输出宽度较短的一种格式,2. 输出格式选择项 + 结果右对齐 - 结果左对齐 0 用于输出数值,不用位置填0 (缺省填空格) m 指定输出宽度(列数) .n 对实数,表示输出n位小数对字符串,表示从左端截取的字符个数 l 用于输出长整型、双精度型 L 用于输出长
29、双精度型,输入格式说明,1. 输入格式说明由%后跟一个格式字符组成: %d 用于输入十进制整数 %x 用于输入十六进制整数 %o 用于输入八进制整数 %c 用于输入单个字符 %s 用于输入字符串,以非空白字符开始,空白字符结束 %f 用于输入实数,可用小数或指数形式,2. 输入格式选择项 l 用于输入双精度型、长整型 L 用于输入长双精度型 m 指定输入数据所占宽度(列数) * 指定输入项在读入后不赋给相应的变量,课后复习关键字,常量(整型,实型,字符型,字符串) 变量 变量定义关键词: int, long, float, char, double 运算符 重点:算术,逻辑,关系,条件 输入输出函数 printf(),scanf() putchar(),getchar(),