0

我已经获得了C代码,其中标题语句包括以下内容:

#define, EQ(a, b) ((a) == (b))

这是什么意思?

4

3 回答 3

6

它没有任何意义:这段代码格式不正确。紧跟在 a 之后的标记#define必须是标识符,但,不是。

如果,要删除 ,这将定义一个名为的类函数宏EQ,该宏需要两个参数。

于 2012-08-08T03:43:33.953 回答
6

逗号是一个错误,会阻止代码编译:我假设它是一个错字。

鉴于:

#define EQ(a, b) ((a) == (b))

这为相等运算符定义了一个宏==

稍后在代码中使用此宏,您可以键入,例如:

if (EQ(2+2, 4))

代替:

if (2+2 == 4)

不是很有用,真的。

于 2012-08-08T03:44:21.680 回答
2

让我们一步一步来

#define MAX 10

这会将代码文件中单词“MAX”的每个实例替换为 10。这非常类似于定义一个具有一个主要区别的常量变量。#define 语句的解释在编译之前完成。这有助于例如使用 MAX 作为数组大小。如果您改用变量,这在许多情况下会导致编译器错误。

您可以cpp <filename.c>在 Linux 终端中使用命令来查看执行宏时会发生什么。

例如这段代码:

#define MAX 10
int numbers[MAX];

预处理后(即预处理器宏的解释)

int numbers[10];

请注意,#define 语句将在解释后消失。

这将我们带到另一个例子

#define square(x) (x * x)

我们代码中的每个实例square(x)不仅会被替换,(x * x)而且 x 的值也会被替换。其效果类似于功能减速,但又有所不同

所以

square(5)将被替换为(5 * 5)

最后我们的例子

#define, EQ(a, b) ((a) == (b))

这将替换EQ(a, b)by((a) == (b))

举个例子

EQ(4, 5)将被替换为((4) == (5))

现在“==”是什么意思?如果 4 和 5 相等,则“检查是否相等”整个表达式将评估为 1(这显然不是真的),因此该表达式最终将被评估为 0。

哪个或多或少喜欢这个功能的效果

int EQ(int a, int b)
{
    return (a == b);
}

也可以写成

int EQ(int a, int b)
{
    if (a ==b) return 1;
    if (a !=b) return 0;
}

请注意,使用宏我们避免了两个变量声明,并且实际上没有函数调用,而且通常更快。如果您有较慢的处理器(或微处理器),这一优势将是显而易见的。

最后让我说明显而易见的

#define simple_macro 5
int some_integer_variable = 10;
.
.
.
some_integer_variable = simple_macro;
simple_macro = 12;  /* illegal statement */
simple_macro++;     /* illegal statement */

因为在运行预处理器之后,这将是

int some_integer_variable = 10;
.
.
.
some_integer_variable = 5;
5 = 12;
5 ++;

哦!我可能说得太多了,但让我把这个(明显的)代码留给你

#define MAX 10
int variable = MAX; /*this is a MAX variable */
char some_string[] = "the MAX value";  /* no replacement will happen here */
int variable_MAX;                      /* no replacement will happen here */

运行预处理器后将

int variable = 10;
char some_string[] = "the MAX value";
int variable_MAX;
于 2012-08-08T06:55:46.937 回答