我修改了问题,但为什么输出不同.不应该一样吗?
代码: -
#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);
}
Run Code Online (Sandbox Code Playgroud)
输出: - 11 7 0
输出不应该是12 6 0
在宏定义周围使用大括号:
#define MAX(x,y) ( (x)>(y)?(x):(y) )
Run Code Online (Sandbox Code Playgroud)
扩展表达式(使用原始宏定义)
k == (i++)>(++j)?(i++):(++j);
Run Code Online (Sandbox Code Playgroud)
团体为
(k == i++ > ++j) ? i++ : ++j;
Run Code Online (Sandbox Code Playgroud)
i++ > ++j
求值为1
,不等于k
(k
为0),因此计算?:
(++j
)的第三个操作数.因此,i
增加一次,j
两次,并且k
自初始化以来没有改变,因此输出.
问题是宏扩展为:
k == i++ > ++j ? i++ : ++j;
Run Code Online (Sandbox Code Playgroud)
运算符优先级规定 > 的优先级高于 ==,而 == 的优先级高于 ?:因此上面等价于:
(k == (i++ > ++j)) ? i++ : ++j;
Run Code Online (Sandbox Code Playgroud)
i++
并++j
首先被执行。由于i++ > j++
评估结果为 true (1),我们得到:
(k == 1) ? i++ : ++j;
Run Code Online (Sandbox Code Playgroud)
然后由于 k 为 0,因此k == 1
被评估为 false (0)。我们得到:
0 ? i++ : ++j;
Run Code Online (Sandbox Code Playgroud)
因此++j又被执行了一次。
(顺便说一句,这个表达式是明确定义的,因为条件运算符在条件和第二个或第三个操作数的计算之间有一个序列点。)