这里是第一学期的学生。我对位与 (&) 和逻辑与 (&&) 之间的区别感到困惑,而位与 (|)、逻辑或 (||) 和异或 (^) 之间的区别也一样。具体来说,我有一些我认为需要 || 的代码或 && 功能,但..显然不是?这是有问题的代码:
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
我尝试使用 ||起初,但无论我如何回答,它都给了我“无效条目”的答复。我在论坛上环顾四周,发现 && 会更好并尝试使用它。它奏效了——起初。然后,没有明显的原因,它停止将“F”作为答案(代码未更改)。
为了纠正这个问题,我尝试使用失败的 Xor (^),然后是 bitand(&,而不是 &&),这显然使它再次正常运行。但是,我已经看到警告,您仍然可以使用 & 或 && 获得正确的答案,但其中一个不等于另一个,可能会在以后导致问题。这就是我需要澄清的原因(另外,知道这些也是好事)。
更新:因为这被标记为重复,我将澄清我的意图:我想了解更多关于 & 和 &&,为什么你使用一个而不是另一个,以及 ^、| 的相同信息和||。标记的线程有使用一个与另一个的例子,但他们没有解释操作本身的细节。当我在努力理解操作本身的本质时,这些解释是至关重要的;单靠示例并不能阐明我的理解。
这不是您使用位运算符的目的。您想要将输入字符串与所需的“M”或“F”进行比较,因此您所要做的就是:
while (toupper(sex) != 'M' && toupper(sex) != 'F') {...
在您的代码中,您遗漏了第二个 toupper(sex) != 部分。您需要将此语句视为必须满足的两个要求才能继续。
第一个是:toupper(sex) != 'M'
第二个:toupper(sex) != 'F'
&&(logical and) 应该在这两者之间的原因是,如果性别不是 M,同时它也不是 F,您希望 while 循环运行。
&
和|
等运算符用于比较变量的位。例如,如果您想使用位标志,您可以将每个标志设置为一位,并将生成的标志组合与 & 进行比较。
编辑:所以对于位标志,它们会逐位比较您给它们的值。所以你对位标志所做的是你可以将它们定义为 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
因此 |
运算符检查同一位置的所有位,如果其中一个为真,则结果将为真,就像逻辑或一样。
现在要阅读它们,您可以像这样使用:
if (setFlags & a)
它的作用是:
00000101 // setFlags
&00000001 // a
=00000001 // result
这只留下它们都为真的位(就像逻辑与),因此如果 setFlags 包含该标志,您可以获得 true
。
00000101 // setFlags
&00000010 // b
=00000000 // result
在这种情况下,同一位置上没有位设置为真,因此结果告诉您 b 未在 setFlags 中设置。