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;给注释起来的缘故了。
- C/C++字符变量无法显示的问题
- C语言实验--字符变量的输入输出
- 【C语言】字符变量间的减法
- C语言实验--字符变量的输入输出
- C语言实验--字符变量的输入输出
- C中字符的问题
- c的一些学习感悟(字符变量和字符指针)
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
- cli 下无法移动光标,出现^[[D ^[[C等字符的问题
- C字符变量地址输出
- Objective-C初探-Objective-C NSLog 显示变量的值
- iPhone代码碎片:处理objective-c里html特殊字符显示问题的一个函数
- C++MFC程序窗口无法显示最大最小化按钮问题
- c变量声明问题
- C中关于字符的问题
- Rest API 概述
- 【综述】(MIT博士)林达华老师-"概率模型与计算机视觉”
- 在Winform动态启动、控制台命令行的方法
- 使用 CXF 做 webservice 简单例子
- 稀疏矩阵的十字链表存储的思路
- C/C++字符变量无法显示的问题
- 独一无二的职位:开源社区经理
- 字典序问题
- oracle的一些高级学习网址收集
- ݿհʊtel1353005-6393
- 函数PostEvent、triggerevent详解
- NGUI显示中文问题
- 提升网站流量的七大小方法
- cxf服务端+spring整合配置+axis2 1.6客户端配置