意外输出 printf 语句

Unexpected output printf statement

为什么后面两个printf()ij的输出不一样?

#include <cstdio>
#define MAX(x,y) (x)>(y)?(x):(y)
int main()
{
    int i=10,j=5,k=0;
    k==MAX(i++,++j);
    printf("%d %d %d\n",i,j,k);
    i=10,j=5,k=0;
    k=MAX(i++,++j);
    printf("%d %d %d\n",i,j,k);
    return 0;
}

我认为只有 k 应该不同,但它在 printf() 语句中显示了所有 ijk 的不同输出.这是什么原因?

输出:

11 7 0
12 6 11
  • 让我们先分析一下printf()

    的输出
    1. 假设您在代码中的意思是 = 而不是 ==

      k==MAX(i++,++j);
      

      得到翻译

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

      评估更改 ijk 的所有值。

    2. 即使您的意思是 ==,如前所述 by Mr. Mohit Jain,您也会遇到类似的优先级问题。

    查看 operator precedence 以获得更好的理解。

  • 让我们分析第二个 printf()

  • 的输出

在第二个 printf() 语句中,您 重新设置 ij、[=18= 的值] 并且不使用 MACRO。因此,这些值将被打印出来。简单。

因此,TL;DR, 在第一个 printf() 之前,MACRO 更改了 ijk。因此,对于所有三个变量值,第一个和第二个 printf() 的输出都不同。


FWIW,如果您想让 MACRO 充当三元条件表达式,则需要将 MACRO 定义更改为

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

避免 MACRO 扩展后运算符优先级的问题。

你有副作用。

MAX(i++,++j)

扩展为

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

i在宏调用中修改了两次

此外,您必须在宏定义中添加括号:

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

i++ 和 ++j 都会递增 i 和 j,因此您可以在打印前更改它们的值。

k==MAX(i++,++j); 翻译为:

  k==(i++) > (++j) ? (i++) : (++j);
/* 2       1       3  : Precedance */

在你的情况下 i = 10j = 5,所以比较将是 10 v/s 6 是正确的或 1 副作用 i 变为 11 并且 j 变为 6。 (回想一下:宏不是函数)

因为 k = 0 不等于 1k==(i++) > (++j) 将是 false 并且 ++j 将被执行。导致 j 增加到 7

在后一种情况下,没有对变量值的修改。

我什么时候可以在两种情况下获得相同的输出? 即使您使用函数更改宏,您的参数也会产生副作用,这会导致 i j 的输出 11 6,因此您正在使用 ++ 运算符更改变量,不要不要期望两个语句具有相同的值。

这个宏是一条红鲱鱼。 OP 没有询问 k 但 "Why output of i and j in following two printf are different?" 答案是因为 ij 在设置它们的值和打印之间被修改,在第一种情况下,但不是在第二种情况。