宏引用i++自增问题

img

img


M1和M2的格式和写法基本差不多,为什么M2只是引用了宏定义,打印的值每次就加2呢?

基于Monster 组和GPT的调写:

  • 问题出在宏定义中的自增运算符++。在M1宏定义中,使用了i++,它会先将i的值传给函数Ml,再将i加1。因此,每次调用Ml时,i的值都是相同的,而j的值会逐渐增加。
  • 在M2宏定义中,使用了j++,它会先将j的值传给宏,再将j加1。因此,每次调用M2时,j的值都是相同的,而i的值会逐渐增加。因此,M2的输出结果每次加2。

如果要让M1也能每次加2输出,可以修改宏定义为M1(y) ((y) * (y) + (++i, 1))。这样,在计算平方值时,i会先加1,再加1,即每次加2。完整代码如下:

#include <iostream>
using namespace std;

#define M2(y) ((y)*(y))

int Ml(int y)
{
    return ((y) * (y) + (++i, 1));
}

int main()
{
    int i, j;
    for (i = 1, j = 1; i <= 5; i++)
        cout << Ml(j++) << endl;
    cout << endl;
    for (i = 1, j = 1; i <= 5; i++)
        cout << M2(j++) << endl;
    return 0;
}


该回答引用ChatGPT

在这段代码中,M1和M2虽然定义的格式相似,但是它们的实现方式不同。

M1是一个函数,它接受一个整数参数y,并返回该参数的平方。当我们在程序中调用M1函数时,实际上是对该函数进行了一次函数调用,并将参数传递给函数,函数内部执行完逻辑后返回一个结果值。

M2是一个宏定义,在预处理阶段进行文本替换,将代码中所有的M2(y)替换为((y)(y))。在这个宏定义中,(y)(y)表示输入参数y的平方,所以当我们在程序中使用M2时,实际上是直接将代码展开为(2*(2))、(3*(3))、(4*(4))等。因此,当我们在程序中调用M2宏时,不会进行函数调用,而是直接将其展开为对应的代码片段,从而得到不同的结果值。

具体来说,在这个程序中,第一个循环中每次调用M1(j++),会对j进行自增并将自增前的值传递给M1函数,然后得到该值的平方并输出;而在第二个循环中每次调用M2(j++),会将j自增并将自增后的值直接带入M2的展开式中,得到2*(jj)的值并输出。所以,第一个循环中输出的是11、22、33、44、55,而第二个循环中输出的是2*(11)、2(22)、2(33)、2(44)、2(5*5),即每次输出的值都是原数的两倍。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^