Why is "i" variable getting incremented twice in my program?
我修改了问题,但为什么输出不同。不应该一样吗?。
代码: -
#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);
}
输出: - 11 7 0
输出不应为12 6 0
答案 0 :(得分:5)
在宏定义周围使用大括号:
#define MAX(x,y) ( (x)>(y)?(x):(y) )
扩展表达式(使用原始宏定义)
k == (i++)>(++j)?(i++):(++j);
分组为
(k == i++ > ++j) ? i++ : ++j;
i++ > ++j
评估为1
,不等于k
(k
为0),因此?:
的第三个操作数({{1} })被评估。因此,++j
递增一次,i
两次,j
自初始化后未更改,因此输出。
答案 1 :(得分:3)
问题是宏扩展到了这个:
k == i++ > ++j ? i++ : ++j;
运营商优先权决定&gt; prio比==更高,prio高于?: 所以上面等同于:
(k == (i++ > ++j)) ? i++ : ++j;
首先执行 i++
和++j
。由于i++ > j++
被评估为真(1),我们得到这个:
(k == 1) ? i++ : ++j;
然后,由于k为0,k == 1
被评估为假(0)。我们得到:
0 ? i++ : ++j;
因此++ j再次执行。
(作为旁注,这个表达式是明确定义的,因为条件运算符在条件和第二或第三个操作数的evauluation之间有一个序列点。)
答案 2 :(得分:2)
k == MAX(i++, ++j);
替换为
k == (i++)>(++j)?(i++):(++j);
此处i=10
,j=5
。所以
k == (10++)>(6)?(11++):(++6);
因此,检查条件i
时的表达式在检查由于后期增量引起的条件后增加一次,j
也增加一次。但10 > 6
条件属实。
(k == 1 )?(i++):(++j); // here i=11 and j=6
(k == 1 )? (11++):(++6);
所以这里k==1
条件失败了。它不会评估该表达式中的i++
,它会评估++j
并将其返回。此处i
仍为11,j
为7。
所以你将得到11 7 0作为输出。