C 等式(a,b)((a)=(b))的定义是什么?

C 等式(a,b)((a)=(b))的定义是什么?,c,c-preprocessor,C,C Preprocessor,我已获得C代码,其中标题语句包括以下内容: #define, EQ(a, b) ((a) == (b)) 它是什么意思?它没有任何意义:此代码格式不正确。紧跟在#define后面的令牌必须是标识符,而,不是 如果要删除,,这将定义一个名为的EQ,该EQ包含两个参数。逗号是一个错误,将阻止代码编译:我假设它是一个输入错误 鉴于: #define EQ(a, b) ((a) == (b)) 这为相等运算符==定义了一个宏 稍后在代码中使用此宏,您可以键入,例如: if (EQ(2+2, 4))

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

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

它是什么意思?

它没有任何意义:此代码格式不正确。紧跟在
#define
后面的令牌必须是标识符,而
不是


如果要删除
,这将定义一个名为
的EQ
,该EQ包含两个参数。

逗号是一个错误,将阻止代码编译:我假设它是一个输入错误

鉴于:

#define EQ(a, b) ((a) == (b))
这为相等运算符
==
定义了一个宏

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

if (EQ(2+2, 4))
而不是:

if (2+2 == 4)

不是很有用,真的。

让我们一步一步来

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

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

例如,此代码:

#define MAX 10
int numbers[MAX];
预处理后(即预处理器宏的解释)

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

这就引出了另一个例子

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

所以

正方形(5)
将替换为
(5*5)

最后是我们的例子

#define, EQ(a, b) ((a) == (b))
这将用
((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 ++;
哦!!我可能说得太多了,但让我留下这个(明显的)代码

在运行预处理器之后,将

int variable = 10;
char some_string[] = "the MAX value";
int variable_MAX;

您的
#define square(x)(x*x)
示例是避免使用宏的一个很好的理由。
平方(4+2)
的结果是什么?36还是14?启用优化后,可以内联使用像
double square(double d){return d*d;}
这样的小函数,因此不会比宏的慢(但更安全)。在这种情况下,您可能需要使用大量括号:-)。我个人不喜欢宏。函数更易于维护、读取和理解,并且不容易出错。对于大多数应用程序,考虑到当今的处理能力和编译器成熟度,我认为在许多情况下,代码质量方面的成本大于优化代码的收益。
#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;