我在C中遇到了Macros的问题。我尝试阅读一些材料,但它已经超出了我的想法。
例如:
#include <stdio.h>
#define A(x) ((x)?-1:0)
int main()
{
int i = 2;
int i2 = A(i)*i;
printf("%d", i2);
return 0;
}
有人可以对该代码发表评论,以便我知道发生了什么吗?或者,如果您有与注释代码相似的练习的链接,我可以从中学到很多。
答案 0 :(得分:5)
扩展宏后,i2
行将如下所示:
int i2 = ((i) ? -1 : 0) * i;
我认为双等于是一个错字。
由于i
的值为2
,因此上面将采用三元表达式的第一部分,并评估-1 * 2
当然是-2
。< / p>
一个想法是通过预处理器运行代码,并查看结果。对于gcc
,相关的命令行选项为-E
。
答案 1 :(得分:4)
首先,您遇到语法错误。这样:
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,因此三元计算结果为true,因此((i)?-1:0)
的计算结果为-1。然后将其乘以i
(即2),得到-2,然后将其分配给i2
。
答案 2 :(得分:3)
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 ==
。
注意 - 现在这个陈述不正确 -
Get-Process | Select-Object `
Id,
ProcessName,
StartTime,
@{Name="ModuleName"; Expression={$_.MainModule.ModuleName}}
答案 3 :(得分:1)
有人可以对该代码发表评论
不确定。我认为宏观扩张令人困惑:
上面示例中的 1 A(i)
为A(2)
。
2 A(2)
扩展为2?-1:0
3 2?-1:0
相等-1
因为2
不是0
(?
的解释在这里:What does ? in C mean?)
无论如何,我希望你知道这不是一个好的代码。 ;)
答案 4 :(得分:1)
Order
的格式为
#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 =((i)? - 1:0);
因为我&lt;&gt; 0然后 i2 = -1;
答案 5 :(得分:1)
&#34;有人可以评论该代码,以便我知道发生了什么吗?&#34;
在发表评论之前,让我们让C-Preprocessor澄清正在发生的事情。在实际编译代码之前,C预处理器负责将宏扩展到代码中(它还负责处理程序顶部的#include)。通过C预处理器运行main()函数,输出为:
int main()
{
int i = 2;
int i2 = ((i)?-1:0)*i;
printf("%d", i2);
return 0;
}
如您所见,C预处理器已在主函数的第二行扩展了宏。现在让我们对您的代码发表评论:
第2行:任何非零整数都会导致&#34; true&#34;如果声明(继续,写一个程序,看看你自己!)。三元运算符语法是:
结果=(有条件的)? (表达如果正确):(表达如果错误)
由于条件(2)计算为True,因此宏将返回-1。然后它将乘以-1,得到-2。
我非常确定第3和第4行在这一点上是不言自明的。
您是在IDE中还是在命令行上编程?我强烈建议您使用命令行,或者至少能够在需要时使用它。例如,您可以通过运行
在命令行上通过c预处理器运行代码cpp <your-program-name>.c
或(如果使用GNU C编译器)
gcc -E <your-program-name>.c
您将能够看到发生了什么事情&#34;引擎盖下#34;更容易。 IDE会尝试隐藏这些详细信息,原因无论好坏。但在C语言中,小细节确实很重要,因为您选择使用低级但功能非常强大的语言。我为此鼓掌。
还可以利用C-faq(http://c-faq.com)网站。特别是,请查看C Preprocessor FAQ。请评论我是否可以澄清我所说的任何内容。