2016-09-10 14 views
0

現在、ImGuiのSDL2/OpenGL2サンプルコードから学習中です。それから、私は以下に示すような行に(そしてもっと類似して)走りました。私はこの部分がSDLマウスイベントをIMGUI APIにバインドすると信じています。しかし、私はそれがどのように動作するかは分かりません。 0に等しくない一番混乱して私を作ることは最後の部分であるC++複数の演算子:AまたはBをCと等しく割り当てない

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); 

(私は十分な情報である上記願っています...)

、私は可能性がありそれが、AndとOrの操作の結果の単純な割り当てであれば、それを理解してください。しかし、最後には0に等しくないので、これを見たことはありません。私はこのコードを理解するためにいくつかの助けをしたいと思います。

+1

このスタンダールビットマスクのアプローチ、「ビットマスクC++」をグーグル。非ゼロと比較すると、与えられた値がマスクと一致することを意味します。 –

答えて

1
expression != 0 

はブール式であり、従って0又は1の整数値に変換することができるtrueまたはfalseのいずれかに評価されます。

#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'; 
    } 
} 

ライブデモ:http://ideone.com/jcmosg

||が論理的またはオペレータであるので、我々はio.MouseDown != 0または(mouseMask & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0とブール値(trueまたはfalse)が得られるかどうかのテストは何に昇格することを論理比較を実行していますタイプio.mouseDown[0]です。

コードが実際のように記述されている可能性が:あなたが学ぶことを意図している場合

io.MouseDown[0] = g_MousePressed[0] || (mouseMask & SDL_BUTTON(SDL_BUTTON_LEFT)) 

または

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; 

は、http://ideone.com/TAadn2

を参照してください。良いサンドボックス(空のプロジェクトファイルやideone.comのようなオンラインIDE)を見つけてすぐに理解できないコードを試してみてください。

+0

「0または1」は全く同じ「真」である。 – Ruslan

+0

@Ruslanはあなたが最初に何を意味するのか分からなかった、私はそれらの2つの行を削除した。彼らは意図したように何かを曖昧させなかった。 – kfsone

+0

C++用のサンドボックスがあることはわかりませんでした。親切な答えを皆にありがとう。私は一度それを理解すると簡単に思える。 – Yui

1

a = b || c!=0は、a = (b!=0) || (c!=0)を意味します。ブール論理では、bb!=0は同等です。それが私が最も混乱している部分だと思います。これが理解されれば、問題はないはずです。論理「または」である論理演算||、とは対照的に|は、「ビット単位または」と呼ばれるバイナリ操作であり、この式はa=b|c!=0と混同すべきではないこと

注意。 b|c!=0を実行する場合、または1を最初に計算した場合、b|0またはb|1は何もしない(最初のケース)、またはbの最後のビットを1(2番目のケース)にリセットするよう計算されます。最後に、その結​​果はaに割り当てられます。ビット単位または|代わりに論理的又は||で使用されているので、この場合には、bb!=0は、等価ではありません。

同様に、&は「ビット単位の」演算子で、&&は論理「と」の演算子です。これらの2つは混同されるべきではありません。

1

!=は、||よりも高い優先順位を持つことに注意してください。したがって、表現全体が実際にはORの結果の単純な割り当てになります。

!=0部分は、ビットマスクをboolに適用した結果を@AlekDeplerが示したように変える方法です。おかしい事は正確に!=0ようintboolの作品と言うから暗黙的な変換として(mouseMaskは内蔵の一体型である場合)、そのほとんど冗長です。

関連する問題