为什么“i”变量在我的程序中增加两倍?

时间:2011-02-03 10:40:41

标签: c macros

我的一位朋友向我展示了这个程序并问我为什么i变量增加了两次。

根据我的理解MAX(i++, ++j);在这一行中i首先作为参数发送然后递增,所以如果i的初始值是10则递增值应为11,但它会将i的递增值显示为12

计划:

#include<stdio.h>

#define MAX(x,y) (x)>(y)?(x):(y)

void main(void)
{
    int i = 10;
    int j = 5;
    int k = 0;

    k = MAX(i++, ++j);

    printf("%d %d %d",i,j,k);
}

输出

  

12 6 11

有人可以解释一下我的价值如何增加到12?

感谢。

8 个答案:

答案 0 :(得分:8)

MAX是一个宏,而不是一个函数。在您的用例中,它扩展为:

k = (i++) > (++j) ? (i++) : (++j);

答案 1 :(得分:5)

您的宏替换意味着您编写(i++)>(++j)?(i++):(++j)

答案 2 :(得分:5)

您的宏定义包含两次参数

#define MAX(x,y) (x)>(y)?(x):(y)

哪个

 k = MAX(i++, ++j);

扩展到

k = (i++)>(++j)?(i++):(j++);

因此,增加两倍。

答案 3 :(得分:4)

MAX不是一个功能。 i不会作为参数发送。

MAX是一个宏。它在文字替换的地方使用:

k = (i++)>(j++)?(i++):(j++)

现在您知道为什么它会增加两次。

答案 4 :(得分:2)

宏执行简单的文本替换,因此在宏扩展之后,编译器将k = MAX(i++, ++j);行视为:

k = (i++)>(++j)?(i++):(++j);

答案 5 :(得分:2)

您的MAX宏扩展为

(i++)>(++j)?(i++):(++j)

显示你获得双倍增量的原因。

答案 6 :(得分:2)

宏将扩展为伪C代码:

if( i++ > j++)  // i is incremented the first time,  j is incremented once
   return i++;  // i is incremented the second time
else
   return j++;  // we never go there, so j is not incremented twice

答案 7 :(得分:1)

使用MAX(i++, ++j)时,生成的代码为:

(i++) > (++j) ? (i++) : (++j)

使用预处理器宏只需展开代码并复制/粘贴参数。您可能希望在这种情况下使用函数。

int max(int x, int y)
{
  return (x > y ? x : y);
}

现代编译器会在尊重函数调用的原始行为的同时对其进行内联。