getch需要额外的字符
你好,我是编程新手,我正在用C写一个程序 在头文件中,我有以下宏:getch需要额外的字符,c,macros,getch,C,Macros,Getch,你好,我是编程新手,我正在用C写一个程序 在头文件中,我有以下宏: #define yesno(c) (c==ENTER || c==' ' || c=='\t') ? ENTER : ESC 在我的程序中,我有这个代码 char keypressed() { char c; c =getch(); return yesno(getch()); } 所以我想问的是,为什么当我要求返回yesno(c)时,我只需按一次按钮,而当我使用returnyesno(getch())时,我必须再按一两次
#define yesno(c) (c==ENTER || c==' ' || c=='\t') ? ENTER : ESC
在我的程序中,我有这个代码
char keypressed()
{ char c;
c =getch();
return yesno(getch());
}
所以我想问的是,为什么当我要求返回yesno(c)
时,我只需按一次按钮,而当我使用returnyesno(getch())
时,我必须再按一两次按钮
从宏调用时,getch()
是否有问题 因为当你使用
yesno(getch());
它扩展到:
(getch()==ENTER || getch()==' ' || getch()=='\t') ? ENTER : ESC`
当宏像这样展开时,意味着getch()
实际上可以被调用1、2或3次,因为逻辑|
意味着:
getch() == '\n' ? if true return ENTER, false test next one
getch() == ' ' ? if true return ENTER, false test next one
getch() == '\t' ? if true return ENTER, false return ESC
如果使用gcc
编译器,您可以通过使用-E
标志找到宏的扩展:
gcc -E myprog.c -o mprog.m
C使用。从宏中获得的表达式:
(getch()==ENTER || getch()==' ' || getch()=='\t') ? ENTER : ESC`
获取一个字符,查看它是否等于ENTER(您可能已将其定义为
\n
。如果是,则整个表达式将结束为true,因此函数将在不测试其他两种情况下返回true。如果不是,则函数将获取另一个字符,测试第二个字符是否等于'
,如果是,则返回true。仅在测试ll三个不同字符的情况下,每次都变假,整个表达式就是假的。谢谢你的帮助,但请你说得更清楚些?正如我说的,我是编程新手,所以如果你能解释一下这种情况下会发生什么,以及在哪里使用gcc,我将不胜感激。如果这看起来很简单,我很抱歉这对你来说是很平常的,但我想有一个更好的视角。@user1827339我更新了问题,希望这能让问题更清楚:)