这个 if 语句在 C 中是如何工作的。我知道它的作用,但我不能把它分解成碎片
How this if statement works in C. I know what it does but I can't brake it in pieces
我很难理解这个 if 语句是如何工作的:
if (keyval == GDK_PLUS &&
(event->state & ~consumed & ALL_ACCELS_MASK) == GDK_CONTROL_MASK)
完整示例代码:
#define ALL_ACCELS_MASK (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK)
gdk_keymap_translate_keyboard_state (keymap, event->hardware_keycode,
event->state, event->group,
&keyval, NULL, NULL, &consumed);
if (keyval == GDK_PLUS &&
(event->state & ~consumed & ALL_ACCELS_MASK) == GDK_CONTROL_MASK)
// Control was pressed
我的 objective 是为了理解它,所以我可以将它移植到 Vala,因为 Valadocs 中给出的例子是用 C 写的,而不是用 Vala 写的。
第一部分
keyval == GDK_PLUS
这和它看起来的一样——检查 keyval
是否等于 GDK_PLUS
。
第二部分
让我们向外努力。
~consumed
这是一个按位非。它单独反转位。
00101100
→ 按位非 → 11010011
(event->state & ~consumed & ALL_ACCELS_MASK)
&
是 按位与 。它比较两个操作数中的位,只有当它们都为 1 时才在输出中设置位。例如,
binary hex dec
11010111 0xD7 215
& 01101101 0x6D 109
=====================
01000101 0x45 69
将完整的第二部分放在一起:
(event->state & ~consumed & ALL_ACCELS_MASK) == GDK_CONTROL_MASK
这将检查 event->state
、~consumed
和 ALL_ACCELS_MASK
的按位与是否等于 GDK_CONTROL_MASK
。
如果需要说明,请添加评论。
我很难理解这个 if 语句是如何工作的:
if (keyval == GDK_PLUS &&
(event->state & ~consumed & ALL_ACCELS_MASK) == GDK_CONTROL_MASK)
完整示例代码:
#define ALL_ACCELS_MASK (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK)
gdk_keymap_translate_keyboard_state (keymap, event->hardware_keycode,
event->state, event->group,
&keyval, NULL, NULL, &consumed);
if (keyval == GDK_PLUS &&
(event->state & ~consumed & ALL_ACCELS_MASK) == GDK_CONTROL_MASK)
// Control was pressed
我的 objective 是为了理解它,所以我可以将它移植到 Vala,因为 Valadocs 中给出的例子是用 C 写的,而不是用 Vala 写的。
第一部分
keyval == GDK_PLUS
这和它看起来的一样——检查 keyval
是否等于 GDK_PLUS
。
第二部分
让我们向外努力。
~consumed
这是一个按位非。它单独反转位。
00101100
→ 按位非 → 11010011
(event->state & ~consumed & ALL_ACCELS_MASK)
&
是 按位与 。它比较两个操作数中的位,只有当它们都为 1 时才在输出中设置位。例如,
binary hex dec
11010111 0xD7 215
& 01101101 0x6D 109
=====================
01000101 0x45 69
将完整的第二部分放在一起:
(event->state & ~consumed & ALL_ACCELS_MASK) == GDK_CONTROL_MASK
这将检查 event->state
、~consumed
和 ALL_ACCELS_MASK
的按位与是否等于 GDK_CONTROL_MASK
。
如果需要说明,请添加评论。