c++ - 有人能解释一下 & 和 && 之间的区别吗?

标签 c++ c++11

<分区>

这里是第一学期的学生。我对位与 (&) 和逻辑与 (&&) 之间的区别感到困惑,而位与 (|)、逻辑或 (||) 和异或 (^) 之间的区别也一样。具体来说,我有一些我认为需要 || 的代码或 && 功能,但..显然不是?这是有问题的代码:

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 中设置。

关于c++ - 有人能解释一下 & 和 && 之间的区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40993892/

相关文章:

c++ - 为什么 Netbeans 无法识别 `cbegin()` 、 `cend()` 、 `unordered_set` 以及其他 C++ 功能?

c++ - auto 关键字没有推导字符串类型

c++ - C++11 中具有 C 链接的复杂类型

c++ - 由于未签名,消除了模板化方法中的警告

c++ - QML/QtQuick与QWidget的双向连接

c++ - 在循环中创建线程 vector 的问题

php - 如何在使用 Boost C++(在共享区域中)编写的 php Web 应用程序中读取 map ?

c++ - Scala 和 C++11 的类型推断有什么区别?

java - 使用什么语言来执行 mcmc 算法?

C++ 碰撞检测