C 等式(a,b)((a)=(b))的定义是什么?
我已获得C代码,其中标题语句包括以下内容: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))
#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;