4

您好,我是编程新手,我正在用 C 编写程序。

在我的头文件中,我有这个宏:

#define yesno(c) (c==ENTER || c==' ' || c=='\t') ? ENTER : ESC

在我的程序中,我有这个代码

char keypressed()
{ char c;
c =getch();
return yesno(getch());
 }

所以我想问的是,为什么我要求return的时候yesno(c)只需要按一次按钮,而我用return的时候yesno(getch())却要再按一次按钮两三下?

getch()从宏调用时有问题吗?

4

2 回答 2

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
于 2012-11-15T17:10:12.513 回答
0

C 使用短路评估。您从宏中获得的表达式:

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

获取一个字符,查看它是否等于 ENTER (您可能已将其定义为\n。如果是,则整个表达式将最终为 true ,因此该函数在不测试其他两种情况的情况下返回 true 。如果不是,但是,然后该函数获取另一个字符,测试第二个字符是否等于' ',如果相等则返回 true。只有在对不同字符测试所有三种情况并且每次都为 false 之后,才知道整个表达式为 false。

于 2012-11-15T17:15:24.280 回答