C 为什么是;我";变量在我的程序中递增两次?

C 为什么是;我";变量在我的程序中递增两次?,c,macros,C,Macros,我的一个朋友给我看了这个程序,问我为什么i变量会增加两次 根据我的理解MAX(i++,+++j)首先作为参数发送,然后递增,因此如果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)

我的一个朋友给我看了这个程序,问我为什么
i
变量会增加两次

根据我的理解
MAX(i++,+++j)首先作为参数发送,然后递增,因此如果
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);
}
#包括
#定义最大值(x,y)(x)>(y)?(x):(y)
真空总管(真空)
{
int i=10;
int j=5;
int k=0;
k=最大值(i++、++j);
printf(“%d%d%d”,i,j,k);
}
输出:

#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的吗


谢谢。

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

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

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

宏定义包含两个参数

#define MAX(x,y) (x)>(y)?(x):(y)
这使得

 k = MAX(i++, ++j);
扩展到

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

因此,递增两次。

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

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

您的
MAX
宏扩展为

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

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

MAX
不是一个函数<代码>i
不作为参数发送


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

k = (i++)>(j++)?(i++):(j++)
现在您知道了为什么它会增加两次。

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

(i++) > (++j) ? (i++) : (++j)
使用预处理器宏只需展开代码并将参数复制/粘贴到位。您可能希望在这种情况下使用函数

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

现代编译器将内联它,同时尊重函数调用的原始行为。

宏将扩展为类似于伪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

还要记住,
main
应该返回一个
int
!当然,这肯定是以前某个问题的翻版?@larsmans这可能是我的问题,我甚至不知道到底要寻找什么样的问题。这是个好问题。我只是很惊讶,我自己找不到这个复制品,显然也没有其他人找到它