有人可以解释&和和&&?

时间:2016-12-06 11:08:40

标签: c++ c++11

第一学期学生在这里。我对bitand(&)和逻辑和(&&)之间的差异感到困惑,与bitor(|),逻辑或(||)和Xor(^)相同。具体来说,我有一些代码,我认为需要||或者&&功能,但..显然不是?这是有问题的代码:

cout << "Please enter your biological sex (M or F): " << endl;
cin >> sex;

//Repetition Structure
while (toupper(sex) != 'M' && 'F')
{
    cout << "Invalid entry. Please enter your biological sex (M or F): " << endl;
    cin >> sex;
} //end while

我尝试使用||起初,但无论我如何回答,它都给了我“无效录入”的回复。我在论坛上环顾四周,发现&amp;&amp;会更好并尝试使用它。它起作用了 - 起初。然后,由于没有明显的原因,它停止以'F'作为答案(代码没有改变)。

为了解决这个问题,我尝试使用失败的Xor(^),然后使用bitand(&amp;,而不是&amp;&amp;),这显然使其再次正常运行。但是,我已经看到警告你仍然可以使用&amp;和或者&amp;&amp;,但是一个不等于另一个并且可能在以后引起问题。这就是我需要澄清的原因(同样,这也是一件好事)。

更新:由于这被标记为重复,我将澄清我的意图:我想了解更多关于&amp;和&amp;&amp;,为什么你使用一个而不是另一个,以及^,|的相同信息和||。标记的线程具有使用一个与另一个的示例,但它们不解释操作本身的细节。当我努力理解操作本身的本质时,这些解释是至关重要的;单独的例子不会澄清我的理解。

2 个答案:

答案 0 :(得分:5)

这不是你使用位操作符的东西。您想要将输入字符串与所需的&#39; M&#39;或者&#39; F&#39;所以你要做的就是:

while (toupper(sex) != 'M' && toupper(sex) != 'F') {...

在您的代码中,您错过了第二个 toupper(性别)!= 部分。您需要将此声明视为必须满足的两个要求才能继续 首先是:toupper(性别)!=&#39; M&#39;
第二个:toupper(性别)!=&#39; F&#39;
&amp;&amp;(逻辑和)应该介于这两者之间的原因是因为如果性别不是M并且同时它不是&#39,那么你想要运行while循环; t F。

&|等运算符用于比较变量的位。例如,如果要使用位标志,则将每个标志设置为一位,并将得到的标志组合与&amp;进行比较。

编辑:因此对于位标志,它们会比较您逐位给出的值。那么你对位标志所做的就是你可以将它们定义为2(1,2,4,8 ...)的幂,每个表示二进制位置(00000001,00000010,00000100,00001000 ......)。例如,当你有标志时:

a = 1;
b = 2;
c = 4;

您可以使用``|设置它们到你的旗帜组:

setFlags = setFlags | a | c;

这会将setFlags逐位与a和c。

进行比较
 00000000
|00000001 // a
|00000100 // c
=00000101 // result

因此|运算符检查相同位置的所有位,如果其中一个为真,则结果将为逻辑OR。 现在阅读它们你用&amp;像这样:

if (setFlags & a)

确实:

 00000101 // setFlags
&00000001 // a
=00000001 // result

只留下它们都为真的位(就像逻辑AND一样),因此如果setFlags包含该标志,你可以获得true

 00000101 // setFlags
&00000010 // b
=00000000 // result

在这种情况下,在同一位置没有设置为true的位,因此结果告诉您b不能在setFlags中设置。

答案 1 :(得分:0)

 while (toupper(sex) != 'M' && 'F') is evaluated as:

 while(true  && (bool)'F'): while(true  && true)  // or
 while(false && (bool)'F'): while(false && true)

因为如果你被分配了性别&#39; m&#39;或者&#39; M&#39;条件为真,你在非零值上使用了逻辑和&&&f;#39;结果总是如此。

就像:if( (bool)5 )这是真的,因为任何非零值的bool值始终为真。

纠正你的例子:

while (toupper(sex) != 'M' && toupper(sex) != 'F')

逻辑运算符,如逻辑运算符和&&,逻辑运算符或||,...返回booltruefalse; 10他们评估表达式。

按位运算符,如bitwise和&,按位或| ...返回任何值,y工作位:

unsigned char uc1 = 13; // 0x01    00001101
unsigned char uc2 = 11; // 0x03    00001011

unsigned char uc3 = (uc1 & uc2);// 00001001

您可以看到1 & 1 = 10 & 1 = 01 & 0 = 01 & 1 = 10 & 0 = 0 ... 结果我们00001001是十进制9