【C语言】练习题整理:11

前言

今天是10道选择题

1

题目

下面代码段的输出结果是:

int main() 
{
	int a = 3;
	printf("%d\n", (a += a -= a * a)); 
	return 0;
}

答案

-12

知识点

自右至左的结合方向称为“右结合性”。最典型的右结合 性运算符是赋值运算符。
如x=y=z,由于“=”的右结合性,应先执行y=z,再执行x=(y=z)运算。
C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。

计算顺序是从左至右
先计算a * a,
再依次向左计算

a * a == 9
3 - 9 == -6
-6 + -6 == -12

2

题目

若运行以下程序时,从键盘输入 ADescriptor<回车> ,则下面程序的运行结果是

#include 
int main()
{
	char c;
	int v0 = 0, v1 = 0, v2 = 0;
		do
		{
			switch (c = getchar())
			{
			case'a':case'A':
			case'e':case'E':
			case'i':case'I':
			case'o':case'O':
			case'u':case'U':v1 += 1;
			default:v0 += 1; v2 += 1;
			}
		} while (c != '\n');
		printf("v0=%d,v1=%d,v2=%d\n", v0, v1, v2);
		return 0;
}

答案

v0=12,v1=4,v2=12

讲解

这道题容易做出v0=8,v1=4,V2=8这样的结果

但我们需要注意的是:case后面没有break的话,会一直执行下去
所以default一共执行了12次

3

题目

如下函数是求两个int数字最大公约数的,指出其中存在的问题【多选】

int gcd(char x, char y)
{
	int min = x < y ? x : y;
	for (min = 0; min > 0; min--)
		if (x% min = 0 && y % min = 0)
			return min;
}

A: 参数类型不对
B: 循环变量min初值不对
C: 判断等于的符号不对
D: 返回类型不对

答案

A、B、C

讲解

这就是一道简单的概念题

A:函数实参是int类型,形参用char,发生截断,数据丢失
B:min在for循环中,被初始化为0,与传入的参数已经无关了
C:if条件判断处,将判断相等符号==,写成赋值符号=
D:虽然这个函数不是在所有条件下都有返回值,但这里返回值类型没问题

4

题目

下列 for 循环的次数为

for (int i = 0; i || i++ < 5;);

答案

无限次

知识点

i先使用再增加,
使用:0<5,为真,值是1
增加:i增加为1,
判断条件:1||1,恒为真,死循环

5

题目

在c语言中,一个函数不写返回值类型,默认的返回类型是

答案

int

知识点

我第一次知道这个知识点

6

题目

设函数 fun 和实参数组的说明是如下形式,则对函数的调用语句中,正确的是

void fun(char ch, float x[]);
float a[10];

A: fun(“asd” , a[]);
B: fun(‘x’ , A);
C: fun(‘68’ , 2.8);
D: fun(32 , a)

答案

D

知识点

数组传参只传入数组名就可以了,
如C选项这种,传入的是float类型,与数组无关

7

题目

在上下文及头文件均正常的情况下,下列代码的输出是( )(注: print 已经声明过)

int main()
{
	char str[] = "Geneius";
	print(str);
	return 0;
}
print(char* s)
{
	if (*s)
	{
		print(++s);
		printf("%c", *s);
	}
}

答案

suiene

知识点

这段代码就是使用递归倒序打印字符串
但因为是++s,在回归时s指向的对象已经不是第一个字符了,所以打印不出G

8

题目

在下面的字符数组定义中,哪一个有语法错误( )

A:char a[20]="abcdefg"; 
B: char a[]="x+y=5."; 
C: char a[15]; 
D: char a[10]='5'

答案

D

解法

’5‘是字符常量,不能用于数组的初始化

9

题目

下列定义数组的语句中正确的是【多选】( )

A:#define size 10
  char str1[size], str2[size+2];
B:char str[];
C: int num['10'];
D:int n=5; 
  int a[n][n+2];

答案

AC

解法

这里对C和D做一下解释

C:
字符’0’,转换成十进制为48,所以C选项最终为

int num[48]

D:
注意:在C99之后支持使用变长数组
但这是特例,在此不做考虑

10

题目

已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】()

A: *(X[i]+j) 
B: *(X+i)[j] 
C: *(X+i+j) 
D: *(*(X+i)+j)

答案

BC

解法

A选项是 正确的,X[i]就是第i行的数组名,数组名表示首元素的地址,X[i]表示第i行的第一个元素的地址,+j后就是第i行下标为j的元素的地址,整体解引用就是X[i][j],A正确。
B选项因为[]的优先级高于*,所以代码相当于**((x+i)+j),X+i+j后就越界了,并不代表X[i][j],所以错误。
C选项也明显不对,X是二维数组的数组名,数组名相当于第一行的地址,X+i+j,跳过了i+j行,就越界了,C错误。
D选项是标准的指针形式访问二位数组的一个元素。

结语

这篇文章到这里就结束了,我们下篇文章见~

你可能感兴趣的:(C语言错题集,c语言,算法,开发语言)