C++ 序列返回49,但应返回36

C++ 序列返回49,但应返回36,c++,visual-c++,math,console,C++,Visual C++,Math,Console,下面的代码专门用于返回值36,而不是返回值49,但不知道如何返回或为什么返回。任何帮助都将不胜感激 #include "stdafx.h" #include<stdio.h> #include<stdlib.h> #define MUL(a,b) a*b #define ADD(a,b) a+b static int Func1(void) { static int n = 1; // Returns 4 return n*++n; } i

下面的代码专门用于返回值36,而不是返回值49,但不知道如何返回或为什么返回。任何帮助都将不胜感激

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>

#define MUL(a,b) a*b
#define ADD(a,b) a+b

static int Func1(void)
{
    static int n = 1;

    // Returns 4
    return n*++n;
}

int main()
{
    static int Incs = Func1();

    printf("%d\n", MUL(ADD(1, Incs), MUL(3, 4)));
}
#包括“stdafx.h”
#包括
#包括
#定义MUL(a,b)a*b
#定义添加(a,b)a+b
静态int Func1(void)
{
静态int n=1;
//返回4
返回n*++n;
}
int main()
{
静态int Incs=Func1();
printf(“%d\n”,MUL(添加(1,Incs),MUL(3,4));
}

我建议您检查预处理的输出,因为它不是您期望的结果

更准确地说:

  • ADD(1,Incs)
    扩展为
    1+Incs
  • MUL3,4)
    扩展到3*4
  • MUL(1+Incs,3*4)
    扩展为
    1+Incs*3*4
这就是为什么建议在宏中的参数周围始终使用括号,如

#define MUL(a,b) ((a)*(b))

更糟糕的是尼尔在评论中指出的,因为表达式
n*++n
导致了错误。未定义的行为会使整个程序格式错误,并使任何输出都可疑


你真的应该在Niall提供的链接中阅读接受的答案。

我建议你检查预处理的输出,因为它将不是你期望的结果

更准确地说:

  • ADD(1,Incs)
    扩展为
    1+Incs
  • MUL3,4)
    扩展到3*4
  • MUL(1+Incs,3*4)
    扩展为
    1+Incs*3*4
这就是为什么建议在宏中的参数周围始终使用括号,如

#define MUL(a,b) ((a)*(b))

更糟糕的是尼尔在评论中指出的,因为表达式
n*++n
导致了错误。未定义的行为会使整个程序格式错误,并使任何输出都可疑

你真的应该在尼尔提供的链接中阅读接受的答案。

让我们打断它:

MUL(ADD(1, Incs), MUL(3, 4))
当Incs=4时,它可以写成:

MUL(ADD(1, 4), MUL(3, 4))

MUL(1+4, 3*4)

1 + 4 * 3 * 4
现在编译器做了一些工作

这就证明了

哦,但您不希望出现这种行为,而是希望每个宏单独工作 然后稍微更改一下宏定义

#define MUL(a,b) (a)*(b)
#define ADD(a,b) (a)+(b)
让我们打破它:

MUL(ADD(1, Incs), MUL(3, 4))
当Incs=4时,它可以写成:

MUL(ADD(1, 4), MUL(3, 4))

MUL(1+4, 3*4)

1 + 4 * 3 * 4
现在编译器做了一些工作

这就证明了

哦,但您不希望出现这种行为,而是希望每个宏单独工作 然后稍微更改一下宏定义

#define MUL(a,b) (a)*(b)
#define ADD(a,b) (a)+(b)

相关(
n*++n;
);相关(
n*++n;
);您也应该在add中添加括号:
#定义add(a,b)((a)+(b))
。请注意,需要一组额外的外圆括号。@Klaslind bäck我只显示
MUL
宏作为对OP的提示。但是关于外圆括号,您是对的。您也应该在add中添加圆括号:
#define add(a,b)((a)+(b))
。请注意,需要一组额外的外圆括号。@KlasLindbäck我只显示
MUL
宏作为对OP的提示。但是关于外圆括号,您是对的。