C++ C++;多个运算符:指定A或B不等于C

C++ C++;多个运算符:指定A或B不等于C,c++,C++,例如,我目前正在学习SDL2/OpenGL2示例代码。然后,我遇到了一行(还有一些类似的),如下所示。我相信这部分将SDL鼠标事件绑定到IMGUI API。然而,我不太明白它是如何工作的 io.MouseDown[0] = g_MousePressed[0] || (mouseMask & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0 在哪里, ImGuiIO& io = ImGui::GetIO(); bool mouseDown[5]; // a me

例如,我目前正在学习SDL2/OpenGL2示例代码。然后,我遇到了一行(还有一些类似的),如下所示。我相信这部分将SDL鼠标事件绑定到IMGUI API。然而,我不太明白它是如何工作的

io.MouseDown[0] = g_MousePressed[0] || (mouseMask & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0
在哪里,

ImGuiIO& io = ImGui::GetIO();
bool mouseDown[5]; // a member of ImGuiIO struct
static bool g_MousePressed[3] = { false, false, false };
Uint32 mouseMask = SDL_GetMouseState(&mx, &my);
(我希望以上是足够的信息…)

最让我困惑的是最后一部分,不等于0。我可以理解它,如果它是一个简单的And和Or运算结果赋值。然而,尾随不等于零,我以前从未见过这种情况。我想得到一些帮助来理解这个代码

expression != 0
是布尔表达式,因此计算结果为
true
false
,可转换为
0
1
的整数值

#include <iostream>

int main() {
    constexpr size_t SDL_BUTTON = 5;
    for (size_t mouseMask = 0; mouseMask < 16; ++mouseMask) {
        std::cout << mouseMask << ' '
                  << (mouseMask & SDL_BUTTON)  << ' '
                  << ((mouseMask & SDL_BUTTON) != 0) << '\n';
    }
}

如果你打算学习,找一个好的沙盒(一个空的项目文件或一个像ideone.com这样的在线ide),然后教自己用一些你不能马上理解的代码进行实验

是布尔表达式,因此计算结果为
true
false
,可转换为
0
1
的整数值

#include <iostream>

int main() {
    constexpr size_t SDL_BUTTON = 5;
    for (size_t mouseMask = 0; mouseMask < 16; ++mouseMask) {
        std::cout << mouseMask << ' '
                  << (mouseMask & SDL_BUTTON)  << ' '
                  << ((mouseMask & SDL_BUTTON) != 0) << '\n';
    }
}


如果你打算学习,找一个好的沙盒(一个空的项目文件或一个像ideone.com这样的在线ide),教你自己去尝试一些你不能马上理解的代码。

一个表达式
a=b | | c=0
表示
a=(b!=0)| |(c!=0)
。在布尔逻辑中,
b
b=0
是等效的。这是我认为最令人困惑的部分。一旦理解了这一点,就应该没有问题了

请注意,此表达式不应与
a=b | c!混淆=0
,其中
|
是一种称为“按位or”的二进制操作,与逻辑操作
|
相反,后者是逻辑“or”。当执行
b|c=0
c=首先计算0以产生逻辑值
0
1
,然后计算
b | 0
b | 1
以不执行任何操作(第一种情况)或将
b
的二进制代码的最后一位重置为1(第二种情况)。最后,该结果被分配给
a
。在这种情况下,
b
b=0
不等效,因为使用了按位或
而不是逻辑或
|


类似地,
&
是“按位and”运算符,而
&
是逻辑“and”。这两者也不应该混淆。

一个表达式
a=b|c=0
表示
a=(b!=0)| |(c!=0)
。在布尔逻辑中,
b
b=0
是等效的。这是我认为最令人困惑的部分。一旦理解了这一点,就应该没有问题了

请注意,此表达式不应与
a=b | c!混淆=0
,其中
|
是一种称为“按位or”的二进制操作,与逻辑操作
|
相反,后者是逻辑“or”。当执行
b|c=0
c=首先计算0以产生逻辑值
0
1
,然后计算
b | 0
b | 1
以不执行任何操作(第一种情况)或将
b
的二进制代码的最后一位重置为1(第二种情况)。最后,该结果被分配给
a
。在这种情况下,
b
b=0
不等效,因为使用了按位或
而不是逻辑或
|


类似地,
&
是“按位and”运算符,而
&
是逻辑“and”。这两者也不应该混淆。

注意
=
的优先级高于
|
,因此整个表达式实际上是OR结果的简单赋值


=正如@AlekDepler所说,0
part是一种将应用位掩码的结果转换为bool的方法。有趣的是,它非常冗余(如果
mouseMask
是内置的整数类型),因为从say
int
bool
的隐式转换工作方式与
完全相同=0

请注意
=
的优先级高于
|
,因此整个表达式实际上是OR结果的简单赋值


=正如@AlekDepler所说,0
part是一种将应用位掩码的结果转换为bool的方法。有趣的是,它非常冗余(如果
mouseMask
是内置的整数类型),因为从say
int
bool
的隐式转换工作方式与
完全相同=0

这是一种标准的位掩码方法,谷歌“位掩码C++”。与非零比较意味着给定值与掩码匹配。这是一种标准的位掩码方法,google“bitmask C++”。与非零值比较,给定值与掩码匹配。<代码> 0或1 < /COD>相同的是代码>真< /代码>。@鲁斯兰起初没有得到你的意思,我删除了这两行,它们没有像他们打算的那样消除任何歧义。我不知道C++有沙箱!谢谢大家友好的回答。一旦我理解了,代码看起来就很容易了。<代码> 0或1 是相同的,<代码>真的< /C> >鲁斯兰起初没有得到你的意思,我删除了这两行,他们没有像他们所想的那样去消除任何东西。我不知道C++有沙箱!谢谢大家友好的回答。一旦我明白了,这似乎很容易。
const bool wasPressed = g_mousePressed[0];
const bool newPress = mouseMask & SDL_BUTTON(SDL_BUTTON_LEFT);
const either = (wasPressed == true) || (newPress == true);
io.MouseDown[0] = either;
if (g_mousePressed[0])
    io.MouseDown[0] = 1;
else if (mouseMask & SDL_BUTTON(SDL_BUTTON_LEFT))
    io.MouseDown[0] = 1;
else
    io.MouseDown[0] = 0;