zoukankan      html  css  js  c++  java
  • 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,我也没办法)。

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

  • 相关阅读:
    【Mysql】Mysql在Linux操作系统下在线安装
    【Mysql】Mysql实战:分页查询、(批量)添加、修改、(批量)删除
    【Nginx】Ngnix在Linux操作系统下的安装及搭建
    【Linux】Shell-解压/压缩、软件安装(jdk、tomcat)
    【Linux】用户创建修改切换、文件权限管理
    【Linux】文件操作命令、管道命令、文件编辑命令(VI)
    kafka学习 回顾以及新知识
    Scale Up 和 Scale Out存储架构
    计算机五层网络模型--回顾
    kafka学习(一)
  • 原文地址:https://www.cnblogs.com/volcanol/p/2840048.html
Copyright © 2011-2022 走看看