(一)必考知识点
1.实型常量(浮点数)
(1)小数形式
小数形式的实型常量由两部分组成:数字和小数点。如:0.12
、12.
、.12
都是合法的实型常量。
(2)指数形式
在C语言中,以"e"或"E"后跟一个整数来表示以10为底的幂数。如:2.306可以表示为0.2306E1
、2.306e0
、23.06e-1
。C语言语法规定:
字母e或E之前必须要有数字,且e或E后面的指数必须为整数。
例:以下正确的实型常量()
A.5. B.3. 1415 C.456e-2 D.0.04e+1.5 F.089 G.5e H.E6
解析:AC.
浮点数可以表示为小数或者指数的形式,小数的话必须有数字和小数点,指数的e和E的后面必须是整数,必须有数字。小数点之后的尾数之前不能有空格。
2.用户标识符
(1)标识符的第一个符号一定是字母或者下划线
(2)标识符只能由字母,下划线和数字组成
(3) 标识符不能是c语言关键字
例:下列不合法的标识符有哪些:
A,wb-1 B.file C,Main D.PRINTF E._123 F.printf G.As H.Dim
解: AG:要分清-和_的区别 .As是关键字
3.C语言语法的表达式
常量、变量、函数调用以及按C语言语法规则用运算符把运算数连接起来的式子都是合法的表达式
最后一类可以理解为运算符和运算对象的组合。例如:
- 算术表达式 = 算术运算符 + 运算对象
- 赋值表达式 = 赋值运算符 + 运算对象
- 复合赋值表达式 = 复合赋值运算符 + 运算对象
- 自增、自减表达式 = 自增、自减运算符 + 运算对象
- 逗号表达式 = 逗号运算符 + 运算对象
- 关系表达式 = 关系运算符 + 运算对象
- 逻辑表达式 = 逻辑运算符 + 运算对象
- 条件表达式 = 条件运算符 + 运算对象
例:如果变量已经正常赋值且被定义,符合C语言的语法表达式为:
A)a+=7; B)a=7+b+c,a++ C)int(12,3%4) D)a=a+7=c+b
解:B.表达式后面没有分号排除A。C中没有运算符号。 D中的c+b给了a+7,而a+7不是一个变量
4.赋值语句
赋值表达式再加上分号构成的表达式语句 变量=表达式;
(1)由于在赋值符“=”右边的表达式也可以又是一个赋值表达式。因此,下述形式
变量=(变量=表达式);是成立的,从而形成嵌套的情形
(2)变量说明中不允许给一个变量连续赋值
以下非法的赋值语句为:
A)++(i+1); B)x=j>0; C)k=int(a+b);
解:AC, ++运算符的后面必须是变量,而不能是常量和表达式. C应该写成k=(int)(a+b);
5、常量
c语言的常量分为字面常量,const修饰的常变量,#define定义的标识符常量,枚举常量。
(1)const:实际上是常量,但是还是一个变量
//const修饰的常变量:
#include<stdio.h>
int main()
{
//const-常属性
//const修饰的常变量
int n=10;
int a[n]={0};//编译错误
const int num=10;
num=8;//编译错误
printf("%d",sum);
}
(2)枚举常量
enum Color
{
red;
yellow;
blue;//枚举常量,值分别为0,1,2
}
int main()
{
enum Color color=blue;
color=yellow;//error
}
(3)字符串常量:
字符串的结束标志是’\0‘ 。“\0"是字符串,'\0'是字符。
0和’\0'是一样的,ASCII码值都是0,用%d打出来的是0,用%c打出来的是’’0‘是字符0,ASCII码值是48.
int main()
{
char arr1[]="abc";
char arr2[]={'a','b','c'};
printf("%d",arr1);//3
printf("%d",arr2);//15 输出的是随机值
}
6.程序控制结构
(1)goto语句:无条件转移语句,与if语句一起使用构成循环 goto 标号;
从多重循环跳到外面的某一层循环的时候任何层次使用goto语句
if语句的控制条件可以使用任意表达式
int main()
{
int i=0,sum=0;
loop:sum+=1;
i++;
if(i<=100) goto loop;
printf("%d",sum);
}
(2) 习题集:
1).双%输出%d
int main()
{
int a=1;
printf("%%d",a);//输出%d
}
2)switch-case中无break;
int main()
{
int x=1,a=0,b=0;
switch(x)
{
case 1:a++;
case 2:a++,b++;
}
printf("%d,%d",a,b);
}
输出2和1
3.)关系运算的值判断
void main()
{
int a=5,b=4,c=3,d=2;
if(a>b>c)//括号为关系运算,a>b为1而1>c为0所以不执行
printf("%d",d);
else if((c-1>=d==1)//>=优先级高于==
printf("%d",d+1):
else printf("%d",d+2);
}
输出3
4.) !x 在while中 输出5
int main()
{
int x=5;
do{
printf("%d",x--);
}while(!x)//当x为0才成立
}
5)输出-1
int main()
{
char x=0xFFFf;//1111 1111 1111 1111的char为8个字节,除去前面最高八位
printf("%d",x--);
}
6)输出2
void main()
{
int a=2,b=-1,c=2;
if(a<b)
if(b<0) c=0;
else c++;
printf("%d",c);
}
等价于
void main()
{
int a=2,b=-1,c=2;
if(a<b)
{if(b<0) c=0;}
else c++;
printf("%d",c);
}//注意else和if哪个配对
7)暴力三题
int main()
{
int a=10,y=0;
for(;--a;)
if(a%3==0)
y+=a;
y++;
}//输出10
int main()
{
int a=2,n=5,s;
s=a;
for(;--n;)
s=s*10+a;
printf("%d",s);
}//输出22222
int main()
{
int x,y,z=0;
for(x=1,y=5;x<y;x++,y--)
{
z+=x*10+y;
}
printf("%d",z);
}//输出39
8)关于continue的使用
//输出100以内可以被3整除并且个位数为6的所有整数
#include<stdio.h>
int main()
{
int i,j;
for(i=0;i<10;i++)
{
j=10*i+6;
if(j%3==0) continue;
printf("%d",j);
}
}
//输出为8
{
int x=1,y=3;
do{
y+=x++;
if(y%7==0) continue;
}while(y<15);
printf("%d",x);
}
7)字符数组的相关应用
char s[12]={"string"};
printf("%d",strlen(s));//输出6
char c[]="Taiyuan"//元素个数为8
char c[5]={'a','b','\0','c','\0'};
printf("%s",c);//输出ab c
int y[][3]={1,2,3,4,5,6,7}={
{1,2,3},{4,5},{6,7}};
数组第一维的长度为3
与put(str)等价的是
printf("%s\n",str);
有俩个字符数组a,b.从键盘中输入俩个字符串a和b存储在a和b中具体格式
scanf("%s%s",a,b);
8)在数组a中查找值为x的元素
int main()
{
int a[10]={24,76,89,4};
int x,i,t=0;
scanf("%d",&x);
for(i=0;i<10&&t==0;i++)
if(a[i]==x)
{
printf("%d",a[i]);
t=1;
}
if(t=0) printf("没找到”);
}
9)把字符串中所有的‘a'删除
void main()
{
char a[81];
int i,j;
gets(a);
for(i=j=0;a[i]!="\0";i++)
if(a[i]!='a')
j++;
a[j]='\0';
puts(a);
}
10)较难 不一定掌握
int main()
{
char a[]="1234";
short *p=NULL;
p=(short*)a;
printf("%d",*p);
printf("%d",*++p);//先用++再*
}
在我们的编译器中,高位放在高地址。
1 ascii码值 49 |
2 50 |
3 51 |
4 52 |
由于每个字节之间的进制为256(0--255)
则*p为50*256+49=12849
*p++为52*256+51=13363.
执行以下程序段后,变量a,b,c的值分别是( C )。
int x=10,y=9;
int a,b,c;
a=(--x= =y++)?--x:++y;
b=x++;
c=y;
A、a=9,b=9,c=9 B、a=8,b=8,c=10
C、a=9,b=10,c=9 D、a=1,b=11,c=10
11)
int main()
{int a=0,b=0,c=0;
c=(a-=a-5),(a=b,b+3);
printf("%d%d%d",a,b,c);
}
输出0,0, 5由于-的优先级高于-=
12)printf的奇异输出
int x=496;
printf("%-06d*\n",x);
*496 *
21
float a=3.1415;
printf("|%6.0f|\n",a);
| 3|
int a=99;
printf("%d",a<=100);//结果为1
关系运算符的结果为0或者1
13)
int main()
{
int a=2,b=-1,c=2;
if(a<b)
if(b<0) c=0;
else c+=1;
printf("%d",c);
}
else与其最近的未配对的if配对
if (a<b)
{if(b<0) c=0;
else c+=1;}
c的值不变还是2
int main()
{
int x=1,y=2,z=3;
if(x>y)
{if(x>z) printf("%d",x);
else printf("%d",y);}
printf("%d",z);
}//输出3
14)下面程序是把316分成俩个加数的和,使得俩个加数能够被13和11整除
#include<stdio.h>
int main()
{
int i=0,j,k;
do {
i++;
k=316-13*i;
}while(k%11);
j=k/11;
printf("加数为%d%d,i,j);
}
15)
int main()
{
int x,i;
for(i=1;i<=100;i++)
{x=i;
if(++x%2==0)
if(++x%3==0)
if(++x%7==0)
printf("%d",x);
}
}
(x)%7==0&&(x-1)%3==0&&(x-2)%2==0
16)
int i,j,m;
for(i=1;i<15;i+=4)
for(j=3;j<=19;j++)
m++;
printf("%d",m);
共走4*5=20次
17)
fun(int a,int b,int c)
{
c=a*b;
}
void main()
{
int c;
fun(2,3,c);
printf("%d",c);
}
c无定义 。因为函数的值传递的时候,外面的c和内部的c无关,因为在不同的内存空间,不会改变值。
18)
void main()
{
int k=4,m=1,p;
p=fun(k,m);
printf("%d",p);
p=fun(k,m);
printf("%d",p);
}
fun(int a,int b)
{
static int m,i=2;
i+=m+1;
m=i+a+b;
return(m);
}
(二)小题填空
- Printf(“%%d%d”,123)----输出%d123
- 逻辑运算的结果是0和1
- 正确的标识符由(数字,字母,下划线)组成,且由(字母和下划线)组成
- 一个算法应具有(有穷性,确定性),(有零个或多个输入),(有一个或多个输出),(有效性)。
- 按变量地址访问变量叫直接访问,按存放变量的地址的变量去访问变量叫间接访问。
- 文件包含的一般形式(#include<>)
- 宏定义中宏的名字一般用大写字母,容易做到(一改全改)
- 结构体是一种(构造)数据类型用途是把(不同类型)的数据组合成一个整体
- 位运算的运算对象是(整型)和(字符型)数据,而不可以是其他类型的数据
- (文件)是存储在外部介质上数据的集合,是操作系统数据管理的单位
- 设有“int x=2,y”则逗号表达式”y=x+5,x+y”的值是(9)
- 变量的存储类型共有四种(整型),(实型),(字符型),(无字符型)
- 复合语句是用{}
- Putchar和getchar引用#include<stdio.h>
- C语言表达式和语句的区别在于(句尾有无分号结束)
- Goto语句为(无条件转向语句),当程序执行该语句的时候可以转移到指定位置
- C语言提供的预处理主要功能是(宏定义),(文件包含处理),(条件编译)
- 位运算是对一个数据的某些(二进制位)进行运算
- C语言根据数据的组织形式可以把文件分为(文本文件)和(二进制文件)
- 设char a[]=”chain”数组存储的空间(6个字节)
- C语言以追加的方式打开一个文件选择(“a”)参数
- Break(在多重循环中,只能退出最靠近的那一层循环语句)
- 俩个指针变量的值相等时,表明俩个指针变量(指向同一内存单元地址或者都为空)
- 字符型指针变量存入的是(字符串的首地址)
- 要求运算数必须是整型的运算为(%)
- While(!e)括号表示e==0
- 函数返回值的类型最终取决于(函数定义时形参的类型)
- 若在fopen函数中使用文件的方式是“wb+”,含义为(为读写打开一个二进制文件0
- 在定义指针的时候,标识符前面的*表示后面的指针变量所指向的内容
- 设a和b都是double类型的变量,且a=5.5,b=2.5,则表达式(int)a+b/b=6.000000 把a转化为int的时候直接把小数点后面的数字省略
- double类型和int类型相加,强制转换为double类型
- int a=3,b=3,c=1; !(a+b)-c=-1//要注意!是加给括号的
Turbo C中int类型变量的字节数为2 - oxff是不合法的十六进制数字:牢记十六进制的第一个必须是0而不是o
- C语言简单的数据类型为:整型,实型,字符型
- 计算机语言的发展历史:二进制语言——>汇编语言(用助记符来表示二进制语言)——>B语言——>高级语言
- 局部变量和全局变量同时存在的时候,局部变量优先。用extern来声明外部符号。>>为左移。
- scanf中%*3d意思是:输入3位十进制数字不够的话在前面补* 与%03d类似
- int a=2;当a-=a+=a*a求解后的a的值0//注意a的值在+=之后会变化
- int x=2; x=x+1/x-x++的值为1
- C语言的源程序经过编译形成的二进制代码不可以直接运行,每条语句最后都会转换为二进制代码。
- C语言编写的程序是一个源程序,必须经过编译链接之后才可以运行。
- C语言简单的数据类型包括整型,实型,字符型,不包括逻辑型
- ‘y=’是不合法的字符串量
- m=(k+=i*=k) i=i*k,i的值改变 然后算k+=i=>k=k+i
- 交换:a=a+b,b=a-b,a=a-b
- ‘A'的ascii码值为65
- 若x=3.2,则++x后为4.2
- 函数体前面是声明部分,后面是执行部分
- C程序定义的变量相当于内存一组存储单元
- 一个字节表示的最大整数是255,二进制位是11111111,最小是-128,二进制为1000000
- scanf("%d%d%f",&a,&b,&c);//三种可能的方式:1<CR>2<CR>3<CR> 1 2<CR>3<CR> 1 2 3<CR>
- double转为int四舍五入,0.5也舍去,0.51进一位
- %mc 前面的 m为整形数字
m的意义在于打印 默认分配给这个字符 几个字符位置
因为字符本来 就占有 一个位置 所以 %c 分配给字符一个打印为 是刚占满的
但是 %4c 由于 字符本身只占有 一个位置 所以还空下三个位置 (这就要用空格来填充了)
c语言默认是 右对齐的 所以在右边.打印出字符之后 会 顺势 输出三个空格来填充,
至于 如果 想 让字符靠左对齐 那么 在%mc m 前面加个负号就可以啦 这样 %-4c 就是靠左对齐啦 - int a=3,b=4,c=5;!((a<b)&&!c||1)//与大于或 结果为0
- 给变量赋初始值的时候,没有加static,默认为auto 型,此时,不给初值,变量的初值是随机的。
如果加了static不给初值,变量的初值是默认的 0。 - 定义语句char c[5]={'a','b','\0','c','\0,};printf("%s",c);//得到ab c
- func((exp1,exp2),(exp3,exp4,exp5));有俩个参数。逗号是一个运算符,其运算过程为依次计算左右操作数并返回右操作数的右值(即不可写值)。
- 在函数间通过全局变量的传递数据,只能用外部变量,不能用内部变量。
- 如果利用地址的返回值传递数据,返回值不能够赋给普通变量。
- 如果函数值的类型和返回值的类型不一样,以数据类型为准
- 实参类型和形参类型不一致,会转化为形参
-
有符号数就是最高位为符号位,0代表正数,1代表负数
无符号数最高位不是符号位,而就是数的一部分而已。
1011 1111 0000 1111 1111 0000 1011 1010,如果当有符号数看待,那么他是一个负数的补码,如果当一个无符号数看待,他就是一个正数的原码
无符号数最小为0,不可能是负数.%u,输出一个10进制的无符号数.
%d是输出一个有符号的10进制int类型
-
getchar接受一个字符,当接受的不为字符的时候,返回EOF
-
用gets输入字符串,用scanf不能获取空格,默认遇到空格 tab 换行符停止、%0m*l表示m为输入的宽度,0表示字符数不足m的时候用0补齐。*表示这个输入忽略,不占用任何内存。
(三)选择题
若有定义:double a,b; int w; long c;且各个变量已经赋值正确,则合法的C语言标识为:
A.a=a+b=b++ B.w%((int)a+b) C.(3*a*d)/(b*c) D.(c+w)%(a+b)
解析:b++只对整型变量。%俩边必须都是整数。所以选C