0
#include<stdio.h>
#include<stdlib.h>

#define d 10+10

int main()
{
    printf("%d",d*d);
return 0;
}

我是宏概念的新手。我发现上述程序的输出是 120。它背后的逻辑是什么?

谢谢。

4

8 回答 8

5
10+10*10+10 == 10 + 100 + 10

明白了吗?

于 2013-01-15T19:57:20.520 回答
3

宏被逐字替换。想想搜索/替换。编译器将您的代码视为10+10*10+10.

出于这个原因,将宏替换文本括在括号中是常见的做法:

#define d (10 + 10)

当您的宏是类似函数的宏时,这一点更为重要:

#define SQ(x) ((x) * (x))

SQ(a + b)...

于 2013-01-15T19:57:59.857 回答
1

d*d扩展为10+10*10+10. 乘法先于加法,因此 10 + 100 + 10 = 120。

通常,#define表达式应始终用括号括起来:#define d (10+10)

于 2013-01-15T19:58:12.027 回答
1

宏只不过是一个简单的文本替换,所以你的行:

printf("%d",d*d);

变成

printf("%d",10+10*10+10);

您可以使用const变量来获得更可靠的行为:

const int d = 10+10;
于 2013-01-15T19:58:36.930 回答
1

宏按原样展开。你的程序变成

/* declarations and definitions from headers */

int main()
{
    printf("%d",10+10*10+10);
return 0;
}

并且计算被解释为

10 + (10 * 10) + 10

始终在宏周围使用括号(以及当你拥有它们时它们的参数)

#define d (10 + 10)
于 2013-01-15T19:58:48.047 回答
1
#define 

预处理器指令用第二个元素替换第一个元素。

就像“查找和替换”一样

于 2013-01-15T19:59:02.843 回答
1

我不确定#include,但在C# 中,#define 在顶部用于定义符号。这允许编码人员执行以下操作

#define DEBUG

string connStr = "myProductionDatabase";

#if DEBUG
    connStr = "myTestDatabase"
#edif
于 2013-01-15T20:00:12.650 回答
0

10+10*10+10 = 20 + 100 = 120

简单的数学;)

宏不计算该值(它不加 10 + 10),而只是用指定的表达式替换它的所有出现。

于 2013-01-15T19:57:27.027 回答