getch期待额外的性格

时间:2012-11-15 17:05:14

标签: 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)时我只需按一次按钮,而当我使用返回yesno(getch())时我必须按下按钮一两或三更多次?

从宏调用getch()时是否存在问题?

2 个答案:

答案 0 :(得分:5)

因为当你使用

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

答案 1 :(得分:0)

C使用short-circuit evaluation。你从宏中得到的表达式:

(getch()==ENTER || getch()==' ' || getch()=='\t') ? ENTER : ESC`

得到一个字符,看它是否等于ENTER(你可能定义为\n。如果是,整个表达式将结束为真,所以函数返回true而不测试另一个但是,如果没有,那么函数会得到另一个字符,测试第二个字符是否等于' ',如果是,则返回true。仅在对不同字符测试所有三个案例之后并且每次都是假的,整个表达都是假的。