[英]Trouble with macros in C
我在C语言中遇到了麻烦。我尝试阅读一些材料,但它已经过了我的脑海。
例如:
#include <stdio.h>
#define A(x) ((x)?-1:0)
int main()
{
int i = 2;
int i2 = A(i)*i;
printf("%d", i2);
return 0;
}
有人可以评论该代码,所以我知道发生了什么? 或者,如果您有与注释代码类似练习的链接,我可以从中学习,这将是很棒的。
宏扩展后, i2
行将如下所示:
int i2 = ((i) ? -1 : 0) * i;
我认为双等于是一个错字。
并且因为i
的值是2
,所以上面将采用三元表达式的第一部分,并且评估-1 * 2
,其当然是-2
。
一个想法是通过预处理器运行代码,并查看结果。 使用gcc
,相关的命令行选项是-E
。
首先,您有语法错误。 这个:
int i2= = A(i)*i;
应该是这样的:
int i2 = A(i)*i;
修复后, A
这里是一个函数宏。 它接受它的参数并将其替换为宏表达式。
所以这:
int i2 = A(i)*i;
取代这个:
int i2 = ((i)?-1:0)*i;
这个: ?:
是三元运算符。 它首先评估第一个表达式。 如果该表达式的计算结果为true(即非零),则计算第二个表达式,否则计算第三个表达式。
由于i
等于2,因此三元计算结果为真,因此((i)?-1:0)
计算结果为-1。 然后将其乘以i
(其为2)以给出-2,然后将其分配给i2
。
int i = 2;
int i2=A(i)*i; // statement after correction
i2
将具有值-2
,因为在扩展声明之后将是 -
int i2=((i)?-1:0)*i; // condition is checked
因为i
( 正整数 )不是0
因此条件为真,它的计算结果为-1
,然后-1*i
即-1*2
,因此i2
为-2
。
注意 - 此时此声明不正确 -
int i2= = A(i)*i;
^^^ use assignment operator not ==
有人可以对该代码发表评论
当然。 我认为宏观扩张令人困惑:
以上示例中的A(i)
是A(2)
。
2 A(2)
扩展为2?-1:0
3 2?-1:0
等于-1
因为2
不是0
( ?
解释是: C中的含义是什么意思? )
无论如何,我希望你知道这不是一个好的代码。 ;)
#define A(x) ((x)?-1:0)
是格式的
var = boolean_condition ? if_true : if_false;
这是这个的紧凑格式:
if ( boolean_condition )
var = if_true;
else
var = if_false;
在你的情况下
int i2 = A(i)*i;
编译器会将宏扩展为
int i2 =((i)? - 1:0);
因为i <> 0然后i2 = -1;
“有人可以对该代码发表评论,所以我知道发生了什么事吗?”
在我评论之前,让我们让C-Preprocessor澄清正在发生的事情。 在实际编译代码之前,C预处理器负责将宏扩展到代码中(它还负责处理程序顶部的#include)。 通过C预处理器运行main()函数,输出为:
int main()
{
int i = 2;
int i2 = ((i)?-1:0)*i;
printf("%d", i2);
return 0;
}
如您所见,C预处理器已在主函数的第二行扩展了宏。 现在让我们评论你的代码:
第2行:任何非零整数都将产生一个“true”if语句(继续,编写一个程序并自己查看!)。 三元运算符语法是:
结果=(有条件的)? (表达如果正确):(表达如果错误)
由于条件(2)计算True,宏将返回-1。 然后它会将i乘以-1,得到-2。
我很确定第3和第4行在这一点上是不言自明的。
您是在IDE中还是在命令行上编程? 我强烈建议您使用命令行,或者至少能够在需要时使用它。 例如,您可以通过运行任一命令在命令行上通过c预处理器运行代码
cpp <your-program-name>.c
或(如果使用GNU C编译器)
gcc -E <your-program-name>.c
你将能够更容易地看到“引擎盖下”发生了什么。 IDE会尝试隐藏这些详细信息,原因无论好坏。 但在C语言中,小细节确实很重要,因为你选择使用低级但非常强大的语言。 为此,我为你鼓掌。
还可以利用C-faq( http://c-faq.com )网站。 特别是,请查看C预处理器常见问题解答 。 请评论我是否可以澄清我所说的任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.