C程序输出

san*_*101 1 c macros c-preprocessor

#include<stdio.h>

#define a(x) (x * x) 

int main() 
{
    int i = 3, j;

    j = a(i + 1);
    printf("%d", j);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么程序没有提供输出16.(我得到了输出7.)


我非常理解这一点,但如果程序是这样的:

#include<stdio.h>

#define a(x) (x * x)

int main()
{
    int i = 3, j, k;

    j = a(i++);
    k = a(++i);
    printf("%d\n%d", j, k);

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

那么为什么上面的程序给出了以下输出:

9
49
Run Code Online (Sandbox Code Playgroud)

Chr*_*utz 7

因为你做了一个糟糕的宏:

a(i + 1)
Run Code Online (Sandbox Code Playgroud)

扩展到

i + 1 * i + 1
Run Code Online (Sandbox Code Playgroud)

这相当于

i + i + 1
Run Code Online (Sandbox Code Playgroud)

要么

2 * i + 1
Run Code Online (Sandbox Code Playgroud)

使用括号:

#define a(x) ((x) * (x))
Run Code Online (Sandbox Code Playgroud)

然后你会把它扩展到

(i + 1) * (i + 1)
Run Code Online (Sandbox Code Playgroud)

哪能做到你想要的.

  • @sbi Undefined,绝对.@sandy请不要通过编辑将问题改成另一个问题,突然所有答案都变得错误或不完整.你的第二个问题在这里被打死了,加上它吸引了那些人说如果你是一个合适的工程师,你应该能够预测未定义的结构的作用.请,StackOverflow搜索. (3认同)
  • @ sandy101:编辑代码的问题是它在没有插入序列点的情况下改变了`i`两次.那是在调用未定义的行为.(或者在这种情况下是_unspecified_?无论如何,对于不同的编译器,月相和诸如此类的结果可能会有所不同) (2认同)