`int sum = n + - + - + - + n` 如何编译,其中 `n` 是 `int`?

How does `int sum = n + - + - + - + n` compile where `n` is an `int`?

今天下午,我真的不知道我在用 Operators 和 C 做什么。最终,我写了一些我认为无法编译的代码,但我不知道它是如何工作的。

密码是:

#include <stdio.h>

int main()
{
    int n=2;
    int sum = n + - + - + - + n;  /* This line */
    printf("%d\n", sum);
    return 0;
}

输出为:

0

我完全搞不懂代码是如何编译的以及幕后发生了什么。

int sum = n + - + - + - + n; 行如何运作?

除了第一个之外,其他都是一元运算符

n + - + - + - + n

相当于

n + (-(+(-(+(-(+n))))))

又等于

n + (-n)

解析所有一元运算符后。

-n 当然是普通的否定; +n 基本上什么都不做(尽管它有强制积分提升的副作用)。

+-也是一元运算符。 +n 的结果是 n 的(提升的)值。 -n 的结果是(提升)n 的负数。

n + - + - + - + n;

相当于:

n + (-(+(-(+(-(+n))))))

这基本上是 n + (-n) 假设没有发生溢出。

int sum = n + - + - + - + n;
/*          b u u u u u u   */
/* Order:   7 6 5 4 3 2 1   */

相当于:

n + (-(+(-(+(-(+n))))));

或者干脆 n + (-n)

请注意,在 C opeartor precedance table 中,一元运算符的绑定比二元运算符更紧密,一元运算符 +- 的结合性是从右到左,而二元运算符 +- 的结合性是从左到右.