近期遇到的奇奇怪怪的面试题

1、今天从朋友那儿搞到了一道看似很怪,却极其简单的一道面试题
int a=0;
while(a<=printf("HI"))
{
    a++;
}
是不是很懵,一个变量怎么会去和一个函数比较呢,我当时也是一头雾水,后来发现忽略了一个最大的点,就是printf的返回值,是不是又懵了,
最简单的一个函数,却想不起来还有返回值这件事了,这也才是这道题的真正考点,printf函数的返回值是字符的个数,所以这里就等价于a<=3,
最终的效果就是打印了三遍HI

2、一个极其被忽略的关键字----volatile
很多知道他的都喜欢叫他关闭优化,但我觉得不够准确,起码这样不好去理解这个关键字到底有什么作用
volatile是易变的,不稳定的意思,【!!!用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系
统,硬件或者其他线程等!!!】使用这个关键字会对该变量的代码不作优化处理,在某些情况可以提供对特殊
地址的稳定访问
volatile和const,大部分人都会觉得他们是水火不容的,既然易变,那肯定和const就是互斥的
其实也不是,起码不完全是,我们一般说的情况都是在内部,但是volatile修饰的变量表示可以
被某些编译器未知的外部因素,如中断,操作系统,硬件,或其他的线程来修改,这个时候,编
译器如果作优化,那么外部效果就没了,所以这里不该被编译器优化,如果同时const修饰,则只
能说明,他不应该被需改,而不是一定不能被改,通过外部手段是可以改的,所以水火容不容是
要看情况的,如果是外部要去操作这个变量,而你因为不希望他改变所以加了const,但是无赖,
但是可能同时你有希望外部操作,不希望优化把外部操作屏蔽,就加了volatile,做了双保险,这
种情况就是可以同时修饰变量的。
从这里也可以知道
const的含义是“请作为常量使用”,而并非“那肯定不能变”
volatile的含义是“请不要作没谱的优化,我外部可能会使这个值变掉的”,而并非“你可以改这个值”,
所以不要妄想在没有可能出现外部操作的时候,通过此法来改变const修饰的值。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值