当前位置: 首页 > news >正文

C语言试题(含答案解析)

单选

1.下面C程序的运行结果为()

int main(void)
{printf("%d", 'B' < 'A');return 0;
}

A.编译错误
B.1
C.0
D.运行错误

'A’的ascii码值为65,‘B’的ascii码值为66,‘B’<‘A’是不成立的,返回0,%d打印的自然是’B’<'A’表达式的值,所以为0,选C

2.若有定义语句:int year=1009,*p=& year;以下不能使变量year中的值增至1010的语句是()
A.*p+=1
B.(*p)++
C.++(*p)
D.*p++

A.*的优先级比+=高,因此先运行 *,即 * p=year的值,即1009+=1,值为1010
B和C ()的优先级最高,因此先运行括号内的 * p,即(1009)++和++(1009),因此为1010
D.*与后置++的优先级相同,因此从右往左进行计算,p为year的地址后置++后是地址++,因此不能使year的值增至1010,选D

3.一个C程序的执行是从()
A.本程序的main函数开始,到main函数结束
B.本程序文件的第⼀个函数开始,到本程序文件的最后一个函数结束
C.本程序的main函数开始,到本程序文件的最后⼀个函数结束
D.本程序文件的第⼀个函数开始,到本程序的main函数结束

程序的执行都是从main函数开始,到main函数return返回结束,因此选A

4.有以下程序

#include<stdio.h>int main()
{int a,b;for (a = 1, b = 1; a <= 100; a++){if (b >= 20) break;if (b % 3 == 1){b = b + 3;continue;}b = b - 5;}printf("%d\n", a);
}

程序的输出结果是()
A.10
B.9
C.8
D.7

第一次进入程序时,a=1,b=1,满足b%3 == 1,因此b=4,并执行continue进入下一次循环;
第二次,a=2,b=4,满足b%3 == 1,因此b=7,并执行continue进入下一次循环;
以此类推,b的值的变化为7,10,13,16,19,21,满足b >= 20,break退出循环,b的值变化了8次,在b从19变化到21时,a++仍然运行,因此a=8,选C

5.下⾯的代码段中,执行之后 i 和 j 的值分别为()

#include<stdio.h>int main()
{int i = 1;int j;j = i++;printf("%d %d\n", i, j);return 0;
}

A.1,1
B.1,2
C.2,1
D.2,2

一开始i=1,j=0;j=i++,由于是后置++,因此j=1,i=2,因此答案选C

6.下面叙述错误的是()

char acX[]="abc";
char acY[]={'a','b','c'};
char* szX="abc";
char* szY="abc";

A.acX与acY的内容可以修改
B.szX与szY指向同⼀个地址
C.acX占用的内存空间比acY占用的大
D.szX的内容修改后,szY的内容也会被更改

A选项:acX与acY都是字符数组,内容都是各自存储在栈上,所以各自内容都可以修改,A正确
B选项:szX与szY都是字符指针,其存储的是字符串"abc"的首元素地址,而字符串"abc"存储在常量区,只存储了⼀份,所以szX与szY指向同⼀个地址,B正确
C选项:acX内容最后还有’\0’,所以acX占用内存空间大于acY占用内存空间,C正确
D选项:字符串"abc"存储在常量区,不可以被修改,D错误,选D

7.在头文件及上下文均正常的情况下,下列代码的运行结果是()

int a[]={ 1,2,3,4 };
int* b=a;
*b+=2;
*(b+2)=2;
b++;
printf("%d,%d\n",*b,*(b+2));

A.1,3
B.1,2
C.2,4
D.3,2

b相当于&a[0];因此* b+=2相当于a[0]+=2;* (b+2)=2相当于a[0+2]=2;b++相当于&a[++0];因此* b相当于a[1]=2,* (b+2)相当于a[1+2]=4,因此选C

8.C语言中,预处理的功能不包括()
A.宏扩展
B.文件包含
C.条件编译
D.都对

预处理过程包括:宏扩展、条件编译、头文件展开、去注释,因此选B

9.有如下C代码片段:

int a[][3]={{0,1},{2,3,4},{5,6},{7}};

则a[2][1]的值为()
A.0
B.2
C.6
D.7
在这里插入图片描述

a数组为4行3列的⼆维数组,一行不满3个元素,不足位置补0,所以,⼆维数组a的内容实际为{{0,1,0},{2,3,4},{5,6,0},{7,0,0}},a[2][1]的值即为3行2列位置的值,
即为6,因此选C

10.下面C程序的运行结果为()

void test(void* data)
{unsigned int value = (此处应填入);printf("%u",value);
}int main()
{unsigned int value =10;test(&value);return 0;
}

