【程序笔记】第一期-深究bool类型

来源:互联网 发布:淘宝 企业店铺 编辑:程序博客网 时间:2024/05/16 15:57

Lucky_Glass的程序笔记

第一期:《深究bool类型》


众所周知,bool类型只有一个字节(使用sizeof可以查看),非常小,C++官方申明的bool值只有true(1)和false(0)。但是今天作者要告诉大家一些关于C++ bool类型的其他用法。


一、bool类型的读入与输出
虽然官方并不支持bool类型的读入以及输出。但由于true和false分别可以用1和0表示,所以我们仍然可以用 scanf("%d")来读入的。C++还申明“非0即真”,所以输入任何一个非0的数在表达式中均为true。输出依然可以用printf("%d")来完成,它如何输出呢?这取决于bool变量的存值,它也可以储存整数,输出的正是它所储存的那一个整数。

二、bool类型的存值
这个将作为本期讲解的重点。int类型有4个字节,因此最大能储存到2147483647。数字也是众多数据类型的基础,char也能够用ASCII码转换为数字形式。但是bool类型之前提过,只有一个字节,我们可以推断bool的数字形式最大能储存到255,也就是1字节能够储存的量。
我们熟悉bool的true、false的赋值,但是如何给它赋值为一个数字呢?直接用’=’(赋值号)可以吗?作者编写了一个代码如下:

/*Lucky_Glass*/#include<cstdio>int main(){    bool Check;    Check=20;    printf("%d\n",Check);    return 0;}

大家可以试试,答案是1,也就是说20并没有真正地储存到变量Check里面,存进去的只是“非0即真”所转化的true。那么如何存值呢?据作者试验,scanf是可以把整数存入bool变量的。程序如下:

/*Lucky_Glass*/#include<cstdio>int main(){    bool Check;    scanf("%d",&Check);    printf("%d\n",Check);    return 0;}

输入一个非负数,那么这个程序会输出你输入的数。但是如果你输入负数的话,它的存值将会是bool类型的最大值(255)加上那一个负数(比如输入”-1”,那么它会输出”254”,即255+(-1))。那么这有一个好处——bool类型自带非负性,也许在一些时候能够帮助你。

三、bool类型的运算
讲这一个几乎没有什么用,但是作为一个比较特别的地方,还是讲解一下。这是一个普通的“a+b”程序:

/*Lucky_Glass*/#include<cstdio>int main(){    int a,b;    scanf("%d%d",&a,&b);    printf("%d\n",a+b);    return 0;}

那么大家试一试把第5行的int改为bool?就像这样:

/*Lucky_Glass*/#include<cstdio>int main(){    bool a,b;    scanf("%d%d",&a,&b);    printf("%d\n",a+b);    return 0;}

它会输出什么?直接说吧,当你输入非负数(以下均不能超过255),它总会输出你输入的后一个数,即bool类型的a+b=b(比如输入“5 32”,会输出32)。但是如果输入负数就十分有趣!当你输入2个负数时,它会输出511加上第二个负数(比如输入“-14 -3”,会输出508)。当你第一个数是负数,第二个数是非负数时,它会输出那一个非负数。当第一个数是非负数,第二个数是负数时,它的结果也是511加上那一个负数(比如输入“2 -3”,会输出508)。
再来减法(把之前的程序的‘+’改为‘-’就行了)。首先是一个任意数和一个非负数,会输出该非负数的相反数(比如输入“-3 4”,会输出“-4”)。然后是一个任意数与一个负数,会输出该负数的绝对值减1(比如输入“3 -4”,会输出“3”)。
剩下的‘*’(乘)和‘/’(除)以及‘%’(取模)作者就直接说了——无论输入什么,bool的乘法结果总是为0,大家可以试一下;至于除法和取模大家还是不要试了,会运行错误。


以上是本期的全部内容,这是作者的第一篇笔记,希望大家支持。作者在评论区中收集一下大家的意见,如果大家觉得可以,请告诉作者,作者会坚持做下去的,谢谢!

—Lucky_Glass