`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
中,一元运算符的绑定比二元运算符更紧密,一元运算符 +-
的结合性是从右到左,而二元运算符 +-
的结合性是从左到右.
今天下午,我真的不知道我在用 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
中,一元运算符的绑定比二元运算符更紧密,一元运算符 +-
的结合性是从右到左,而二元运算符 +-
的结合性是从左到右.