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

时间:2014-08-08 10:50:51

标签: c macros

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

3 个答案:

答案 0 :(得分:5)

在宏定义周围使用大括号:

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

扩展表达式(使用原始宏定义)

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

分组为

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

i++ > ++j评估为1,不等于kk为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=10j=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作为输出。