2015-06-22 63 views
-5
#define MACRO(num, str) {\ 
      printf("%d", num);\ 
      printf(" is");\ 
      printf(" %s number", str);\ 
      printf("\n");\ 
      } 

int main(void) 
{ 
    int num; 

    printf("Enter a number: "); 
    scanf("%d", &num); 

    if (num & 1) 
    { 
     MACRO(num, "Odd"); 
    } 
    else 
    { 
     MACRO(num, "Even"); 
    } 
    return 0; 
} 

請解釋上面的代碼(如果/ else條件以及它如何打印「奇」和「偶」)此代碼如何打印奇數和偶數?

+3

在二進制表示中,奇數具有最低有效位集,但偶數不會因爲(頻率2)。 '&1'測試這個位,並且當位被設置時採用「奇數」路徑,否則採用「偶數」。對於'宏'這是簡單的文字替換,你可以嘗試用手。 –

+2

我投票結束這個問題作爲題外話,因爲這沒有顯示任何研究工作。 –

回答

1

在二進制任何數字LSB(最低有效位)是set1裝置的數量爲odd,和LSB 0裝置的數量是even

讓我們看看:

Decimal binary 
1   001 (odd) 
2   010 (even) 
3   011 (odd) 
4   100 (even) 
5   101 (odd) 

SO,以下行

num & 1 

會產生任一0意味着false1裝置true。例如,num = 5,因此:

5 & 1 (decimal) 
= 101 & 001 (binary) 
= 001 
= true (boolean) 

if (num & 1)會去true路徑

MACRO(num, "Odd"); 

macro將由代碼塊替換(比方說通過num5通過strOdd)。

其餘的由你決定。乾杯。

閱讀MacrosBitwise operations in C以便更好地理解。

2

的數目是確定「奇」或「偶」是在下面的邏輯塊。

if (num & 1) 
... 
else 
... 

如果數爲奇數,這是binary representation將有LSB設置爲1,因此,對於奇數

if (num & 1) 

將評估爲TRUE。

無需提及,對於偶數,相同的表達式將評估爲FALSE。

[注:這裏&bitwise AND operator]

現在,#define被一個preprocessor MACRO,所述MACRO將得到由MACRO定義的碼塊時,打印所期望的結果取代。

1

if (num & 1)檢查num的位0是否爲1.在LSB處具有1的每個數字是奇數,每個數字具有0作爲位0是偶數。