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

前言

今天是10道选择题

1

题目

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

c 复制代码
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<回车> ,则下面程序的运行结果是

c 复制代码
#include <stdio.h>
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数字最大公约数的,指出其中存在的问题【多选】

c 复制代码
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 循环的次数为

c 复制代码
for (int i = 0; i || i++ < 5;);

答案

无限次

知识点

i先使用再增加,

使用:0<5,为真,值是1

增加:i增加为1,

判断条件:1||1,恒为真,死循环

5

题目

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

答案

int

知识点

我第一次知道这个知识点

6

题目

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

c 复制代码
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 已经声明过)

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

答案

suiene

知识点

这段代码就是使用递归倒序打印字符串

但因为是++s,在回归时s指向的对象已经不是第一个字符了,所以打印不出G

8

题目

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

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

答案

D

解法

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

9

题目

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

c 复制代码
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选项最终为

c 复制代码
int num[48]

D:

注意:在C99之后支持使用变长数组

但这是特例,在此不做考虑

10

题目

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

c 复制代码
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选项是标准的指针形式访问二位数组的一个元素。

结语

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

相关推荐
一颗花生米。2 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼2 小时前
Java基础-单例模式的实现
java·开发语言·单例模式
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
通信仿真实验室3 小时前
(10)MATLAB莱斯(Rician)衰落信道仿真1
开发语言·matlab
勿语&3 小时前
Element-UI Plus 暗黑主题切换及自定义主题色
开发语言·javascript·ui
hsling松子4 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1235 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝5 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King6 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