这是一个由“&&”和“&”引发的一点点思考
前言
距离上次发博客已经过了亿天,这次的内容主要是关于C/C++中“&&”和“&”的一个关注点,起因是我在某个初学者群中的一位群友发了一个很简单的题,答案也很明显。就在我很自然地想出其他选项的错误之处时,我却发现,可能答案并非如此。
题目
这是一道特别简单的题目,一眼瞄过去很容易确定答案C,A、D选项很明显,C/C++中并没有这种用法 ,问题就出在B选项,一开始我也以为B是错误的,但我突然想到按位与“&”的性质,并且C/C++中,布尔类型的false和true分别于整型中的0和1等效,“&”的规则是“有0为0”,也就是说,当两边都为1,也就是true的时候,表达式为真,所以B选项的表达式是可以满足题意的。我们接下来做验证。
验证
首先我们需要验证false和true与0和1的等效关系
由结果我们可以看出,“&”确实会在进行运算时将“false"变为“0”,将“true”变为“1”
接下来我们需要验证B选项的表达式是否可以正确判断出大写字母 ,以下是代码和结果
#include<stdio.h>
int main()
{
for (char ch = 6; ch <= 125; ch++)
{
if ((ch >= 'A') & (ch <= 'Z'))
printf("%3d %c:Yes ", ch, ch);
else
printf("%3d %c:No ", ch, ch);
if (ch % 5 == 0)
printf("\n");
}
return 0;
}
这里由于存在一些不可打印字符,所以有输出错误,但结果很明显,该表达式确实可以判断字符型变量ch是否是 大写字母
总结
在我提出这一问题之后,有群友理所当然的反驳我,并且他提到“& 和&& 完全是两个意思”,但两个不同的运算符与思路当然可以解决同一个问题,也没有规定必须使用哪一种方法。
当然,“&”的方式并没有“&&”的方式直观、好用,在编写时,编译器也会给出警告
我写这篇博客的目的也并不是让大家去使用“&”的方法,我只是想向大家传达一个观念:你认为习以为常和理所当然的,并不一定就是对的。同时也希望提醒大家,不要习惯于用理所当然的观念来判断事物。