前两天我在一个QQ群里面,看到一个群友发了一段“奇特的”C++代码,应该算是C++吧,我也说不准了。下面我们看看整个的讨论过程。
上面是我大体截取的部分对话过程,应该是连贯的,这里我就迷惑了,给他们一弄我动摇了,动摇的不是我对这个推理过程的认识,而是我无语的动摇了。
这里我对VTC_King同学的这种探索精神表示赞赏,俗话说:尽信书不如五书。
下面是我对这个程序的执行过程:
从上面的过程来看,程序如我所说,成功的编译,而且我开启的是-Wall编译选项;而且程序编译后成功执行,但是输出的结果
也和我预想的一样,没有输出:Yes.
那么我们如何看这个过程呢?
为了弄明白这个过程,我可是废了很大的神,下面就慢慢的来扯一下:
【C/C++中bool型变量的存储空间】
1、百度空间的说法
链接地址:http://hi.baidu.com/maxy218/item/b8dce172fa37d11cd1dcb3cf
2、百度百科的说法
链接地址:http://baike.baidu.com/view/1557195.htm
3、CSDN rushkid02的专栏 blog的说法
4、维基百科的说法
5、我自己在Linux FC4中跑出来的结果:
这里我们基本可以确认在C++的编译过程中,bool类型的变量存储空间为1个字节(但是具体还要看编译的实现,不过目前来看,应该都是这样处理的)。
【关于 (char &)b=2; 这个赋值语句】
我们知道赋值的过程说起来很容易,但是这个地方却被VTC_King同学搞的有点复杂了,首先来看这个赋值语句的右值部分:2;为一个int整型字面值。
而左值部分:(char &)b
b为bool型变量,从前面的论述来看,这个变量的存储空间是一个字节;刚好满足char字符的存储空间;而赋值的实际过程是将一个值存储到变量所代表的
内存空间,因此我们可以看到 (char &)b=2; 这个语句将整型字面值存储到了b所代表的那个大小为1个字节内存空间,同时这个赋值语句在将内容存储到
内存空间之间进行了类型转换,这样2就很安全的住到了他的 “新家”; 即 b 代表的那个字节现在存储的内容是(char)2 这个字符。
这与我们通常认为的bool类型赋值隐式转换出现了偏差;我们来看一段摘自C++之父写的书的一段话:
虽然是翻译成汉语了,但是意思我看了原本的,应该来说就是这样的。
【要点】 这里引用这段话,后面的论述还需要用到。
最后:
这里我们确定了,经过 (char &)b=2; 这个赋值语句后,b中存储的内容是 (char)2
下面是验证的结果:
可以看到输出的结果是: blank 字符
查表知道:
(char)2 就是:STX 为非打印字符
我们还可以通过该变一下来验证:
【关于 == 和 &&】
在QQ中讨论的时候,我就说过 “==” 是关系运算符,而 bool 量是用于逻辑运算的;结果被VTC_King同学鄙视了;哎,真是骚年无谓啊。我也
不说别的,就摘引一段C Programing Language 中的一段话吧:
下面是英文原版:
这个话题就不多说了吧,相信明眼人都知道怎么回事。
【关于 if(b==true) 这个计算过程】
这里我真不想说了, 至于true在计算的过程中,怎么转换,请看我引用的C++之父的书的中文翻译版,而b的值我想更不需要说了吧,前面已经论述过了。
【结语】
那么到了这里这个“奇特而诡异的”程序的运行过程怎么样呢?
你还有疑问吗?
按:
我真佩服现在这些学生的创造力啊, 算了还是不说了。
最后还想说一句: 现在很多童鞋,一遇到事就拿汇编来说事,哎,真的没办法了,我只能说一句C是C,汇编是汇编。要知道这个世界有很多的汇编,但是C标准
就一个(我的意思是所有的人都遵循一个标准,你要说C有ANSI C、C89、C90、还有什么C99,我也没办法)。
这里欢迎各位大神来讨论, 有不对的地方敬请拍砖。