繁体   English   中英

if语句如何在C中工作。我知道它的作用,但是我不能一brake而就

[英]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

我的目标是了解它,因此可以将其移植到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


如果您想澄清,请添加评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM