2024年运维最新牛客错题整理——C语言(实时更新),手持4个大厂offer的我

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

pAd = ++sum, pAd++, ++pad; 
printf("%d\n",pAd); 

}


答案为7  
 由于赋值运算符的优先级高于逗号表达式,因此pAd = ++sum, pAd++, ++pad;等价于(pAd = ++sum), pAd++, ++pad; sum 先自增然后赋值给 pAd,pAd 为 6,然后 pAd 自增变为 7。逗号表达式的结果为最后一个表达式的值,因此正确答案为 7。


## 2.哪一句会出错?



char* s=“AAA”; //1
printf(“%s”,s); //2
s[0]=‘B’; //3
printf(“%s”,s); //4


第3句  
 初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。S[0]只可读,不可写


## 3.对于如下C语言函数:fun(5)的结果为()



int fun (int n) {
int x = 1, k;
if (n == 1) return x;
for(k = 1; k < n; ++k)
x = x + fun(k) * fun(n - k);
return x;
}


答案为51  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/19bc1a304f4f41979f314b07b2ee41ca.png)


## 4.以下程序的输出结果为



#include <stdio.h>
int func(int x, int y) { return (x + y); }

int main() {
int a = 1, b = 2, c = 3, d = 4, e = 5;
printf(“%d\n”, func((a + b, b + c, c + a), (d, e)));
return 0;
}


答案为9  
 逗号表达式是一组由逗号分隔的表达式,这些表达式是从左向右计算。逗号表达式的结果是其最后边表达式的值,如果最后边的操作数是左值,则逗号表达式的值也是左值。此类表达式通常用于for循环。


## 5.若有int w=1, x=2, y=3, z=4;则条件表达w < x ? w : y < z ? y : z的值是3.


答案为 错误


因为条件运算符的结合方向是从右往左的。所以上述表达式的值应当先计算后面那个条件运算符:?的值,即w<x?w:(y<z?y:z)。因此执行顺序为:因为y小于z为真,因此 w<x?w:y,因为w小于x为真,因此表达式的值为w。


## 6.下列代码运行出错,可能会是哪一行引起的?



void getMemory(char *p) {
p = (char *)malloc(100); // 1
}

int main(int argc, char const *argv[]) {
char *str = NULL;
getMemory(str);
strcpy(str, “hello wrold”); // 2
printf(“%s\n”, str); // 3
free(str); // 4
}


第2句  
 1)调用getMemory(str)后,str并未产生变化,依然是NULL(由于str是按值传递的)。只有形参p指向了一块新申请的空间。  
 2)程序运行到strcpy( str, “hello world” );处将产生错误


## 7.以下程序的输出结果是()



int main() {
int s, i;
for(s = 0, i = 1; i < 3; i++, s += i);
printf(“%d\n”, s);
}


答案为5  
 逗号运算符是由多个表达式构成的,而不是整体看成一个表达式,即i++是一个表达式,s += i也是一个表达式,所以在执行s += i之前,i已经完成了一次自增。  
 (1)如果for后面没有分号,printf这句话就是for里面的语句。就会先执行printf再执行转化条件。  
 则先执行循环初试条件s=0,i=1,判断1<3,输出0,执行转化条件i=2,s=2。此时回到判断2<3,输出2。i=3,s=5。再判断3<3为0,跳出循环。  
 (2)现在题目在for后有分号,则for里面是空语句,先s=0,i=1,控制条件1<3结果为1,执行第二个分号后的句子,因为i++后面有逗号,所以i已经加了1,s加的是经过+1后的i,i=2,s=2。第二次循环2<3成立,i=3,s=2+3=5。第三次3<3判断结果为0,循环结束。但因为第二次循环的转化条件已经执行了。所有输出的是5。


## 8.对于下面代码段y的值为( )



int x = 3, y = 3;
int t = ++x || ++y;


答案为3  
 有两个坑,第一,求的是y而不是t 第二,或运算里,左侧是1右边就不执行,与运算类似。  
 当解析器遇到了||时,只要前面的++x为真,后面的语句就不执行了。


## 9.写出下列程序在X86上的运行结果



struct mybitfields
{
unsigned short a : 4;
unsigned short b : 5;
unsigned short c : 7;
} test

void main(void)
{
int i;
test.a = 2;
test.b = 3;
test.c = 0;

i = \*((short \*)&test);
printf("%d\n", i);

}


