月考核纸质题目总结
首先了解一下c语言中运算符的优先级(图片源自百度百科)
第一题
已知int x = 5,y = 5,z = 5;执行语句x%=y+z后,x的值是__5__
题解:因为%=的优先级低于+,所有先执行y+z的指令,值为10,然后计算x%=10,%=的意思为先取模之后将值赋给左边变量,x%=10相同与x=x%10,先计算%(取余)x=5%10,x=5。
第二题
以下程序的输出结果是__3__
#include <stdio.h>
int main()
{
int a = 3, b = 3, c = 1;
c = 5 ? a++: b--;
printf("%d\n", c);
return 0;
}
题解:c = 5 ? a++: b–;中?:是条件运算符,条件运算符的优先级低于自增(++)和自减(–)
条件运算符的作用是如果条件为真,执行:之前的语句,如果条件为假,执行:之后的语句
自增和自减两个运算符的作用都是将变量i的值加1(减1),但两个运算符有前置和后置之分,两者的区别在于,算术表达式本身的值不同,算术表达式++i(–i)的值为变量i加1(减1)之后的值,而算数表达式i++(i–)的值为变量i加1(减1)之前的值。
简而言之,i++(i–)是执行完指令之后再自增(减),但++i(–i)是先自增(减)再执行指令
所以此题先判断语句c=5的真假,此语句为真,所以执行a++,先输出a的值,再对a的值加1
第三题
下面程序的运行结果是__a=2,b=8__
#include <stdio.h>
int main()
{
int a = 1,b = 10;
do
{
b -= a;
a++;
}while(b-- < 0);
printf("a = %d,b = %d\n",a,b);
}
题解:do-while语句的功能是先无条件执行循环体,然后判断条件表达式是否成立,如果成立,再执行循环体语句,如果不成立,退出循环
在此题中,先进入循环执行b-=a,b-=a等同于b=b-a=10-1=9,然后执行a++
第一次循环结束,此时b=9;a=2,
判断条件表达式b–<0,–先于<,但–为后置,所以先与0比较,b>0,不满足条件,退出循环,同时,b-1=8
输出结果,a=2,b=8
第四题
下面程序段运行的结果是____x=15,y=14____
#include <stdio.h>
int main()
{
int x,y;
for(y = 1; y < 10;)
{
y=((x = 3 * y, x + 1), x - 1);
}
printf("x=%d, y=%d\n",x,y);
return 0;
}
题解:逗号表达式从左向右计算,逗号表达式的值取最右表达式的值
y=1,y<10,满足条件,进行第一次循环,y=( (x=3 , 4 ) , 2 ),x+1和x-1中,只计算结果,不会对x的值有影响,然后将最右表达式的值2赋给y
第一次循环结束,结果为x=3,y=2
y=2,y<10,满足条件,进行第二次循环,y=( (x=6 , 7 ) ,5 ),第二次循环结束,结果为x=6,y=5;
y=5,y<10,满足条件,进行第三次循环,y=( (x=15, 16 ), 14 ),第三次循环结束,结果为x=15,y=14。
y=14,y>10,不满足条件,退出循环,输出结果x=15,y=14
第五题
以下程序的输出结果是__10,10 __ 9,1__
#include <stdio.h>
int main()
{
int x = 10,y = 10,i;
for(i = 0; x > 8; y = ++i)
printf("%d,%d",x--,y);
return 0;
}
题解:x–,先输出x,再对其–
x=10>8,进入第一次循环,输出x=10,y=10,之后赋值i=1,y=1,x=9
x=9>8,进入第二次循环,输出x=9,y=1,之后赋值x=8,i=2,y=2
x=8,不满足条件,退出循环
第六题
下面程序的运行结果是_11__
#include <stdio.h>
int main()
{
int i,sum;
for(i = 1;i < 5; i++)
{
sum += i;
}
printf("%d\n",sum);
return 0;
}
题解:i=1<5,执行一次循环,sum=sum+i=(sum没有赋初值,此时应该为一个随机数,在DEVC++中,sum初值被赋成了1)=1+1=2;
i=2<5,执行第二次循环,sum=sum+i=2+2=4;
i=3<5,执行第三次循环,sum=sum+i=4+3=7;
i=4<5,执行第四次循环,sum=sum+i=7+4=11.
第七题
已知char a[]=“Beijing”;,则数组a所占的储存空间是__8__个字节
题解:因为Beijing共有7个字符,占7个字节,但字符串中还有一个串结束符"\0",所以共计有8个字符,所占的储存空间是8个字节
下图为常见的字符类型占用字节数
类型 | 占用字节数 |
---|---|
char | 1 |
int | 4 |
short [int] | 2 |
long [int] | 4 |
long long [int] | 8 |
float | 4 |
double | 8 |
第八题
当执行下面程序时,如果输入abc,则输出结果是_____
#include <stdio.h>
#include <string.h>
int main()
{
char str[10] = "12345";
gets(str);
strcat(str,"def");
printf("%s\n",str);
return 0;
}
题解:首先程序对str字符串进行初始化为12345,但在语句gets(str)中,新输入了abc将原来初始化的值进行了覆盖,使str里存进了abc,strcat是字符串处理函数中的一条,作用是将字符串str2连接到字符数组str1的后面,并返回str1,(将def连接到abc的后面,并返回到str中,使得str[10]中的值为abcdef),最终输出字符串str为abcdef
第九题
已知A的ASCII码值是65,并由如下定义:
#include <stdio.h>
struct person
{
char name[10];
int age;
}classes[10] = {{"LiMing",29},{"HongGang",21},{"WangFang",22}};
下列表达式中,值为72的是___B___
A.classes[0]->age+classes[1]->age+classes[2]->age
B.classes[1].name[0]
C.classes[1].name[5]
D.classes->name[5]
题解:
A错误,
(指针变量名).成员名 可以写成 指针变量名->成员名 相同于 结构体变量.成员名
A项中正确格式应为指针变量名->成员名,错误
附加:若想输出第二个成员的年龄,应该将classes[1]->age改为(classes+1)->age,
classes[0]->age和classes[2]->age同理
B项中表示结构体中第二个成员的name中的第一个字符(H)的ASCII码,为72,正确
C项中表示结构体中第二个成员的name的第六个字符(a)的ASCII码,为97,错误
D项中表示结构体中第一个成员的name的第六个字符(g)的ASCII码,为103,错误