【问题标题】:How does `int sum = n + - + - + - + n` compile where `n` is an `int`?`int sum = n + - + - + - + n`如何编译,其中`n`是`int`?
【发布时间】:2015-09-02 07:43:51
【问题描述】:

今天下午,我真的不知道我在用 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; 行是如何工作的?

【问题讨论】:

  • 你知道一元运算符吗?
  • 其中大部分是一元运算符。
  • 是的,我知道,但我完全搞不懂它是如何工作的,我也尝试了相同代码的一些不同变体,但仍然有效。
  • 一元 + 运算符通常相当混乱,因为它的实际用途非常有限。它主要存在于语言中,以使其与更有用的一元 - 运算符保持一致。
  • 谁会写这样的代码,(如果不是教授/助教)?

标签: c operators arithmetic-expressions


【解决方案1】:

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

n + - + - + - + n

等价于

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

这又简单地等于

n + (-n)

在解决所有一元运算符之后。

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

【讨论】:

  • 以及如何计算 sum = n - - - n + - n;
  • @PankajPrakash -- 由于最大紧缩规则,将成为一个没有空格的不同运算符。
  • @PankajPrakash 自己想办法 - 这是一个很好的练习。
  • @MohitJain:有空格,所以会解析为两个一元运算符。
  • @nneonneo 好的,空间很难发现
【解决方案2】:

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

n + - + - + - + n;

相当于:

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

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

【讨论】:

    【解决方案3】:
    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 中的二元运算符绑定更紧密,并且一元运算符 +- 的结合性是从右到左,而二元运算符 +- 的结合性是从左到右。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 2016-05-11
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      相关资源
      最近更新 更多