C/C++字符变量无法显示的问题

来源:互联网 发布:lol s8 知乎 编辑:程序博客网 时间:2024/05/24 06:15

快要找工作了,最近在狂看《程序员面试宝典》(第二版),中间有个题目,作者解释错了。更重要的是,里面有个细节,导致我弄了好久才搞懂,现在拿出来分享下。下面是书中P37的源代码:

面试例题1: 下面程序的输出结果是多少?

#include<iostream>using namespace std;int main(){unsigned char a = 0xA5;unsigned char b = ~a >> 4;//cout << b;printf("b=%d\n",a);return 0;}

书中估计是印错了,printf语句中应该是b。因为如果是a的话,直接输出165了,根本不用算的。修改后的源代码为:

#include<iostream>using namespace std;int main(){unsigned char a = 0xA5;unsigned char b = ~a >> 4;//cout << b;printf("b=%d\n",b);return 0;}

如果按照输出b处理,按照书中给出的注解,最终输出就结果是245。但是解释出了问题,首先关于运算符优先级,取反运算符"~"比右移运算符“>>”优先级高,书上说反了。计算过程应该是这样的,先将a强制转换成int型得0000 0000 1010 0101,再对a取反得1111 1111 0101 1010,然后再右移4位得0000 1111 1111 0101,再对其强制类型转换为unsigned char型得1111 0101(245).这就是最终答案。


另一个值得注意的地方就是//cout << b;这句话表达很简洁,而且符合C++标准,为什么会被注释起来了呢?我觉得心里有疑问,就把注释打开了,结果运行了一下,什么都没有输出。我觉得很郁闷,把b强制类型转换到int确实为245,但就是没有输出字符。我用printf("b = %c\n",b);输出,结果得到一个‘?’。这让我感到更奇怪了,为什么用printf就可以,用cout就不行了呢?然后我又试了用相同的语句输出a,得到的结果仍是‘?’,这说明printf语句虽然输出了,但是输出的是错误的结果。为什么会有这个问题呢?原因是unsigned char类型规定的字符数仅有128个,超过这个限制就没有字符了。按照这个思路给a重新赋值128,还能显示字符,结果赋值129或者更大的数就不输出任何东西了。

总结:细节决定成败,虽然只是一个小问题,却包含了很多内容啊!这就是为什么命题人把cout << b;给注释起来的缘故了。


原创粉丝点击