当定义与运算符有价值时,#define 如何在编程中工作
How #define works in Programming when define has value with operator?
我在理解 #define 如何工作方面遇到了问题。
#include<stdio.h>
#define x 6+3
int main(){
int i;
i=x; //9
printf("%dn",i);
i=x*x; //27
printf("%dn",i);
i=x*x*x; //45
printf("%dn",i);
i=x*x*x*x; //63
printf("%dn",i);
return 0;
}
如果我使用 #define x 6+3
则输出为 9 27 45 63
如果我使用 #define x (6+3)
则输出为 9 81 729 6561
#define
只是将字符标记(在您的情况下x
)替换为您定义的内容。所以在预处理器完成他的工作后,你的示例看起来像这样:
#include<stdio.h>
#define x 6+3
int main(){
int i;
i=6+3; //9
printf("%dn",i);
i=6+3*6+3; //27
printf("%dn",i);
i=6+3*6+3*6+3; //45
printf("%dn",i);
i=6+3*6+3*6+3*6+3; //63
printf("%dn",i);
return 0;
}
如果你看一下它,你就会明白为什么例如第二个例子是 27 而不是 81(* 在 + 之前)。
另一方面,如果你写(6 + 3),它将是9 * 9,这就是你所期望的。
这是运算符优先级的情况。你可以研究一下。我对这个问题的描述如下。
如果您使用
#define x 6+3
然后
x = 6+3= 9
x*x = 6+3 * 6+3 = 6+18+3 = 27 (as * has higher precedence as operator than + ; so 3*6 will be evaluated earlier )
同样,还在继续。
现在,如果您使用
#define x (6+3)
然后
x = (6+3) = 9
x*x = (6+3)*(6+3) = 9*9 = 81
同样,还在继续。
所以我的建议是始终使用括号以获得更好的可读性和理解性。
宏的名称被内容替换。这意味着
#define x 6+3
x*x*x*x = 6+3*6+3*6+3*6+3 = 6+18+18+18+3
当您将 x 定义为 (6+3) - (6+3) 插入时。这意味着
#define x (6+3)
x*x*x*x = (6+3)*(6+3)*(6+3)*(6+3) = 9*9*9*9
阅读有关 C 预处理器和宏的信息
宏扩展是文本替换。 所以
#define x 6 + 3
#define y (6+3)
给出以下内容
printf( "%d %dn", x , y ); // 6 +3 , (6+3) is 9 and 9
printf( "%d %dn", x *x , y * y ); // 6 + 3 * 6 + 3, (6+3) * (6+3)
// 6 + 18 + 3 , 9 * 9
// 27 , 81
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- C++编程:运算符重载中的引用如何工作?
- 锁定如何在并行编程中工作?
- 代码在Visual C ++中无法按预期工作(来自bjarne stroustrup编程和原则书籍2n版本的示例)
- C 编程,动态内存无法使用Malloc和Calloc正常工作
- 当定义与运算符有价值时,#define 如何在编程中工作
- CPP / JUCE 音频编程框架 - 滑块数组不起作用 - 单个滑块工作
- 用Windows taskschd.msc编程C++Win32非控制台应用程序,无法工作
- 以编程方式重命名没有 API 的 Excel 工作表
- 这个特定的结构是如何像这样工作的?(合成现代3D图形编程)
- 伪代码有助于编程工作
- 如何以编程方式从工作线程获得父线程和兄弟线程的CPU利用率
- 我正在学习c++服务器编程,但线程不工作
- 这是最大子数组和算法的动态编程版本的工作方式吗?