您好我是编程新手,我正在用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()
时是否存在问题?
答案 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。仅在对不同字符测试所有三个案例之后并且每次都是假的,整个表达都是假的。