c - 为什么 "a"的输出是 -80?

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

#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。

最佳答案

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

a = XXX * 10;

成为

a = ABC - XYZ * 10;

变成

a = 20 - 10 * 10;

显然,-80

可能的意图是

#define XXX (ABC - XYZ)

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

关于c - 为什么 "a"的输出是 -80?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491634/

相关文章:

android - jni/Android.mk :8:curlLib/packages/Android/Android. mk: 没有那个文件或目录

c - 使用 CMake 在 CLion 中构建引发错误

c++ - 使用#ifndef 时具体定义了什么

c++ - 初始化器列表 *argument* 评估顺序

c - 如何在C中获取数组前N个值的索引

c - OpenGL - 如何让这个程序适用于大于 1x1 的纹理?

c++ - 如何获取在 Main.cpp 中声明的全局变量以便在 header 中访问

ios - #define 用于不同的屏幕尺寸——iPhone 4 和 iPhone 5

sql - SQL Server : -100/-100*10 = 0 中奇怪的操作问题

haskell - cons操作cons元素是从右到左吗?