Arduino #define为乘法提供了不正确的值

时间:2017-06-26 22:51:09

标签: arduino

我有点困惑为什么下面的代码给出了x和y的错误值。当我在我的Arduino上运行时,b显示为124,正如人们所预料的那样,但x显示为10420,y为2104。

我认为这是由于" #define"命令,好像我用" int"替换b的define。 x和y返回正确的值。奇怪的是,这个问题只发生在使用来自" #define"的值的乘法和除法,加法和减法中。功能正常。

#define a 20
#define b a + 104
int x = b*100;
int y = 100*b;

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println(b);
Serial.println(x);
Serial.println(y);
delay (500);
}

请有人解释为什么乘法会返回不正确的值以及为什么乘法的顺序会影响结果。

提前谢谢。

3 个答案:

答案 0 :(得分:3)

define不计算值,它是预编译指令 - 所以你在编译之前得到以下结果:

examples

答案 1 :(得分:2)

C预处理器宏基于令牌替换,而不是评估。使用它们时的第一条规则是添加额外的括号。第0条规则不是将它们用于简单常量。

所以要么用括号写:

#define a 20
#define b (a + 104)
int x = b*100;
int y = 100*b;

扩展为

int x = (20 + 104)*100;
int y = 100*(20 + 104);

或使用常量变量

const int a = 20;
const int b = a + 104;
int x = b*100;
int y = 100*b;

避免了这个问题。编译器应该优化常量。

答案 2 :(得分:1)

问题是如何扩展宏参数。它们是逐字扩展的,因此在您的情况下a + 104被替换为b出现的地方

int x = a + 104*100;

然后扩展到

int x = 20 + 104*100;

这会给你得到的结果吗?