牛客错题整理——C语言(实时更新)

1.以下程序的运行结果是()

#include <stdio.h> 
int main() { 
    int sum, pad,pAd; 
    sum = pad = 5; 
    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
在这里插入图片描述

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关键字的说法错误的是:

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

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

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

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

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

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

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

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

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
仿牛客论坛中,Redis主要用于两个方面的功能:缓存用户信息和生成验证码。 首先,服务器会生成验证码,将这个随机字符串作为Redis的key,将生成的验证码字符串作为value存储在Redis中。这个验证码会存在客户端的cookie里,并且Redis只会保存这个验证码的信息60秒钟。 其次,Redis还用于缓存用户信息。在登录时,服务器会生成一个登录凭证,即LoginTicket,然后将这个LoginTicket存储在Redis中。每次请求时,拦截器会拦截这个LoginTicket,从Redis中获取相应的登录凭证信息。 当用户退出登录时,服务器会将这个登录凭证的状态设置为1,表示已经注销。然后将这个更新后的登录凭证存储在Redis中。 总结来说,仿牛客论坛中的Redis主要用于缓存用户信息和生成验证码。通过使用Redis,可以提高系统的性能和效率,减轻数据库的负载压力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [4.7仿牛客社区项目——Redis优化登录模块(存验证码、登录凭证、缓存用户信息)](https://blog.csdn.net/Doreen_FF/article/details/118274468)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值