首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >人心易变,这段有趣的C代码也一样,来看一下?

人心易变,这段有趣的C代码也一样,来看一下?

作者头像
Power7089
修改2020-07-28 17:16:15
2740
修改2020-07-28 17:16:15
举报

C语言中的volatile关键字也许大部分人都听过,但实际用过的人可能不多,它的字面意思是“易变的”。今天我们的题目就跟它有关,这也是一道比较著名和经典的面试题,不同公司对它进行过多次考察,代码如下:


int square(volatile int *p){
  return(*p)*(*p);
}

函数意思大家都明白,就是计算整数的平方,就问上面的代码有没有问题?

我们都知道为了提高效率编译器会对程序进行一定的优化,但有时“自作聪明”的编译器也会帮倒忙,刚开始我们提到volatile关键字的字面意思是“易变的,不固定的”,用它来修饰变量,目的就是告诉编译器你不要管我,不要对我进行优化,我是“易变的”。

回到本题,如果说编译器在编译上述代码时,把它等价为如下:


int square(volatile int *p){
  int a=*p;
  int b=*p;
  return a*b;
}

由于volatile的缘故,*p随时可能改变,假如在执行完int a=*p后,*p的值变了,那很显然a和b的值不想等,那计算出来自然也不是平方了,怎么修改呢?如下:


int square(volatile int *p){
  int a=*p;
  return a*a;
}

从今天这道经典的面试题可以看出,面对一些比较少用的关键字,绝对不能掉以轻心,而对于编译器的自动优化问题,它是否帮了倒忙?这也是我们需要考量的一个关键点。其实这些都需要我们具备扎实的编程基本功,只有这样,才能尽量少出错甚至不出错,希望今天的知识对大家有所帮助,感谢耐心阅读!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员阿甘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档