答案为50  
 由栈的基本知识(高到低),栈上分配的空间顺序是:c,b,a  
 定义结构体里面用到的冒号的含义相当于分配几位空间,也即在定义结构体的时候,分配的成员a 4位的空间, b 5位,c 7位,一共是16位,正好两个字节。示意:  
 test.a 0 0 1 0  
 test.b 0 0 0 1 1  
 test.c 0 0 0 0 0 0 0  
 所以全部总和起来:0000 0000 0011 0010  
 在执行i=\*((short \*)&test); 时,取从地址&test开始两个字节(short占两个字节)的内容转化为short型数据,即为0x0032,再转为int型为0x00000032,即50


## 10.在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为()?


答案为1  
 类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,空类的sizeof为1,而不是0.  
 多重继承的空类的大小也是1.


## 11.函数的形式参数隐含的存储类型说明是()


答案为auto  
 函数的隐含储存类型是extern,函数的形参或变量的储存类型为auto


## 12.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是()


答案为:函数调用可以作为一个函数的形参  
 返回值存在寄存器中,没有地址,不能作为形参,但可以作为实参。


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



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


答案为2,4  
 从第一步开始  
 \*b+=2;// \*b=*b+2;  
 是将*b指向地址的值加了2,就是a[0]=3


\*(b+2)=2;  
 等价a[2]=2。  
 数组变成a[4]={3,2,2,4}


b++;  
 b指向a[1];  
 当b++时,指针指向的第二个元素的地址,*b=2,b+2后指针指向第四个元素,*(b+2)=4;


## 14.以下叙述中不正确的是()


C程序中的#include和#define均不是C语句(这句正确)  
 在C程序中,赋值运算符的优先级最低(这句错误)  
 答案为:c语言中,逗号优先级最低。 用分号;结尾的才看成是C语句  
 一共有十五个优先级:  
 1 () [] . ->  
 2 ! ~ -(负号) ++ – &(取变量地址)\* (type)(强制类型) sizeof  
 3 \* / %  
 4 + -  
 5 >> <<  
 6 > >= < <=  
 7 == !=  
 8 &  
 9 ^  
 10 |  
 11 &&  
 12 ||  
 13 ?:  
 14 = += -= *= /= %= |= ^= &= >>= <<=  
 15 ,  
 括号成员第一; //括号运算符 成员运算符. ->  
 全体单目第二; //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&  
 乘除余三,加减四; //这个"余"是指取余运算即%  
 移位五,关系六; //移位运算符:<< >> ,关系:> < >= <= 等  
 等于(与)不等排第七; //即== 和!=  
 位与异或和位或,“三分天下”\*\*\*十; //这几个都是位运算: 位与(&)异或(^)位或(|)  
 逻辑或跟与,十二和十一; //逻辑运算符:|| 和 &&,注意顺序:优先级(||) 低于 优先级(&&)  
 条件高于赋值, //三目运算符优先级排到13 位只比赋值运算符和","高  
 逗号运算级最低! //逗号运算符优先级最低


## 15.对于int \*pa[5];的描述,正确的是()


pa是一个具有5个元素的指针数组,每个元素是一个int类型的指针;  
 看定义记得注意优先级,


int *pa[5],首先[]优先级比*高,所以pa与[]先结合,pa[5]表明pa是一个数组,大小是5,既然知道pa是数组了,接下来就是确认数组元素了,int\*表明数组元素是指针;  
 int(*p)[5],首先()优先级比[]高,所以pa先与*结合,\*pa表明pa是一个指针,既然知道pa是指针,接下来确认指针指向的数据类型,int [5]表明指针指向大小为5的int型数组。


## 16.若有代码段



int *p = (int *)malloc(sizeof(int));


则向内存申请到的内存空间中存入整数123的语句为( )  
 scanf(“%d”, p);


## 17.下列关于const关键字的说法错误的是:


推荐使用以下方面定义类成员数组: class A{ … const size\_t SIZE=100; int \_array[SIZE]; };


静态整型常量数据成员)才能在类内初始化,const 不可以 类型 初始化方式 类内 ( 声明 ) 类外 ( 类实现文件 ) 构造函数中 构造函数的初始化列表 非静态非常量数据成员 N N Y Y 非静态常量数据成员 N N N Y (must) 静态非常量数据成员 N Y (must) N N 静态常量数据成员 Y Y N N


## 18.已知:int x,y;double z;以下语句中错误的函数调用是()


scanf(“%x%o%6.2f",&x,&y,&z);



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值