这个 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)

成立于此https://developer.gnome.org/gdk3/stable/gdk3-Keyboard-Handling.html#gdk-keymap-translate-keyboard-state

完整示例代码:

#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~consumedALL_ACCELS_MASK 的按位与是否等于 GDK_CONTROL_MASK


如果需要说明,请添加评论。