C语言-习题整理(1)
1. 下面代码的结果:
#include <stdio.h>
#include <string.h>int main()
{char arr[] = {'b', 'i', 't'};printf("%d\n", strlen(arr));return 0;
tip:
strlen函数是用来检测字符串长度的,运行的原理就是从开始到'\0'结束。
由于arr是字符串数组,存放了三个数组,结尾没有添加'\0',所以strlen的返回值我们无法确定。
2. 下面代码的结果:
#include <stdio.h>
#include <string.h>
int main()
{printf("%d\n", strlen("c:\test\121"));return 0;
}
tip:
注意,有'\',所以会存在转义字符。
可以转移到我之前写过的关于转义字符的笔记:C语言的收获(4)-CSDN博客
所以,'\t','\121'都是转义字符,前者是水平制表符,后者是八进制的一个字符。
最终可知,结果为7
3.关于C语言算术操作符说法正确的是:
A.除号两边都是小数才能执行小数除法
B.%操作符的操作数可以是证书,也可以是小数
C.%操作符计算的结果是两个操作数整除之后的商
D.负数求模的规则是,结果的正负号由第一个运算数的正负号决定
tip:
A.除号两边只要有一个是小数,就执行小数除法
B.%操作符的操作数只能是整数
C.%操作符计算的结果是两个数整除之后的余数
所以选D
4.下面代码结果是:
#include <stdio.h>
int main()
{int a, b, c;a = 5;c = ++a;b = ++c, c++, ++a, a++;b += a++ + c;printf("a = %d b = %d c = %d\n:", a, b, c);
tip:
此题是关于单目运算符的知识。
c=++a;是前置++,意思是先将a+1,然后再将值赋予c。a=6,c=6。
b=++c,c++,++a,a++。所以c+1,b=c,c+1,a+1,a+1。结果:b=7,c=8,a=8。
b+=a++ +c ; 是b=b+a+c,a+1。结果:a=9,b=23,c=8。
5.关于if语句说法正确的是:
A.if语句后面只能跟一条语句
B.if语句中0表示假,1表示真
C.if语句是一种分支语句,可以实现单分支,也可以实现多分支
D.else语句总是和它的对齐的if语句匹配
tip:
A.if语句后面可以跟多个语句,但是需要加{},将多个语句包含其中
B.if语句中,0表示假,非零表示真
D.else语句不一定,要看具体的代码,如果不规范可能就没有对齐
6.下面代码执行的结果是:
#include <stdio.h>int main()
{int i = 0;for (i = 0; i<10; i++){if (i = 5)printf("%d ", i);
tip:
注意,if语句中的"="作用是赋值,“==”的作用才是相等,所以每次循环到if语句后i都会被赋值为5
所以最终结果会是一直5的死循环。
7. 输入三个整数,从大到小输出
int main()
{int a, b, c;int i = 0;scanf("%d %d %d", &a, &b, &c);if (a < b){i = b;b = a;a = i;}if (a < c){i = c;c = a;a = i;}if (b < c){i = c;c = b;b = i;}printf("%d %d %d", a, b, c);return 0;
}
8.关于关系操作符说法错误的是:
A.C语言的关系操作符就是用来比较大小关系的
B.关系操作符中判断是否相等使用==从
C.==操作符可以用来比较2个字符串是否相等
D.关系操作符参与的关系表达式,通常返回0或者1,表示真假
tip:
C.字符串的比较需要用strcmp,==比较祖父穿比较的是字符串的首元素地址
9.下面代码的执行结果是什么:
#include <stdio.h>int main() {int x = 3;int y = 3;switch (x % 2) { case 1:switch (y) {case 0:printf("first");case 1:printf("second");break;default: printf("hello"); } case 2: printf("third"); }return 0;}
tip:
注意,case1语句结束的时候并没有使用break跳出,所以switch循环并没有在case1完成后结束,而是继续往下执行,所以case2的语句也会被执行,最后结果是hellothird。
10.求最大值
求10个整数中的最大值
正确代码:
int main()
{int arr[10] = {0};int i = 0;int max = 0;for(i=0; i<10; i++){scanf("%d", &arr[i]);}//max = arr[0];for(i=1; i<10; i++){if(arr[i]>max)max = arr[i];}printf("max = %d\n", max);return 0;
}
tip:
&arr[i]表示下标为i的数组中对应元素的地址;
&arr表示数组的地址,&arr[0]表示数组首元素的地址。
max是用来放元素最大值的int数,先放首元素,然后挨个比较,替换大的。
11.分数求和
计算1/1-1/2+1/3-1/4......+1/99-1/100的值
正确代码:
int main()
{int i = 0;int flag = 1;double end = 0;for (i = 1; i <= 100; i++){end += flag * 1.0 / i;flag = -flag;}printf("%lf\n", end);return 0;
}
tip:
注意end+=flag*1.0/i这条代码
其中1.0是为了使得式子不是整除,而是正常的除法
其次flag是决定正负数的标识
最后是+=的复合赋值符,是end=end+某个数,正好可以进行叠加的加法
12.最大公约数
给定两个数,求这两个数的最大公约数
int main()
{int a = 18;int b = 24;int c = 0;while(c=a%b){a = b;b = c;}printf("%d\n", b);return 0;
}
tip:
求最大公约数有很多中方法,上述代码是用辗转相除法
while函数中的c=a%b是为了找到最大公约数,直到该式子结果为0才能判定b为最大公约数
13.关于一维数组描述不正确的是:
A.数组的下标是从0开始
B.数组在内存中是连续存放的
C.数组名表示首元素的地址
D.随着数组下标的由小到大,地址由高到低
tip:
D.内存的存放由系统决定,一般都是下标由小到大,地址由低到高。
14.下面代码的结果是:
#include <stdio.h>
int main()
{int arr[] = {1,2,(3,4),5};printf("%d\n", sizeof(arr));return 0;
}
tip:
(3,4)是逗号表达式,所以数组arr中的元素分别是1,2,4,5.
所以sizeof是算整个数组所占空间的大小,就是4*4=16.