A. * data
B. (unsigned int)(* data)
C.(unsigned * )data
D.* ((unsigned int*)data)

void * 类型的指针是不能够直接解引用的,根据题目要求,需要先强转为(unsigned int*)类型后再解引用,因此选D

11.下面C代码的运行结果为()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>void getmemory(char* p)
{p =(char*)malloc(100);strcpy(p,"hello world");
}int main()
{char* str=NULL;getmemory(str);printf("%s\n",str);free(str);return 0;
}

A.hello world
B.Segmentation fault
C.输出null
D.编译错误

在函数传值传参中,形参的改变不会影响到实参,所以指针p内容的修改是不会影响到指针str内容的,所以既是在函数getmemory中指针p指向⼀块动态开辟出来的空间,但是str依旧还是NULL,所以在printf打印过程中会空指针访问,而free(NULL)是不做任何事情,直接返回的,因此选B

12.下面C程序的输出结果是()

#include<stdio.h>int main()
{char* p1="123",* p2="ABC",str[50]="xyz";strcpy(str+2,strcat(p1,p2));printf("%s\n",str);
}

A.xyz123ABC
B.z123ABC
C.xy123ABC
D.运行出错

由于p1,p2指向的内容是存储在常量区的,调用strcat对p1指向内容进行追加时,会直接崩溃,因此选D

13.假定x=500,求下面函数的返回值()

int fun(int x)
{int countx = 0;while (x){countx++;x = x & (x - 1);}return countx;
}

A.2
B.3
C.5
D.6

这是⼀道经典的求数⼆进制位上1的个数的。举个例子,假设x=3,其⼆进制位0011,而x-1为2,二进制为0010,两者按位与,为0010,发现最终结果是比之前x⼆进制位上少了⼀个1的,搭配循环,直到x为0,跳出循环。所以,x=500时,⼆进制为111110100,⼀共6个1,所以,countx为6,因此选D

14.有下⾯C代码片段:

unsigned int a=0x1234;
unsigned char b=* (unsigned char*)&a;

则在32位大端模式机器上变量b等于()
A.0x00
B.0x12
C.0x34
D.0x1234
在这里插入图片描述

大端机模式规则:数据的低位存储在内存的高地址处,数据的高位存储在内存的低地址处。因此选A

15.下面C代码的运行结果是()

#include<stdio.h>void f(char ** p)
{*p+=2;
}void main()
{char* a[]={ "123","abc","456" },** p;p=a;f(p);printf("%s",*p);
}

A.123
B.abc
C.456
D.3
在这里插入图片描述

变量a是指针数组,他的首元素地址就是指向的第⼀个元素(指针元素)赋值给⼆级指针p,而在函数 f 中,使得数组a的第⼀个元素指针的指向,向后偏移了两个,不再指向1位置,而是指向3位置,再用printf打印,自然打印3。因此选D

16.下面程序的输出结果为多少(32位机器上)()

void Func(char str_arg[2])
{int m=sizeof(str_arg);int n=strlen(str_arg);printf("%d\n",m);printf("%d\n",n);
}int main()
{char str[]="Hello";Func(str);return 0;
}

A.5 5
B.5 4
C.4 5
D.4 4

数组函数名作为实参传参本质上来说,形参类型是指针类型,所sizeof(str_arg)得到的是指针的大小,在32位系统下,指针大小为4字节,所以m为4。strlen(str_arg)依旧是算字符串的长度,是遇到’\0’停止的,字符串"Hello"⻓度为5,所以n是5,所以选C

struct Date
{char a;int b;int64_t c;char d;
};Date data[2][10];

在64位系统上,如果Data的地址是X,那么data[1][5].c的地址是()
A.X+195
B.X+365
C.X+368
D.X+215
在这里插入图片描述

首先需要明白⼀点,在64位系统下,int64_t的大小为8字节,有了这个前置知识之后,根据结构体对齐规则求得结构体struct Date的大小为24变量data是⼀个行为2,列为10的date数组,已知data⾸元素地址为X,那么data[1][5]的地址为X + 10 * 24 + 5 * 24 = X + 360,而根据结构体对齐规则的图,变量c相对于起始位置的偏移量为8,所以最终结果是X+360+8=X+368,选C

18.在嵌套使用if语句时,C语言规定else总是()
A.和之前与其具有相同缩进位置的if配对
B.和之前与其最近的if配对
C.和之前与其最近的且不带else的if配对
D.和之前的第⼀个if配对

if语句语法,C语言规定else总是和之前与其最近的且不带else的if配对,而不是按照缩进对齐方式匹配,因此选C

