2015-06-22 80 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是偶数。