这两个定义有什么区别
What is the difference between these two defines
在下文中,MY_INT2 和 MY_INT3 声明有什么区别?
我在某些代码中有一个相当根深蒂固的问题,因此将生成错误的代码减少到测试用例中将是相当具有挑战性的。
#define MY_INT1 5
#define MY_INT2 31
#define MY_INT3 (int) pow(2, MY_INT1)-1
我在我的代码中遇到了一些问题,这些问题已通过使用以下方法解决,感觉非常没有必要
int mul(int a, int b) {
return a*b;
}
int someFunction(int in) {
//nice
return floor(in/MY_INT2);
}
int someFunction2(int in) {
//silly
return floor(in/mul(1,MY_INT3));
}
int someFunction3(int in) {
//cast does not solve the issue
return floor(in/(int)MY_INT3);
}
宏是文本替换。没有括号 in / (int) MY_INT3
实际上是
in / (int) (int) pow(2, 5) - 1;
与
相同
in / 32 - 1;
所以-1
在除法后被减去。
此外,mul(1, MY_INT3)
之所以有效,是因为参数在传递给函数时被求值,实际上
in / (MY_INT3);
也应该像您期望的那样“工作”。
您似乎认为转换是解决问题的魔术,但事实并非如此。转换只是告诉编译器如何表示值,没有别的。
在下文中,MY_INT2 和 MY_INT3 声明有什么区别? 我在某些代码中有一个相当根深蒂固的问题,因此将生成错误的代码减少到测试用例中将是相当具有挑战性的。
#define MY_INT1 5
#define MY_INT2 31
#define MY_INT3 (int) pow(2, MY_INT1)-1
我在我的代码中遇到了一些问题,这些问题已通过使用以下方法解决,感觉非常没有必要
int mul(int a, int b) {
return a*b;
}
int someFunction(int in) {
//nice
return floor(in/MY_INT2);
}
int someFunction2(int in) {
//silly
return floor(in/mul(1,MY_INT3));
}
int someFunction3(int in) {
//cast does not solve the issue
return floor(in/(int)MY_INT3);
}
宏是文本替换。没有括号 in / (int) MY_INT3
实际上是
in / (int) (int) pow(2, 5) - 1;
与
相同in / 32 - 1;
所以-1
在除法后被减去。
此外,mul(1, MY_INT3)
之所以有效,是因为参数在传递给函数时被求值,实际上
in / (MY_INT3);
也应该像您期望的那样“工作”。
您似乎认为转换是解决问题的魔术,但事实并非如此。转换只是告诉编译器如何表示值,没有别的。