Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getch需要额外的字符_C_Macros_Getch - Fatal编程技术网

getch需要额外的字符

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())时,我必须再按一两次

你好,我是编程新手,我正在用C写一个程序

在头文件中,我有以下宏:

#define yesno(c) (c==ENTER || c==' ' || c=='\t') ? ENTER : ESC
在我的程序中,我有这个代码

char keypressed()
{ char c;
c =getch();
return yesno(getch());
 }
所以我想问的是,为什么当我要求返回
yesno(c)
时,我只需按一次按钮,而当我使用return
yesno(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我更新了问题,希望这能让问题更清楚:)