19.以下对C语言的”指针“描述不正确的是()
A.32位系统下任何类型指针的长度都是4个字节
B.指针的数据类型声明的是指针实际指向内容的数据类型
C.野指针是指向未分配或者已释放的内存地址
D.当使用free释放掉⼀个指针内容后,指针变量的值被置为NULL

free指针之后,将指针置空的行为是由程序员⼿动置空的,free不帮助置空,因此选D

20.用变量a给出下面的定义:⼀个有10个指针的数组,该指针指向⼀个函数,该函数
有⼀个整形参数并返回⼀个整型数()
A.int* a[10];
B.int(*a)[10];
C.int(*a)(int);
D.int(*a[10])(int);

首先a为指针数组,因此排除B,C;该指针指向函数,且函数有⼀个整形参数并返回⼀个整型数,由此可以推断出,选D

编程题

  • 反转字符串

在这里插入图片描述

思路:使用类似于双指针法的方式,定义begin,end两个位置来标定交换,对于字符串首尾交换

char* solve(char* str ) {int n=strlen(str);int begin=0;int end=n-1;while(begin<end){char tmp=str[begin];str[begin]=str[end];str[end]=tmp;begin++;end--;}return str;
}

在这里插入图片描述

  • 第一个只出现一次的字符

在这里插入图片描述
思路:字符串只有字母构成,但是需要区分大小写,那么我们首先需要创建⼀个
大小为128的数组,每个位置根据相对关系用来表示每个带下写字母,用128大小的数组是保证每个字母都能够完成映射,因为小写z的ascii码值最大也才122。
首先是遍历字符串,统计出每个大小写字母出现的次数,然后再遍历字符串,找出第⼀个出现⼀次的字⺟。

int FirstNotRepeatingChar(char* str ) 
{int arr[128] = {0}; int len = strlen(str);for (int i = 0; i < len; i++) {arr[str[i]]++;}for (int i = 0; i < len; i++) {if (arr[str[i]] == 1) return i;}return -1;
}

在这里插入图片描述

  • 合并两个有序的数组

在这里插入图片描述

思路:因为A数组后面有足够大的空间,所以我们直接将B数组中的数据添加进A数组后面,然后排序。

int compare(const void* num1, const void* num2)
{return (*(int*)num1 - *(int*)num2);
}
void merge(int* A, int ALen, int m, int* B, int BLen, int n)
{memcpy(A + m, B, sizeof(int) * n);qsort(A, m + n, sizeof(int), compare);
}
  • 只出现⼀次的数字

在这里插入图片描述

思路:按位异或的逻辑的,相同⼆进制位下,⼆进制相同为0,相异为1,而当两个数相同时,那么他的所有⼆进制位上相同位置都是相同的,那么根据异或原理,两个相同数异或为0了,而0跟任意⼀个数异或是本⾝,根据这个性质求解。

int singleNumber(int* nums, int numsLen ) {int result=0;for(int i=0;i<numsLen;i++){result^=nums[i];}return result;
}

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 发布npm包到GitLab教程
  • 树莓派+艺术品,有没有搞头?
  • 网络安全之DC-1靶机渗透实验
  • OZON免费选品工具大揭秘
  • 【Rust光年纪】深度解读:Rust语言中各类消息队列客户端库详细对比
  • azure-search-openai-demo-csharp does not deploy correctly to azure clooad
  • PostgreSQL初始化数据库和用户
  • 哈希表两数求和
  • SpringBoot-读取配置文件方式
  • 智能学习辅助系统——后端部分
  • zigbee笔记、十五、组播通信原理
  • 【60天备战2024年11月软考高级系统架构设计师——第0天:详细规划与学习心得】
  • 为什么需要对即将上线的系统进行压力测试
  • Vue——认识day02
  • 力扣刷题--2185. 统计包含给定前缀的字符串【简单】
  • Android单元测试 - 几个重要问题
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Java,console输出实时的转向GUI textbox
  • Java方法详解
  • Java基本数据类型之Number
  • node和express搭建代理服务器(源码)
  • node学习系列之简单文件上传
  • Python实现BT种子转化为磁力链接【实战】
  • use Google search engine
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 区块链将重新定义世界
  • 深度学习入门:10门免费线上课程推荐
  • 用Canvas画一棵二叉树
  • ​linux启动进程的方式
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (3)nginx 配置(nginx.conf)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ***监测系统的构建(chkrootkit )
  • ./configure、make、make install 命令
  • .NET MVC之AOP
  • .net Stream篇(六)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net反编译的九款神器
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @AliasFor 使用
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)
  • [ 数据结构 - C++]红黑树RBTree
  • [BSGS算法]纯水斐波那契数列