y:
z的值是(A )。
A)1 B)2 C)3 D)4
7.逗号运算符:
(表达式1,表达式2)
先求表达式1的值,再求表达式2的值,表达式2的值就是整个逗号表达式的值。
注:
常见的条件运算符和自加自减运算符是右结合性,其余的基本是左结合性。
优先级排序:
单目(++,--,!
)>算术(*,/,%,+,-)>关系(>,>=,<,<=,==,!
=)>逻辑(&&,||)>条件(?
:
)>赋值(=)>逗号(,)
一,二,三,赋值,逗号;算术,关系,逻辑。
四.数据类型转换
①类型自动转换:
(此类型题答案多为double型)
例:
进行下列变量定义后,表达式a*b+d-c的类型是 double 。
chara;
intb;
floatc;
doubled;
②赋值转换:
如⑴floatf;
f=4; /*内存中变量f的值为4.000000*/
⑵intx;
x=4.35; /*内存中变量x的值为4*/
⑶intx;
x=‘a’; /*内存中变量x的值为65*/
③强制类型转换:
(强制类型名)(表达式)
如:
(int)(a+b) /*将表达式a+b结果的类型强制转换成int型*/
(int)a+b /*将变量a的类型强制转换成int型后,再进行运算*/
重要语句:
1.C程序由函数构成的,一个C程序有且只有一个mian函数,一个C程序总是从main函数开始执行,在main函数中结束整个程序。
main函数的位置可以任意。
一个函数由函数首部和函数体组成。
2.一个C源程序要经过编辑,编译,连接,运行,这几个步骤才能进行上机运行。
3.C语言程序的执行:
编辑源程序(.c)—>目标程序(.obj)—>可执行程序(.exe)。
4.C语言编译系统在表示逻辑运算结果时,以数值1代表真,以数值0代表假;在判断一个量是否为真时,以非0代表真,以0代表假。
5.C语言是计算机高级语言,它适合作为系统描述语言,它既可以用来写系统软件,也可以用来写应用软件。
C程序的基本控制结构
一.顺序结构
1.printf函数:
调用的一般形式printf(“格式控制字符串”,输出表列);
如:
printf(“%d,%d\n”,a,b);%后面跟有各种格式字符,以说明输出数据的类型,长度,小数位数等等,非格式字符则原样输出。
%d(十进制整型)%c(字符型)%f(实型,小数点后6位)%e(指数型)
%m.nf(表示指定输出宽度为m,精度即小数点后n位)
例:
以下程序的运行结果是 11.50 。
#include
voidmain()
{inti=5,j=9;
floatx=2.3,y=4.5;
printf("%8.2f\n",i%(int)(x+y)*j/2/3+y);
}
若实际位数多余定义的宽度,按实际位数输出;若实际位数少于定义宽度则在前面补以空格。
1.scanf函数:
调用的一般形式scanf(“格式控制字符串”,地址表列);
如:
scanf(“%d,%d”,&a,&b);非格式字符原样输入。
scanf函数没有精度控制,如scanf(“%5.2f”,&a)是非法的。
例:
若定义floata;,现要从键盘输入a数据,其整数位为3位,小数位为2位,则选用(A )。
A)scanf("%6f",&a); B)scanf("%5.2f",a);
C)scanf("%6.2f",&a); D)scanf("%f",a);
scanf(“%d%*d%d”,&a,&b);表示当输入123时,把1赋予a,2被跳过,3赋予b。
scanf(“%4d%4d”,&a,&b);输入12345678.表示将1234赋予a,5678赋予b。
scanf(“%c%c%c”,&a,&b,&c);输入xyz时,把‘x’赋予a,‘’赋予b,‘y’赋予c。
3.putchar函数:
单个字符输出函数。
调用一般形式:
putchar(字符变量)
getchar函数:
单个字符输入函数。
调用一般形式:
getchar()
二.选择结构
1.if语句:
①if(表达式)语句;
如果表达式的值为真,则执行其后的语句,否则不执行。
②if(表达式)
语句1;
else
语句2;
如果表达式的值为真,则执行语句1,否则执行语句2。
③if(表达式1)
语句1;
elseif(表达式2)
语句2;
elseif(表达式3)
语句3;
…
else
语句n;
依次判断表达式的值,当出现某个值为真时,则执行其对应的语句,然后跳到整个if语句之外继续执行程序,如果所有表达式均为假,则执行语句n。
注:
if语句的嵌套,C语言规定else总是与它前面最近的未配对的if配对。
2.switc语句:
switch(表达式)
{
case常量表达式1:
语句1;
case常量表达式2:
语句2;
…
case常量表达式n:
语句n;
default:
语句n+1;
}
计算表达式的值,逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有语句。
如表达式的值与所有case后的常量表达式均不相同时,则执行defalut后的语句。
break语句用于跳出switch语句,避免输出不应该有的结果。
例:
下面程序输出的结果是(D )。
#include
voidmain()
{inta=55,b=50,c=60,d;
d=a>20?
b:
c;
switch(d)
{case40:
printf(“%d,”,a);
case50:
printf(“%d,”,b);
case60:
printf(“%d,”,c);
default:
printf(“$\n”);}}
A)50,60 B)50,$ C)60,$ D)50,60,$
三.循环结构:
1.while语句:
while(表达式)循环体(注:
表达式后没有分号)
如:
while(i<=10)
{f=f*i;
i++;
}
例:
下面的程序中:
inti=9;
while(i=0)i=i-1;
则下列描述正确的是(C )
A)while循环执行9次 B)循环体语句执行一次
C)循环体语句一次也不执行 D)循环是无限循环
2.do-while语句:
do
循环体
while(表达式);
如:
do
{f=f*i;
i++;
}
while(i<=10);
注:
至少执行一次循环体。
例:
下面的程序运行结果是(B )
#include
voidmain()
{
intx=10;
do
x--;
while(--x);
printf("%d\n",x--);
}
A)-1 B)0 C)1 D)8
1.for语句:
for(循环变量赋初值,循环条件,循环变量增值)循环体
如:
for(i=1;i<=10;i++)
f=f*i;
例:
设n为整型变量,则for(n=10;n>=0;n--)循环次数为(C )
A)9 B)10 C)11 D)12
例:
输出如下方阵。
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
#include
voidmain( )
{inti,j,x;
for(i=1;i<=4;i++)
{for(j=1;j<=4;j++)
{ x=(i-1)*4+j;
printf("%4d",x); }
printf("\n");
}
其余知识点:
1.常用循环嵌套:
如:
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
{
}
2.求平方根:
intm,n=4;
m=sqrt(n);
3.分离出整数的每一位数字:
如:
S=4321;2=S/10%10;3=S/100%10
1.break语句只能用于循环语句和switch语句,break语句是结束整个循环,不再判断循环条件是否成立,而continu语句只结束本次循环,继续进行下一次循环。
2.goto语句的用法不符合结构化原则,一般主张限制使用。
数组
一.一维数组
1.定义:
如:
inta[5];
C语言的数组元素下标从0开始,注意下标不能过界;
定义的数组长度不能是变量;
例:
以下能正确定义一维数组的选项是( B )。
A)intnum[]; B)#defineN100 intnum[N];(宏定义,符号常量)
C)intnum[0..100]; D)intN=100; intnum[N];
可以一次同时定义多个同类型数组。
1.引用:
必须使用循环语句逐个输出数组里的各元素,如:
for(i=0;i<5;i++)printf(“%d”,a[i]);
3.初始化:
对数组的全部元素赋初值时,可以不指定数组长度。
只对数组的部分元素赋初值,未赋值元素自动取零值。
二.二维数组
1.定义:
如:
inta[5][5];(定义了a为5行5列的二维数组)
同一维数组一样,数组元素下标从0开始,注意下标不能过界;
2.引用:
同样只能逐个引用数组元素,如:
inta[2][3];
for(i=0;i<2;i++)
for(j=0;j<3;j++)
scanf(“%d”,&a[i][j]);
1.初始化:
对二维数组全部元素赋初值,则数组的第一维长度可以省略,但第二维长度不
能省略。
同一维数组一样,可以只对二维数组的部分元素赋初值,未赋值元素自动取零值。
三.字符数组:
1.定义:
如:
charc[5];
2.初始化:
逐个给数组中的各元素赋初值
如:
charstr[10]={‘c’,‘h’,‘i’,‘n’,‘e’,‘s’,‘e’}
用字符串直接给字符数组赋初值
如:
charstr[]=“chinese”
3.字符数组的输入输出:
①用循环语句实现逐个字符输入,输出:
如:
charstr[10]=“chinese”;
for(i=0;i<10;i++)
printf(“%c”,str[i]);
②使用“%s”实现字符串的整体输入输出:
如:
charstr[10]
scanf(“%s”,str);(注意没有“&”,字符数组名已经表示数组首地址)
4.其余知识点:
①C语言规定:
字符‘\0’作为字符串结束标志,占用储存空间,但不计入串的实际长度。
因此用字符串常量对字符数组初始化时,数组的长度至少要比字符串实际长度大1。
注意字符数组与字符串的区别。
如:
char:
c[]=“chinese”系统设字符数组长度为8(内存占8字节),字符串长为7。
char:
c[]={‘c’,‘h’,‘i’,‘n’,‘e’,‘s’,‘e’}字符数组长度为7。
②字符串处理函数:
字符串输入函数:
调用形式:
gets(字符数组)
字符串输出函数:
调用形式:
puts(字符数组)
字符串连接函数:
调用形式:
strcat(字符数组1,字符数组2)
字符串复制函数:
调用形式:
strcpy(字符数组1,字符串2)
字符串比较函数:
调用形式:
strcmp(字符串1,字符串2)
字符串长度函数:
调用形式:
strlen(字符数组)
函数
1.定义函数:
无参函数定义:
如:
print-1() /*print-1函数的定义*/
{printf(“hello\n”);}
有参函数定义:
如:
intmax(intn1,intn2)
{intn;
n=n1>n2?
n1:
n2;
return(n);
} /*定义一个函数max()*/
2.函数返回值:
return语句的一般形式:
return(表达式);或return表达式;或return;
函数值的类型和return语句中表达式值不一致,以函数类型为准。
3.调用函数:
一般形式:
函数名(实际参数表)
实参在类型上按顺序与形参一一对应和匹配。
1.对被调用函数的原型声明:
函数类型函数名(参数类型1,参数名1;参数类型2,参数名…)
函数类型函数名(参数类型1,参数类型2…)
被调函数在主调函数前进行定义就不用声明。
5.函数的递归调用(掌握用递归法计算n!
详见程序题第10题)
例:
阅读下面程序段,则执行后的结果是(A )。
#include“stdio.h”
longfun(intn)
{if(n>2)
return(fun(n-1)+fun(n-2));
elsereturn
(2);}
main()
{printf(“%ld﹨n”,fun(5));}
A)10 B)15 C)20 D)以上3个答案都不正确
6.数组作为函数参数:
①数组元素用作实参,作用与普通变量相同,发生函数调用时,把数组元素的值传给形参,实现单向值传递。
②函数的形参和实参为数组名。
注意用二维数组名作形参数组定义时,可以省略第一维的大小说明,但不能省略第二维的大小说明。
7.自动型变量auto:
(每次都重新初始化)
静态型变量static:
(只初始化一次)
例:
阅读下面程序段,则执行后的结果是(D )。
#include“stdio.h”
fun()
{staticintx=5;
x++;
returnx; }
main()
{inti,x;
for(i=0;i<3;i++)
x=fun();
printf(“%d\n”,x); }
A)5 B)6 C)7 D)8
重要语句:
①一个C程序由一个或多个源程序文件组成,一个源程序文件由一个或多个函数组成,函数不能嵌套定义,但可以嵌套调用,但不能调用main函数。
②从用户使用角度看,函数有两种:
标准函数(库函数),用户自定义函数;从函数形式看,函数分两类:
无参函数,有参函数。
③在C语言中,实参向形参数据传递是值传递,单向传递只由实参传给形参,而不能由形参传回来给实参。
在内存中,实参单元与形参单元是不同单元。
④在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归 。
⑤在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。
这称为局部变量。
形参变量是被调用函数的局部变量,实参变量是调用函数的局部变量。
指针
一.基本概念:
假如让变量p存放整型变量a的地址,这样由变量p的值就可以找到变量a,因此称变量p就是指针变量,存放的地址称为指针,指针就是地址。
指针变量的一般定义形式:
类型名*标识符
如:
intm,&r;
r=&m;
m=*r; (r表示地址,*r表示内容)
又如:
(*p)++:
表示地址不变,内容加1;
*p++:
表示地址加1,内容不变;
例:
有以下程序。
#include
main()
{intarray[]={1,2,3,4,5,6,7};
int i,j,*pointer1,*pointer2;
pointer1=&array[1];
pointer2=&array[5];
i=*pointer1**pointer2;
j=*(pointer1+2)+*(pointer2+1);
printf("%d,%d\n",i,j);}
程序执行后的输出结果是(C )。
A)5,9 B)9,5 C)12,11 D)11,12
二.指针作为函数参数:
(值传递的是变量地址)
例:
有以下程序(假设从键盘输入数据1,2)。
#include
voidswap(int*p1,intp2)
{*p1=*p1+p2;
p2=p2+*p1;}
voidmain()
{inta,b,*pointer1;
scanf("%d,%d",&a,&b);
pointer1=&a;
swap(pointer1,b);
printf("a=%d,b=%d",a,b);}
程序执行后的输出结果是( D )。
A)3,5 B)a=3,b=5 C)3,2 D)a=3,b=2
三.指针与数组:
如:
inta[10],*p;
p=a;(或p=&a[0];)
表示:
数组的第0个元素a[0]的地址是a,(等价于p)
数组的第1个元素a[1]的地址是a+1,(等价于p+1)
……
数组的第i个元素a[i]的地址是a+i,(等价于p+i)
*(a+i)与a[i]等价;*(p+i)与a[i]等价。
四.指向字符串的指针变量:
例:
使用指针编写程序,按照正反两个顺序打印一个字符串。
#include
voidmain()
{char*p_string1,*p_string2;
p_string1="computerlanguage"; /*定