c语言经典测试题12

1.题1

cpp 复制代码
float f[10];
// 假设这里有对f进行初始化的代码
for(int i = 0; i < 10;)
{
if(f[++i] == 0)
break;
}

上述代码有那些缺陷()

A: for(int i = 0; i < 10;)这一行写错了 B: f是float型数据直接做相等判断有风险

C: f[++i]应该是f[i++] D: 没有缺陷

我们来分析一下:我们创建了一个float类型的数组,for循环中没有调整步骤,但是在if()中却有一个调整i变量的操作,可以弥补没有调整的操作,我们知道for循环中可以没有调整但是肯呢个会导致陷入死循环。显然在这里是不会存在的。还有就是float类型的数据如果直接相等是可能出问题的,因为浮点数在存入内存时可能保存不完整,这样的话可能你不会得到想要的结果,在这里++i是一个前置++,这样的话会使f数组中的第一个元素得不到比较,这会影响代码的严谨。所以我们应该选B,C

2.题2

cpp 复制代码
void GetMemory(char **p, int num)
{
if(NULL == p && num <= 0)//1
return;
*p = (char*)malloc(num);
return;
}
int main()
{
char *str = NULL;
GetMemory(&str, 80); //2
if(NULL != str)
{
strcpy(&str, "hello"); //3
printf(str); //4
}
return 0;
}

上述代码有那些错误的地方()

A: 1 B: 2 C: 3 D: 4

我们来分析一下:1处是为了避免直接传入空指针,和传入的数值不能为0,所以这里应该用或,如果用的是&&的话,是两个同时成立才会直接返回。所以1错误。2处大家会不会觉得是错的呢?在这里我们对空指针str进行取地址操作,看上去像是错的,其实这只是未定义行为,并不是错的,而且我们的GetMemory函数中是不能直接传空指针,但是没有规定不能通过地址找到str。3处strcpy函数的参数是目标空间的地址,和需要复制空间的地址,这两个参数都是一级指针,但是在这里我们对str进行了取地址操作,这样的话我们strcpy就需要用二级指针来解说,很显然strcpy不具备这个条件,所以3是错的。4是对的,之前有说过。

3.题3

cpp 复制代码
#include <stdio.h>
typedef union
{
int a;
struct
{
short b;
short c;
};
}X;
int main()
{
X x;
x.a = 0x20150810;
printf("%x,%x\n", x.b, x.c);
return 0;
}

上述代码运行结果可能是()

A: 2015,810 B: 50810,201 C: 810,2015 D:`20150,810

我们来分析一下:对于0x20150810

如果按照大端模式存储:从低地址到高地址:20 15 08 10 输出从低地址到高地址:20 15 08 10

如果按照小端模式存储:从低地址到高地址:10 08 15 20 输出从高地址到低地址:08 10 20 15

此数以int类型赋值给联合体x.a,而以结构成员b和c分开访问,分别拿到低地址的2个字节和高地址的2个字节,大端下是2015和810,小端下是810和2015

4.题4

cpp 复制代码
#define MAX 255
int main()
{
unsigned char A[MAX], i;
for(i = 0; i <= MAX; i++)
A[i] = i;
return 0;
}

上述这个程序执行后会有什么错误或者效果()

A: 数组越界 B: 死循环 C: 栈溢出 D: 内存泄露

我们来分析一下:我们定义了一个MAX值为255,我们知道无符号的char最大值为255,再加1就变为0,我们的for循环判断条件为i<=MAX但是我们的i最大也只能为255,所以不可能让循环停下来。所以程序会陷入死循环,还有一个问题我们的A[i]中的i=Max时,就会导致数组越界。这里没有不断地申请空间,且也不是在动态内存中申请的空间。

5.题5

2、给定一个长度为n的数组 nums ,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任 何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于 2.假设 nums[-1] = nums[n] = 负无穷小 3.对于所有有效的 i 都有 nums[i] != nums[i + 1]

示例: 输入:[2,4,1,2,7,8,4] 返回值:1 说明:4和8都是峰值元素,返回4的索引1或者8的索引5都可以

cpp 复制代码
int findPeakElement(int* nums, int numsLen ) {
//边界情况处理,1个元素前后都是负无穷 以及 0号位置大于1号位置,-1位置负无穷的情况
if (numsLen == 1 || nums[0] > nums[1]) return 0;
//末尾位置数据大于上一个位置数据,而nums[numsLen]负无穷的情况
if (nums[numsLen-1] > nums[numsLen-2]) return numsLen-1;
int left = 0, right = numsLen - 1, mid;
while(left < right) {
mid = left + (right - left) / 2;
if (nums[mid] < nums[mid + 1])//中间比右边小,意味着右边肯定有个峰值
left = mid + 1;
else //否则在左边包括当前位置肯定有个峰值
right = mid;
}
return left;
}

谢谢

相关推荐
流星白龙14 分钟前
【C++习题】10.反转字符串中的单词 lll
开发语言·c++
尘浮生21 分钟前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
MessiGo22 分钟前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
Tech Synapse28 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
乌啼霜满天24936 分钟前
JDBC编程---Java
java·开发语言·sql
色空大师1 小时前
23种设计模式
java·开发语言·设计模式
Bruce小鬼1 小时前
QT文件基本操作
开发语言·qt
2202_754421541 小时前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
我只会发热1 小时前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
懷淰メ1 小时前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5