C语言-习题整理(1)

发布于:2025-04-16 ⋅ 阅读:(34) ⋅ 点赞:(0)

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.