3 数据类型、运算符 和表达式
3.1 引言 3.2 对象、变量和常量的概念 3.3 整型数据 3.4 浮点型数据 3.5 字符型数据 3.6 void数据类型 3.7 表达式和运算符 3.8 不同类型数据间的转换 3.9 基本输入输出
3.1 引言 数据类型 C 数 据 类 型 基本类型 构造类型 指针类型 空类型void 定义类型typedef 字符类型char 枚举类型enum 整 型 实型 单精度型float 双精度型double 数组 结构体struct 共用体union 短整型short 长整型long 整型int 数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作
3.2 对象、变量和常量 对象:一块连续的内存区域,其内容可以用来表示某个数据 常量:程序运行期间,其值不能或不允许被改变的数据对象 变量:程序运行期间,其值可以改变的数据对象 (变量由名字、值和类型三个属性)
sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 标识符 定义:用来标识变量、常量、函数等的字符序列 组成: 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 大小写敏感 不能使用关键字 长度:最长32个字符 命名原则: 见名知意 不宜混淆 如l与I, o与0 例:判断下列标识符号合法性 sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char a>b _above $123 M.D.John 3days #33 char a>b $123
3.3 整型数据 C语言按整型数据的取值范围将其分为三种: 1、基本整形int 2、短整型short int ( 可简写为short ) 3、长整型long int ( 可简写为long ) 每种都可以分为有符号 ( signed ) 和无符号 ( unsigned )
说明: 数据类型所占字节数可能随系统环境不同而不同 符号 关键字 数的表示范围 所占位数 (signed) int 32 -2147483648 2147483647 有 (signed) short 16 -32768 - 32767 (signed) long 32 -2147483648 - 2147483647 整型 unsigned int 32 0 - 4294967295 无 unsigned short 16 0 - 65535 unsigned long 32 0 - 4294967295 有 float 32 4.4e-384.4e38 实型 有 double 64 1.7e~308 - 1.7e~308 字符型 有 char 8 -128 - 127 无 unsigned char 8 0 - 255 说明: 数据类型所占字节数可能随系统环境不同而不同
例 溢出情况举例 #include<stdio.h> main() { short i=-20000; unsigned short x=65535,y; i=i*2; x=x+2; y=-20000; printf(“i=%d, x=%u, y=%u\n”,i,x,y); }
-20000的补码 相当于不带符号数字的多少? i=i*2 相当于将二进制状态下的i左移一位 unsigned short x=65535 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 -20000的补码 相当于不带符号数字的多少? i=i*2 相当于将二进制状态下的i左移一位 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 1 unsigned short x=65535 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 x=x+2 1
整型常量(整常数) 三种形式: 问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10 问题: 十进制整数:由数字0~9和正负号表示.如 123,-456,0 八进制整数:由数字0开头,后跟数字0~7表示.如0123,011 十六进制整数:由0x开头,后跟0~9,a~f,A~F表示.如0x123,0Xff 问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10 83 291 255 问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10 整型常量的类型 根据其值所在范围确定其数据类型 在整常量后加字母l或L,认为它是long int 型常量 例 30000 为int型 65536 为long int 型 例 12 与 12L
01 11 11 11 11 11 11 11 int型: 最大:32767 10 00 00 00 00 00 00 00 最小:-32768 11 11 11 11 11 11 11 11 unsigned int型: 最大:65535 00 00 00 00 00 00 00 00 最小:0
3.4 浮点型数据 C语言提供了以下三种浮点数据类型: 1、单精度浮点型 float 2、双精度浮点型 double 3、长双精度浮点型 long double 传统C中,在进行浮点运算时,float型会自动转换成double型然后进行计算。在标准C中,float型可以直接进行计算。
实型常量(实数或浮点数) 表示形式: 实型常量的类型 十进制数形式:(必须有小数点) 如0.123, .123, 124.0, 0.0, 124. 指数形式:(e或E之前必须有数字;指数必须为整数)如12.3e3 ,123E2, 1.23e4 , e-5 , 1.2E-4.5 实型常量的类型 默认double(双精度)型 在实型常量后加字母f或F,认为它是float(单精度)型 长双精度long double
浮点表示: 把一个数的有效数字和数的范围在计算机的一个存储单元中分别予以表示,这种把数的范围和精度分别表示的方法,相当于数的小数点位置随比例因子的不同而在一定范围内自由浮动,称为浮点表示法。 任意一个十进制数N 可以写成 N=Sx10e 同样在计算机中一个任意进制数N 可以写成 N=SxRe
例: N=11.0101 =0.110101x210 =1.10101x21 =1101.01x2-10 =0.00110101x2100 为了提高数据精度以及便于浮点数间的比较计算,在计算机中规定浮点数的尾数用纯小数 表示,此外,将尾数最高位为1的浮点数称为规格化数,即N=0.110101x210为规格化形 式,此时精度最高。 一个机器浮点数由阶码和尾数及其符号位组成 尾数:用定点小数表示,给出有效数字的位数决定了浮点数的表示精度; 阶码:用整数形式表示,指明小数点在数据中的位置,决定了浮点数的表示范围。
例:将十进制数0.1015625写成二进制定点数和浮点数(数值部分10位, 阶码部分取4位,阶符和数符各取1位),分别写出它在定点机和浮点机 中的机器数形式。 二进制: x=0.0001101000 定点数: x=0.0001101000 浮点数规格化: x=0.1101000000x2-11
3.5 字符型数据 C语言提供了以下三种浮点数据类型: 1、单精度浮点型 float 2、双精度浮点型 double 3、长双精度浮点型 long double 传统C中,在进行浮点运算时,float型会自动转换成double型然后进行计算。在标准C中,float型可以直接进行计算。
字符常量 定义:用单引号括起来的单个普通字符或转义字符. 字符常量的值:该字符的ASCII码值 如 'a' 'A' '?' '\n' '\101' 转义字符:反斜线后面跟一个字符或一个代码值表示 'A' - 65 'a' - 97 '0' - 48 '\n' - 10 < 转义字符及其含义: 转义字符 含义 \n \v \r \a \' \ddd \t \b \f \\ \'' \xhh 换行 垂直制表 回车 响铃 单引号 3位8进制数代表的字符 水平制表 退格 换页 反斜线 双引号 2位16进制数代表的字符 例 转义字符举例 main() { printf("\101 \x42 C\n"); printf("I say:\"How are you?\"\n"); printf("\\C Program\\\n"); printf("Turbo \'C\'"); } '\101' -----------'A' '\012' -----------'\n' '\376' -----------'' '\x61' -----------'a' '\60' -----------'0' '\483' ----------() 'A'-------'\101'-------'\x41'--------65 运行结果:(屏幕显示) A B C Isay:”How are you?” \C Program\ Turbo ‘C’ 例 main() { printf(“Y\b=\n”); } 运行结果: 屏幕显示:= 打印机输出:¥
字符串常量 ''a'' a \0 定义:用双引号“ ”括起来的字符序列. 存储:每个字符串尾自动加一个 '\0' 作为字符串结束标志. h e l l o \0 例 字符串“hello”在内存中 例 空串 “” \0 字符常量与字符串常量不同 a a \0 例 'a' ''a'' 例: char ch; ch='A'; 例: char ch; ch=''A'';
3.6 void数据类型 void类型又称空类型,不包含任何值或操作,不能用来定义普通变量,但可用来定义指针型变量,主要作用是: 1、函数定义或声明中表示没有返回值的函数(详见第6章) 2、用在类型转换表达式中,显式的表示丢弃一个值 (void)getchar(); //执行时getchar()丢弃它的返回值 (void)(3.5+4.6*5.12) //丢弃表达式的值,合法但无实际意义 3、形成void *类型,用来定义无类型指针(详见第8章) 4、在函数定义或声明中代替形参列表,表示该函数不接受任何参数 int PrintLine(void);
C 运 算 符 3.7 表达式和运算符 算术运算符: + - * / % ++ -- 3.7 表达式和运算符 C 运 算 符 算术运算符: + - * / % ++ -- 关系运算符: < <= == > >= != 逻辑运算符: ! && || 位运算符 : << >> ~ | ^ & 赋值运算符: = 及其扩展 条件运算符: ? : 逗号运算符: , 指针运算符: * & 求字节数 : sizeof 强制类型转换:(类型) 分量运算符: . -> 下标运算符: [ ] 其它 : ( ) -
学习运算符应注意: 运算符功能 与运算量关系 要求运算量个数:单目、双目、三目 要求运算量类型:整型、浮点型 运算符优先级别 x=1+2*3 结合方向 3+5-2+6 a=b=c=2+3 结果的类型
算术运算符和表达式 例 5%2 = 1 -5%2 = -1 1%10 = 1 5%1 = 0 5.5%2 例 5%2 = -5%2 = 基本算术运算符: + - * / % 结合方向:从左向右 优先级: - ---->* / % -----> + - (2) (3) (4) 说明: '-'为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据 例 5%2 = 1 -5%2 = -1 1%10 = 1 5%1 = 0 5.5%2 例 5%2 = -5%2 = 1%10 = 5%1 = 5.5%2 例 5/2 = -5/2.0 = 例 5/2 = 2 -5/2.0 = 2.5
j=3; k=j++; j=3; printf(“%d”,++j); j=3; printf(“%d”,j++); 自增、自减运算符++ -- 作用:使变量值加1或减1 种类: 前置 ++i, --i (先执行i+1或i-1,再使用i值) 后置 i++,i-- (先使用i值,再执行i+1或i-1) 例 j=3; k=++j; j=3; k=j++; j=3; printf(“%d”,++j); j=3; printf(“%d”,j++); a=3;b=5;c=(++a)*b; a=3;b=5;c=(a++)*b; //k=4,j=4 //k=3,j=4 //4 //3 //c=20,a=4 //c=15,a=4
#include<stdio.h> main() { 自增、自减运算符++ -- 作用:使变量值加1或减1 种类: 前置 ++i, --i (先执行i+1或i-1,再使用i值) 后置 i++,i-- (先使用i值,再执行i+1或i-1) #include<stdio.h> main() { int i=3,j; printf("j=%d\n",j=i+++i+++i++); printf("i=%d\n",i); } 说明: ++ -- 不能用于常量和表达式,如5++,(a+b)++ ++ --结合方向: 自右向左 优先级:- ++ -- ------>* / % ----->+ - (2) (3) (4) 例 -i++ -(i++) i=3; printf(“%d”,-i++); //-3 例 j+++k; (j++)+k;
赋值运算符和表达式 复合赋值运算符 a+=3 a=a+3 x*=y+8 x=x*(y+8) x%=3 x=x%3 简单赋值运算符 符号:= 格式:变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量 例 a=3; d=func(); c=d+2; 复合赋值运算符 种类:+= -= *= /= %= 《= 》= &= ^= |= 含义: exp1 op= exp2 exp1 = exp1 op exp2 a+=3 a=a+3 x*=y+8 x=x*(y+8) x%=3 x=x%3
赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型 a+b=3; 说明: 结合方向:自右向左 优先级: 14 左侧必须是变量,不能是常量或表达式 赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型 例 3=x-2*y; a+b=3; 例 int i; i=2.56; //结果i=2; 例 float f; int i; i=10; f=i; 则 f=10.0 赋值表达式的值与变量值相等,且可嵌套 例: a=b=c=5 a=(b=5) a=5+(c=6) a=(b=4)+(c=6) a=(b=10)/(c=2) //表达式值为5,a,b,c值为5 // b=5;a=5 //表达式值11,c=6,a=11 //表达式值10,a=10,b=4,c=6 //表达式值5,a=5,b=10,c=2
说明: 结合方向:自右向左 优先级: 12 左侧必须是变量,不能是常量或表达式 赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型 优先级: 12 左侧必须是变量,不能是常量或表达式 赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型 赋值表达式的值与变量值相等,且可嵌套 例: a=12; a+=a-=a*a //a=-264 等价于a=a+(a=a-(a*a)) 例: int a=2; a%=4-1; a+=a*=a-=a*=3; //a=0 等价于a=a+(a=a*(a=a-(a=a*3)))
逗号运算符和表达式 例 a=3*5,a*4 //a=15,表达式值60 a=3*5,a*4,a+5 例 x=(a=3,6*3) 形式:表达式1,表达式2,……表达式n 结合性:从左向右 优先级: 15 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中 例 a=3*5,a*4 a=3*5,a*4,a+5 例 x=(a=3,6*3) x=a=3,6*a 例 a=1;b=2;c=3; printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c); //a=15,表达式值60 //a=15,表达式值20 //赋值表达式,表达式值18,x=18 //逗号表达式,表达式值18,x=3 //1,2,3 //3,2,3
#include <stdio.h> main() { int x,y=7; float z=4; x=(y=y+6,y/z); 逗号运算符和表达式 形式:表达式1,表达式2,……表达式n 结合性:从左向右 优先级: 15 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中 #include <stdio.h> main() { int x,y=7; float z=4; x=(y=y+6,y/z); printf("x=%d\n",x); } 运行结果:x=3
关系运算符和表达式 关系运算符 < 种类:< <= == >= > != <= > 种类:< <= == >= > != 结合方向:自左向右 优先级别: < <= > >= == != 优先级6(高) 优先级7(低) c>a+b //c>(a+b) a>b!=c //(a>b)!=c a==b<c //a==(b<c) a=b>c //a=(b>c) 关系表达式的值:是逻辑值“真”或“假”,用1和0表示 例 int a=3,b=2,c=1,d,f; a>b (a>b)==c b+c<a d=a>b f=a>b>c //表达式值1 //表达式值1 //表达式值0 //d=1 //f=0
关系运算注意: 例 若a=0; b=0.5; x=0.3; 则 a<=x<=b的值为0 例 int i=1, j=7,a; a=i+(j%4!=0); 则 a= 2 例 5>2>7>8在C中是允许的,值为0 例 'a'>0 结果为 1 'A'>100 结果为 0
可改写为:fabs(1.0/4.0*4.0-1.0)<1e-6 关系运算注意: 例 应避免对实数作相等或不等的判断 如 1.0/4.0*4.0==1.0 结果为0 可改写为:fabs(1.0/4.0*4.0-1.0)<1e-6 例 注意区分“=”与“==” int a=0,b=1; if(a=b) printf(“a equal to b”); else printf(“a not equal to b”);
逻辑运算符和表达式 逻辑运算符 种类: ! && || 逻辑运算真值表 a b !a !b a&&b a||b C语言中 种类: ! && || 逻辑运算真值表 a b !a !b a&&b a||b 真 假 假 真 假 真 真 假 真 假 C语言中 运算量: 0表示“假” 非0表示“真” 运算结果: 0表示“假” 1表示“真”
// (a<=x) && (x<=b) 优先级: ! (2) && (11) || (12) 高 低 结合方向: ! :从右向左 && :从左向右 || :从左向右 例 a<=x && x<=b a>b&&x>y a==b||x==y !a||a>b // (a<=x) && (x<=b) //(a>b)&&(x>y) //(a==b)||(x==y) //(!a)||(a>b)
优先级: 结合方向: ! (2) ! :从右向左 && (11) && :从左向右 || (12) || :从左向右 例 a=4;b=5; ! (2) && (11) || (12) 高 低 结合方向: ! :从右向左 && :从左向右 || :从左向右 例 a=4;b=5; !a a&&b a||b !a||b 4&&0||2 5>3&&2||8<4-!0 'c'&&'d' 值为0 值为1 值为1 值为1 值为1 //(5>3)&&2||(8<(4-(!0))) 值为1 值为1
优先级: 结合方向: ! (2) ! :从右向左 && (11) && :从左向右 || (12) || :从左向右 高 低 ! (2) && (11) || (12) 高 低 结合方向: ! :从右向左 && :从左向右 || :从左向右 短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符 例 a&&b&&c //只在a为真时,才判别b的值; 只在a、b都为真时,才判别c的值 例 a||b||c //只在a为假时,才判别b的值; 只在a、b都为假时,才判别c的值 例 a=1;b=2;c=3;d=4;m=1;n=1; (m=a>b)&&(n=c>d) //结果m=0,n=1
条件运算符与表达式 一般形式: expr1 ? expr2 : expr3 执行过程 功能:相当于条件语句,但不能取代一般if语句 非0 =0 例 if (a>b) printf(''%d'',a); else printf(''%d'',b); printf(''%d'',a>b?a:b); 例 求 a+|b| printf(''a+|b|=%d\n'',b>0?a+b:a-b); 例 (a==b)?'Y':'N' (x%2==1)?1:0 (x>=0)?x:-x (c>='a' && c<='z')?c-'a'+'A':c 条件运算符可嵌套 如 x>0?1:(x<0?-1:0) 优先级: 13 结合方向:自右向左 如 a>b?a:c>d?c:d a>b?a:(c>d?c:d) expr1、expr2、expr3类型可不同,表达式值取较高的类型 例 x?'a':'b' //x=0,表达式值为'b' ; x‡0,表达式值为'a' x>y?1:1.5 //x>y,值为1.0 ; x<y,值为1.5
main( ) { int x,a; x=(a=3*5,a*4,a+5); printf(“x=%d,a=%d\n”,x,a); } main( ) { int x,a; x=(a=3*5,a*4),a+5; printf(“x=%d,a=%d\n”,x,a); } 运算结果:x=20,a=15 运算结果:x=60,a=15 运算结果:a=8,b=16,x=24 【例三】main() { int a,b,x; x=(a=8,b=15,b++,a+b); printf(“a=%d,b=%d,x=%d\n”,a,b,x);}
main( ) { int m=5; if (m++>5) printf(“m>5”); else printf(“m=%d”,m--); } main( ) { int m=5; if (++m>5) printf(“m>5”); else printf(“m=%d”,m--); } 运算结果: m=6,m=5 运算结果: m>5
main( ) { int a=1,b=2,m=2,n=2; (m=a>b)&&++n; printf("%d\n",n); } main( ) { int a=1,b=2,m=2,n=2; (m=b>a)&&++n; printf("%d\n",n); } 运行结果:n=2 运行结果:n=3 有以下程序段: int a,b,c; a=b=c=1; ++a||++b&&++c; 问执行后a、b、c的值各是多少? a=2,b=1,c=1
3.8 不同类型数据间的转换 隐式转换 什么情况下发生 运算转换规则:不同类型数据运算时先自动转换成同一类型 隐式转换 什么情况下发生 运算转换------不同类型数据混合运算时 赋值转换------把一个值赋给与其类型不同的变量时 输出转换------输出时转换成指定的输出格式 函数调用转换------实参与形参类型不一致时转换 运算转换规则:不同类型数据运算时先自动转换成同一类型
double float long unsigned int char;short 低 高 说明: 必定的转换 运算对象类型不同时转换 10+‘a’ +i * f - d / l 例 int i; float f; double d; long l; 例 char ch; int i; float f; double d; ch/i + f*d - (f+i) int double int double
printf(“x=%f,i=%d”,x,i); } 显式转换(强制转换) 一般形式:(类型名)(表达式) 例 (int)(x+y) (int)x+y (double)(3/2) (int)4.6 说明:强制转换得到所需类型的中间变量,原变量类型不变 例 main() { float x; int i; x=4.6; i=(int)x; printf(“x=%f,i=%d”,x,i); } 结果:x=4.600000,i=4 较高类型向较低类型转换时可能发生 精度损失问题
例 #include<stdio.h> main() { int a=-1; unsigned int b=1; if(a>b) printf("a>b\n"); else printf("a<b\n"); }
printf(“data=%f\n”,data); } main() { int a,b=2; float data; a=1; 变量 概念:其值可以改变的量 变量名与变量值 变量定义的一般格式: 数据类型 变量1[,变量2,…,变量n]; 编译程序根据变量定义为其 分配指定字节的内存单元 …... 地址 int a=1, b=-3,c; a b c 4字节 内存 1 -3 随机数 变量初始化:定义时赋初值 例: int a,b,c; float data; 例: int a=2,b,c=4; float data=4.67; char ch=‘A’; int x=1,y=1,z=1; int x=y=z=1; 决定分配字节数 和数的表示范围 合法标识符 变量的使用:先定义,后使用 变量定义位置:一般放在函数开头 main() { int a,b=2; a=1; float data; data=(a+b)*1.2; printf(“data=%f\n”,data); } main() { int a,b=2; float data; a=1; data=(a+b)*1.2; printf(“data=%f\n”,data); } 变量定义 可执行语句 例 int student; stadent=19; //Undefined symbol ‘statent’ in function main 例 float a,b,c; c=a%b; //Illegal use of floating point in function main
3.9基本输入输出 C语言无I/O语句,I/O操作由函数实现 #include <stdio.h> 字符输出函数 格式: putchar( c ) 参数: c为字符常量、变量或表达式 功能:把字符c输出到显示器上 返值:正常,为显示的代码值;出错,为EOF(-1)
#include <stdio.h> main() { int c; char a; c=65; a='B'; putchar(c); putchar('\n'); putchar(a); } 运行结果:A B
格式输出函数 格式: printf( “……”,输出项1,输出项2,… ,输出项n ); 例:printf( “x=%d,y=%f\n” , x , x+3 ); 格式控制 (转换控制字符串) 输出表列 (用逗号分隔的数据组,可选项) 格式控制分为两个部分: 格式说明—%+格式字符 (替换输出) 普通字符—原样输出(转义字符按表输出)
格式字符: d,i x,X o u c s e,E f g %% 十六进制无符号整数 不带符号十进制整数 十进制整数 指数形式浮点小数 单一字符 字符串 八进制无符号整数 小数形式浮点小数 e和f中较短一种 百分号本身 int a=567;printf ( “%d”,a); 567 int a=255;printf(“%x”,a); ff int a=65;printf(“%o”,a); 101 int a=567;printf(“%u”,a); 567 char a=65;printf(“%c”,a); A printf(“%s”,“ABC”); ABC float a=567.789;printf(“%e”,a); 5.677890e+02 float a=567.789;printf(“%f”,a); 567.789000 float a=567.789;printf(“%g”,a); 567.789 printf(“%%”); % 说明 格式字符要用小写 格式字符与输出项个数应相同,按先后顺序一一对应 输出转换:格式字符与输出项类型不一致,自动按指定格式输出
例 int a=3,b=4; printf(“%d %d\n”,a,b); printf(“a=%d , b=%d\n”,a,b); 输出结果: 3 4 a=3, b=4 例 main() { unsigned int u=0xffffffff; printf(”u=%d\n",u); } 输出结果:u=-1
附加格式说明符(修饰符) .n 对实数,指定小数点后位数(四舍五入) 对字符串,指定实际输出位数 修饰符 功 能 m 输出数据域宽,数据长度<m,左补空格;否则按实际输出 输出数据在域内左对齐(缺省右对齐) - 指定在有符号数的正数前显示正号(+) + 输出数值时指定左面不使用的空位置自动填0 在八进制和十六进制数前显示前导0,0x # 在d,o,x,u前,指定输出精度为long型 在e,f,g前,指定输出精度为double型 l
例 m.n 例 int a=1234; float f=123.456; char ch=‘a’; printf(“%8d,%2d\n”,a,a); printf(“%f,%8f,%8.1f,%.2f,%.2e\n”,f,f,f,f,f); printf(“%3c\n”,ch); 运行 1234,1234 结果: 123.456000,123.456000, 123.5,123.46,1.23e+02 a 例 char a[ ]=“Hello,world!” printf(“%s\n%15s\n%10.5s\n%2.5s\n%.3s\n”,a,a,a,a,a); 运行结果:Hello,world! Hello,world! Hello Hello Hel
例 int a=1234; float f=123.456; static char c[]=“Hello,world!”; printf(“%8d,%-8d\n”,a,a); printf(“%10.2f,%-10.1f\n”,f,f); printf(“%10.5s,%-10.3s\n”,c,c); 1234,1234 123.46,123.5 Hello,Hel
数据输入 字符输入函数 格式:getchar( ) 功能:从键盘读一字符 返值:正常,返回读取的代码值;出错,返回EOF(-1) 例 #include <stdio.h> main() { int c; printf("Enter a character:"); c=getchar(); printf("%c--->hex%x\n",c,c); } 运行结果: Enter a character:A A--->hex41
scanf( “……”,&变量名1,&变量名2,… , &变量名n ); 格式输入函数 格式输入函数scanf() 格式: scanf( “……”,&变量名1,&变量名2,… , &变量名n ); 例: scanf(“ %d,%d,%d ” , &a, &b, &c ); 格式控制 (转换控制字符串) 地址表列 (简单变量要用&开头) 格式说明的一般形式: % * m l (或h) 格式字符 & —求地址的运算符 &a 表示该变量所占空间的首地址 * —抑制字符(“虚读”,即读入数据后不送给任何变量)
附加格式说明符(修饰符) l 修饰符 功 能 h m * 用于d,o,x前,指定输入为short型整数 功 能 h m * 用于d,o,x前,指定输入为short型整数 用于d,o,x前,指定输入为long型整数 用于e,f前,指定输入为double型实数 指定输入数据宽度,遇空格或不可转换字符则结束 抑制符,指定输入项读入后不赋给变量 例 scanf(“%3c%2c”,&c1,&c2); 输入 abcde 则 'a'c1, 'd'c2 例 scanf(“%2d%*3d%2d”,&a,&b); 输入 1234567 则 12a, 67b 例 scanf(“%4d%2d%2d”,&yy,&mm,&dd); 输入 19991015 则 1999yy, 10 mm, 15 dd 例 scanf(“%3d%*4d%f”,&k,&f); 输入 12345678765.43 则 123k, 8765.43f
输入分隔符的指定 一般以空格、TAB或回车键作为分隔符 其它字符做分隔符:格式串中两个格式符间字符 例 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); 输入 a=12,b=24,c=36 例 scanf(“%d:%d:%d”,&h,&m,&s); 输入 12:30:45 则 12 h, 30 m, 45 s 例 scanf(“%d%o%x”,&a,&b,&c); printf(“a=%d,b=%d,c=%d\n”,a,b,c); 输入 123 123 123 输出 a=123,b=83,c=291 例 scanf(“%d,%d”,&a,&b) 输入 3,4 则 3a, 4 b
说明: 用“%c”格式符时,空格和转义字符作为有效字符输入 如 scanf(“%c%c%c”,&c1,&c2,&c3); 若输入 abc 则 ac1, c2, b c3 输入数据时,遇以下情况认为该数据结束: 遇空格、TAB、或回车 遇宽度结束 遇非法输入 如 scanf(“%d%c%f”,&a,&b,&c); 若输入 1234a123o.26 则 1234 a, 'a' b, 123 c 例 int x; char ch; scanf(“%d”,&x); scanf(“ %c”,&ch); 或 scanf(“%*c%c”,&ch); 例 int x; char ch; scanf(“%d”,&x); scanf(“%c”,&ch); printf(“x=%d,ch=%d\n”,x,ch); 执行: 123 输出: x=123,ch=10 例 int x; char ch; scanf(“%d”,&x); ch=getchar(); printf(“x=%d,ch=%d\n”,x,ch); 执行: 123 输出: x=123,ch=10 输入函数留下的“垃圾”: 解决方法: (1)用getchar()清除 (2)用函数fflush(stdin)清除全部剩余内容 (3) 用格式串中空格或“%*c”来“吃掉”
#include <stdio.h> main() { char c1,c2,c3,c4; scanf("%c%c",&c1,&c2); getchar(); c3=getchar(); c4=getchar(); printf("%c %c %c %c\n",c1,c2,c3,c4); printf(“%c,%d\n",c1,c1); printf("%d,%d\n",sizeof(c1),sizeof("1234")); } 输入:12 1234
#include<stdio.h> main() { char c; c=getchar(); while(c!=EOF){ putchar(c); }
程序举例 输入三角形边长,求面积 #include <math.h> #include <stdio.h> 程序举例 输入三角形边长,求面积 #include <math.h> #include <stdio.h> main() { float a,b,c,s,area; scanf("%f,%f,%f",&a,&b,&c); s=1.0/2*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("a=%7.2f, b=%7.2f, c=%7.2f, s=%7.2f\n",a,b,c,s); printf("area=%7.2f\n",area); } 文件包含预处理命令 变量定义 输入数据 输出数据 输入: 3,4,6 输出: a= 3.00, b= 5.00, c= 6.00 s= 6.50 area= 5.33
例 从键盘输入大写字母,用小写字母输出 #include "stdio.h" main() { char c1,c2; 例 从键盘输入大写字母,用小写字母输出 #include "stdio.h" main() { char c1,c2; c1=getchar(); printf("%c,%d\n",c1,c1); c2=c1+32; printf("%c,%d\n",c2,c2); } 输入:A 输出:A,65 a,97