第一学期学生在这里。我对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;,为什么你使用一个而不是另一个,以及^,|的相同信息和||。标记的线程具有使用一个与另一个的示例,但它们不解释操作本身的细节。当我努力理解操作本身的本质时,这些解释是至关重要的;单独的例子不会澄清我的理解。
答案 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')
逻辑运算符,如逻辑运算符和&&
,逻辑运算符或||
,...返回bool
值true
或false
; 1
或0
他们评估表达式。
按位运算符,如bitwise和&
,按位或|
...返回任何值,y工作位:
unsigned char uc1 = 13; // 0x01 00001101
unsigned char uc2 = 11; // 0x03 00001011
unsigned char uc3 = (uc1 & uc2);// 00001001
您可以看到1 & 1 = 1
,0 & 1 = 0
,1 & 0 = 0
,1 & 1 = 1
,0 & 0 = 0
...
结果我们00001001是十进制9