C语言中的宏问题

时间:2016-01-22 16:37:41

标签: c macros c-preprocessor

我在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;
}

有人可以对该代码发表评论,以便我知道发生了什么吗?或者,如果您有与注释代码相似的练习的链接,我可以从中学到很多。

6 个答案:

答案 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,因此-2int 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预处理器已在主函数的第二行扩展了宏。现在让我们对您的代码发表评论:

  • 第1行:将值2分配给int变量i。
  • 第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。请评论我是否可以澄清我所说的任何内容。