繁体   English   中英

C语言中的宏问题

[英]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预处理器已在主函数的第二行扩展了宏。 现在让我们评论你的代码:

  • 第1行:将值2分配给int变量i。
  • 第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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM