【发布时间】:2012-08-10 08:12:41
【问题描述】:
前几天,我尝试使用 SDL 多媒体库编写一个小型 C++ 编程,但遇到了这个小问题,我最终通过反复试验解决了这个问题。问题是,我了解我为解决问题所做的工作,但我并不真正了解问题的本质!
问题在于 SDL 中的键盘事件处理。处理单次按键退出程序的代码非常简单明了。 [eventQueue 是一个 SDL_Event 结构]
//checks for keypress events..
if ( eventQueue.type == SDL_KEYDOWN )
{
//note: uses the boolean logical '==' equals operator..
if ( eventQueue.key.keysym.sym == SDLK_ESCAPE )
{
running = false;
}
}
在上面的代码中,只需按一下ESCAPE键就可以结束主循环并导致程序清理并关闭...
但是... 处理使用 修饰键 (shift/alt/ctrl) 的按键所需的代码无法与“==”运算符一起正常工作。我花了很长时间才发现我需要使用 按位 AND 运算符而不是相等(逻辑?)运算符。
//checks for keypress events..
if ( eventQueue.type == SDL_KEYDOWN )
{
//note: requires the use of the bitwise AND operator..
if (( eventQueue.key.keysym.mod & KMOD_ALT ) && (eventQueue.key.keysym.sym == SDLK_F4 ))
{
running = false;
}
}
我的困惑来自这样一个事实,当使用 'keysym.sym' 成员时,逻辑运算符 '==' 工作正常,但是,当使用 'keysym.mod' 成员时,有必要使用'&' 位与运算符。
现在,如果我不得不猜测,我会说这与“keysym.sym”只需要处理代表键盘上单个键的单个数字值这一事实有关,而“keysym.sym”只需要处理一个数字值。 mod' 必须处理 shift、ctrl 和 alt 键的各种组合...?
总结一下我的问题:为什么会这样?除了反复试验之外,是否需要学习某条数据是否需要与按位或逻辑/相等运算符进行比较?为什么“keysym.sym == SDLK_F4”工作正常,但“keysym.mod == KMOD_ALT”却不行?为什么涉及十进制数的运算与比较位值的运算的结果不同?是否也存在逻辑运算有效而位运算无效的情况?
【问题讨论】:
-
==最好称为“等式运算符”。将其称为“逻辑运算符”听起来好像您正在考虑&&(逻辑与运算符)和&(按位与运算符)之间的区别。但是您实际上是在谈论直接相等检查 (==) 和检查是否设置了特定的位子集(使用&&,可能与==结合使用)之间的区别。 -
逻辑运算符会短路并计算为布尔值,按位运算符计算为整数。
标签: c++ event-handling sdl bitwise-operators boolean-logic