4

こんにちは、私はプログラミングが初めてで、Cでプログラムを書いています。

私のヘッダーファイルには、次のマクロがあります。

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

私のプログラムには、このコードがあります

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

では、私が聞きたかったのは、戻るように頼むときyesno(c)はボタンを 1 回だけ押さなければならないのに、return を使用するときyesno(getch())はボタンを 2 回または 3 回押さなければならないのはなぜですか?

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になるため、関数は他の2つのケースをテストせずにtrueを返します。そうでない場合は、次に、関数は別の文字を取得し、その2番目の文字がに​​等しいかどうかをテストし、等しい' '場合はtrueを返します。異なる文字で3つのケースすべてをテストし、毎回falseを取得した後でのみ、式全体がfalseであることがわかります。

于 2012-11-15T17:15:24.280 に答える