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)这一行中的code>首先作为参数发送,然后递增,因此如果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这可能是我的问题,我甚至不知道到底要寻找什么样的问题。这是个好问题。我只是很惊讶,我自己找不到这个复制品,显然也没有其他人找到它