C++ 序列返回49,但应返回36
下面的代码专门用于返回值36,而不是返回值49,但不知道如何返回或为什么返回。任何帮助都将不胜感激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
#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
扩展到3*4MUL3,4)
扩展为MUL(1+Incs,3*4)
1+Incs*3*4
#define MUL(a,b) ((a)*(b))
更糟糕的是尼尔在评论中指出的,因为表达式
n*++n
导致了错误。未定义的行为会使整个程序格式错误,并使任何输出都可疑
你真的应该在Niall提供的链接中阅读接受的答案。我建议你检查预处理的输出,因为它将不是你期望的结果 更准确地说:
扩展为ADD(1,Incs)
1+Incs
扩展到3*4MUL3,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的提示。但是关于外圆括号,您是对的。