#include<stdio.h>
#include<stdlib.h>
#define d 10+10
int main()
{
printf("%d",d*d);
return 0;
}
我是宏概念的新手。我发现上述程序的输出是 120。它背后的逻辑是什么?
谢谢。
#include<stdio.h>
#include<stdlib.h>
#define d 10+10
int main()
{
printf("%d",d*d);
return 0;
}
我是宏概念的新手。我发现上述程序的输出是 120。它背后的逻辑是什么?
谢谢。
10+10*10+10 == 10 + 100 + 10
明白了吗?
宏被逐字替换。想想搜索/替换。编译器将您的代码视为10+10*10+10
.
出于这个原因,将宏替换文本括在括号中是常见的做法:
#define d (10 + 10)
当您的宏是类似函数的宏时,这一点更为重要:
#define SQ(x) ((x) * (x))
想SQ(a + b)
...
d*d
扩展为10+10*10+10
. 乘法先于加法,因此 10 + 100 + 10 = 120。
通常,#define
表达式应始终用括号括起来:#define d (10+10)
宏只不过是一个简单的文本替换,所以你的行:
printf("%d",d*d);
变成
printf("%d",10+10*10+10);
您可以使用const
变量来获得更可靠的行为:
const int d = 10+10;
宏按原样展开。你的程序变成
/* declarations and definitions from headers */
int main()
{
printf("%d",10+10*10+10);
return 0;
}
并且计算被解释为
10 + (10 * 10) + 10
始终在宏周围使用括号(以及当你拥有它们时它们的参数)
#define d (10 + 10)
#define
预处理器指令用第二个元素替换第一个元素。
就像“查找和替换”一样
我不确定#include,但在C# 中,#define 在顶部用于定义符号。这允许编码人员执行以下操作
#define DEBUG
string connStr = "myProductionDatabase";
#if DEBUG
connStr = "myTestDatabase"
#edif
10+10*10+10 = 20 + 100 = 120
简单的数学;)
宏不计算该值(它不加 10 + 10),而只是用指定的表达式替换它的所有出现。