2012-11-15 18 views
4

你好,我是新來的編程和我寫在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()有問題嗎?

回答

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 
+0

感謝您的幫助,但您請讓它更清楚AR?正如我所說我是編程新手,所以如果你能解釋我在這種情況下發生了什麼以及在哪裏使用gcc,我將不勝感激。如果這對你來說似乎是初級或微不足道的,我很抱歉,但我希望能有更好的看法。 –

+0

@ user1827339我更新了這個問題,希望這個更清楚:) – iabdalkader

+0

非常感謝你的朋友! –

0

C使用short-circuit evaluation。表達您從宏觀獲得:

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

得到一個字符,看它是否等於ENTER(你已經大概定義爲\n如果是,整個表達式最終將會真正等等。如果沒有測試其他兩種情況,函數返回true,但如果不是,則函數會獲得另一個字符,測試第二個字符是否等於' ',如果是,則返回true。並且每次都是假的,整個表達是已知的假。