C语言学习趣事_这样的IF子句Condition你伤的起吗?

  前两天我在一个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,我也没办法)。

  这里欢迎各位大神来讨论, 有不对的地方敬请拍砖。

原文地址:https://www.cnblogs.com/volcanol/p/2840048.html