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