§ 一.C语句概述
§ C语句是用来完成一定的操作任务的,它有着可执行的特征。所以,C程序中的声明部分从该角度讲,不称为语句。声明实际上完成的是数据的描述,而对数据的加工是由语句来实现的。
C语句可分为以下5类:
1.控制语句,用于控制程序执行的流程或顺序,它是C语言中预定义的语句。
§ 条件控制语句:分支控制语句-if语句、if……else if……
§ 循环控制语句:for语句、do……while……语句、while语句
§ 开关语句-switch语句
§ 无条件控制语句:continue语句、break语句、return语句、goto语句
2.函数调用语句:由一次函数调用加分号构成。
函数名([实参列表]);
3.表达式语句:由一个表达式加分号构成。
表达式;
4.空语句:独立的分号便是空语句,表达的是空操作。
5.复合语句:用一对花括号括起来的语句序列,在逻辑上可看成一个语句,又称为分程序。
二.C中输入输出操作的实现
1.输入的概念
将数据通过输入设备(键盘、磁盘文件等)送入计算机内存单元(变量、数组元素)的过程。也就是说,在C中,输入具体有键盘输入、文件输入等。
2.输出的概念
将数据从内存单元(变量、数组元素)读出送到输出设备(显示器、磁盘文件等)的过程。也就说,在C中,输出具体有屏幕输出、文件输出等。
3.输入输出在C中的实现
C语言没有专门的输入输出语句,输入输出的实现是通过函数的调用实现的。在C语言函数库中提供了“标准输入输出函数”,它是以标准的输入输出设备为输入输出的对象。这些函数包括:
putchar(输出字符)、getchar(输入字符)
printf(格式输出)、scanf(格式输入)
puts(输出字符串)、gets(输入字符串)等。
值得说明的另一个问题是,在调用这些库函数时,要使用预编译命令将有关的“头文件”包括到用户源文件中。调用标准输入输出库函数时,文件的开头应有以下预编译命令:
#include<stdio.h> 或 #include “stdio.h”
三.字符数据的输入及输出
1.putchar()函数
§ 原型:int putchar(int ch)
§ 功能:以字符的形式在屏幕上显示ch的值。ch可以字符变量、整型变量、字符常量、整型常量,也可是相应的表达式。该函数的返回值为输出字符的ASCII码值。
2.getchar()函数
§ 原型:int getchar()
§ 功能:接收从键盘上输入的任何一个字符,可理解为该函数的值就是从键盘上得到字符的ASCII码值。
§ 说明:该函数只能接收一个字符,getchar()函数得到的字符可以赋给一个字符变量或整型变量,也可不赋给任何变量,而作为表达式的一部分。
考虑:若键盘上输入a↙b↙c↙,将a、b、c这三个字符分别送入c1、c2、c3三个变量中,对应的getchar()调用语句应是什么。
四.格式输入输出
1.格式输出函数-printf()函数
§ 格式:printf(格式控制串,输出表列)
§ 格式控制串:是用双撇号括起来的字符串,用于控制输出列表在屏幕上输出格式。它包括两种信息。
① 格式说明:由“%”和格式字符组成,其作用是将输出表列中的数据转换为指定的格式输出。如:%d、%s、%f等。
② 普通字符:除格式说明符之外的其它字符,普通字符在格式控制串中,是需要原样输出的字符。如:逗号、空格、换行符等。
输出表列:是需要输出的数据,由常量、变量、函数、表达式所组成,用逗号作为分隔符的表列。如果输出项含有表达式,则表达式的求值顺序按从右向左进行。
实际上,printf()函数的一般形式为:
printf(参数1,参数2,……,参数n)
2.格式字符
⑴ d格式符。
用来输出十进制整数。有以下几种用法:
① %d:按整型数据的实际长度输出。
② %md:m为指定的输出字段的宽度。如数据的位数小于m,则左补空格,若大于m,则按实际大小输出。
③ %ld:输出长整型数据,在其格式符的左面也可加字段宽度修饰。
一个int型数据可以用%d或%ld格式输出。
⑵ o格式符:以八进制数形式输出整数,且为整数在内存中二进制的八进制形式。
⑶ x格式符:以十六进制数形式输出整数,且为整数在内存中二进制的十六进制形式。
⑷ u格式符:用来输出unsigned型数据,以十进制形式输出。一个有符号数也可用%u格式输出,反之亦然,其处理按相互赋值的规则。
⑸ c格式符:用来输出一个字符。整数也可以%c格式输出,字符数据也可用%d格式输出。
⑹ s格式符:用来输出一个字符串,其对应的输出数据要求是字符串的起始地址。有以下几种用法:
① %s:字符串从起始地址开始,直到结束标记结束,按实际输出。
② %ms:输出的字符串占m列。如果串长大于m,则将字符串全部输出;若串长小于m,则左补空格。
③ %-ms:同上,区别在于如果串长小于m,则右补空格。
④ %m.ns:输出占m列,但只取字符串起始位置开始的n个字符。若n<m,则输出左补空格;若n>m,则m不起作用。
⑤ %-m.ns:含义同上,区别就在于,当n<m时,输出右补空格。
⑺ f格式符:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
① %f:整数部分全部输出,并输出6位小数。但并非所有的数字为有效数字。
② %m.nf:指定输出的数据共占m列,小数为n位。如数字长度小于m,则左补空格。
③ %-m.nf:含义同上,区别在于数字长度小于m,则右补空格。
⑻ e格式符:以指数形式输出实数(单、双精度)。可用以下形式:
① %e:系统默认的指数输出形式,以规范化的指数输出。
② %m.ne、%-m.ne:指定输出的数据占m列,尾数的小数位数为n。其它意义同前。
⑼ g格式符:用来输出实数,它根据数值的大小,自动选择f 格式或e格式,且不输出无意义的零。
·小结:
格式符的一般形式为:
§ %[标志字符][宽度][.小数位][F|N|h|l|L]类型字符
§ 说明:除%和类型字符之外,其它项都是可选的。
§ 标志字符:可以是-、+、#或空格。不使用标志时,输出的数据是右对齐的,左补空格,负数之前输出负号,非负数前无符号。其中,-号使输出的数据左对齐,右补空格;+是使输出的非负数之前带有“+”号;标志字符是空格时,使非负数之前输出一个空格,负数之前仍输出负号。
§ 宽度:指定输出数据占用的字符位数,有3种形式:n,0n或*。其中,n是一正整数,用来指定输出的总位数;0n(如08),表示输出数据左边的空位用0补齐;*表示输出的数据用长宽度。
§ 小数位:用于指定输出的最大小数位数。
§ F|N|h|l|L:长度修正符。F、N分别表示远、近指针;h表示短整型;l表示长整型或双精度浮点数;L表示长浮点数(long double)。
§ 类型字符:d、o、x(X)、f、c、e(E)、s、g(G)等。
·说明:
⑴ 务必注意数据类型与格式说明符的匹配,否则就会出现错误。
⑵ 格式说明符若无输出项对应,则输出不确定值。若有输出项,而无格式说明符对应,则无相应的数据输出。
⑶ 除了X、E、G外,其它格式字符必须用小写字母。
⑶ 如果要输出字符“%”,则在格式控制串中用连续的两个%表示。
⑷ 该函数具有int型的返回值,该值为成功输出的数据个数。
[例1] 有关下述语句输出的判断中,正确的是( )。
int x=0xaffbc;
printf("%x",x);
A.赋值非法 B.输出值不确定
C.输出值为affbc D.输出值为ffbc
答案:D
[例2] 下述语句的输出为( )。
int x=-1;
printf("%d,%u,%o",x,x,x);
答案:-1,65535,177777
[例3] 下述语句的输出为( )。
Int x=2.5555555;
float y=2.5555555;
printf("%d,%f",x,y);
答案:2,2.555556
(单精度只有7位有效数字)
[例4] 下述程序段的输出结果是( )。
int x=1234;
printf("ABS(x)=|%-08d|/n",x);
答案:ABS(x)=|1234□□□□|
[例5] 下述程序的输出结果是( )。
int x=02,y=3;
printf("x=%%d,y=%%d/n",x,y);
答案:x=%d,y=%d
[例6] 以下程序段的输出结果为( )。
int a=1234;
float b=123.456;
double c=12345.54321;
printf("/n%2d,%2.1f,%2.1lf/n",a,b,c);
答案:1234,123.5,12345.5
[例7] 下述程序段的输出结果是( )。
long a=0xabcdef;
double b=1.0E40;
printf("/n%5.2e,%-6x/n",b,a);
答案:1.00e+40,cdef□□
[例8] 以下程序的输出结果是( )。
char a='A';
int b=20;
printf("%d,%o/n",(a=a+1,a+b,b),a+'a'-'A',b);
答案:20,142(注意输出列表中逗号表达式求解后,a变量的值已增1)。
3.格式输入函数-----scanf函数
格式:scanf(格式控制串,地址表列)
格式控制串:含义同printf函数,在这里用来约定数据输入的格式。
地址表列:由变量的地址(&变量名)、字符串的首地址所组成的表列,用来指定输入数据在内存中的存储位置。
说明:
⑴ 对unsigned型变量所需的数据,可以用%u、%d、%o、%x格式输入。
⑵ 可以指定输入数据所占列数,但不能规定数据输入的精度。
⑶ 如果在%后有一个“*”附加说明,表示跳过它指定的列数。
⑷ 在格式控制串中的普通字符,要原样输入。
⑸ 在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入,且只接收1个字符。
⑹ 在输入数据时,遇以下情况时该数据认为结束。
§ 遇空格、按“回车”或“跳格”(Tab)键。
§ 截取指定的宽度结束
§ 遇非法输入结束
[例8] 假设预先定义变量:int m; char cx;若从键盘上输入整数30和字符’A’分别赋给变量m和cx,下列选项中正确的是( )。
A.scanf("%d%d%c",&m,&cx);
输入数据:10□30□A
B.scanf("%2c%2d",&cx,&m);
输入数据:BA30
C.scanf("%2c%*d%d",&cx,&m);
输入数据:AB□30□10
D.scanf("%2c;%*2d%d",&cx,&m);
输入数据:AB;1030
[例9] 下述程序段中,语句“getchar();”的作用是( )。
int x;
scanf("%d",&x); getchar(); printf("%c",x);
A.清除键盘缓冲区中多余的字符
B.接收一个字符,供后续程序使用
C.为后续的%c格式输出做转换
D.无任何实际用处
[例10] 下述程序的输出结果是( )。
int x=-2345; float y=12.3;
printf("%6D,%06.2F/n",x,y);
答案:%6D,%06.2F