【问题标题】:Why the output for "a" is -80?为什么“a”的输出是-80?
【发布时间】:2011-01-30 07:15:41
【问题描述】:
#include<stdio.h>
#include<conio.h>
#define ABC 20
#define XYZ 10
#define XXX ABC - XYZ

void main()
{
    int     a;

    a = XXX * 10;

    printf("\n %d \n", a);

    getch();
}

我认为输出应该是 100,但是当我看到结果时,我发现输出为 -80。当我将括号设为#define XXX (ABC-XYZ) 时,我得到的输出为 100,但没有括号时,我得到的输出为 -80。

【问题讨论】:

  • 问题的标题并没有提供太多关于它是什么的信息。看首页的时候,不知道在看之前会不会有线索

标签: c c-preprocessor operator-precedence side-effects


【解决方案1】:

这里的XXX换成了ABC-XYZ 所以它 看起来像下面的

20 - 10 * 10

所以输出是-80

【讨论】:

    【解决方案2】:

    是这样计算的,

    20-10*10

    在宏 XXX 中使用大括号。

    #define XXX (ABC-XYZ)
    

    【讨论】:

      【解决方案3】:

      预处理器是一头愚蠢的野兽。它在纯文本级别上工作,而不考虑它在语义上对代码所做的事情。让我们看看它在这种情况下做了什么:

      a = XXX * 10;
      

      变成

      a = ABC - XYZ * 10;
      

      变成了

      a = 20 - 10 * 10;
      

      显然是-80

      可能的意图是

      #define XXX (ABC - XYZ)
      

      这是宏被认为是邪恶的原因之一。

      【讨论】:

      • 哦,谢谢它是如此简单,我很困惑。我想我的大脑现在一天都不工作了。 :)
      【解决方案4】:
      a = XXX * 10;
      

      编译前会变成如下:

      a = 20 - 10 * 10;
      

      计算结果为-80

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-10
        相关资源
        最近更新 更多