C++ C++;多个运算符:指定A或B不等于C
例如,我目前正在学习SDL2/OpenGL2示例代码。然后,我遇到了一行(还有一些类似的),如下所示。我相信这部分将SDL鼠标事件绑定到IMGUI API。然而,我不太明白它是如何工作的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
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
是内置的整数类型),因为从sayint
到bool
的隐式转换工作方式与完全相同=0
请注意=
的优先级高于|
,因此整个表达式实际上是OR结果的简单赋值
=正如@AlekDepler所说,0
part是一种将应用位掩码的结果转换为bool的方法。有趣的是,它非常冗余(如果mouseMask
是内置的整数类型),因为从sayint
到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;