【问题标题】:Operators in C/C++/JavaC/C++/Java 中的运算符
【发布时间】:2010-02-03 07:57:56
【问题描述】:

考虑以下片段:

int a,b;
a = 1;
b = 2;

c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!

帮助我理解这种行为。

【问题讨论】:

  • “不起作用”含糊不清。它假定有一个表示“有效”的预期输出和一个表示“无效”的实际输出,而您都未能提供。
  • 有什么意义?

标签: java c++ c operators


【解决方案1】:
c = a++++b; 

被视为:

c = ((a++)++)b;  

这是不正确的,因为您试图增加非左值。

c = a++*+b; 

被视为:

c = (a++)*(+b);

出现这种现象的原因是:C语言词法分析器是greedy

在情况 1:在标记“a”(标识符)之后,词法分析器看到 +,然后是另一个 +,因此它将两者(作为增量运算符)作为同一标记的一部分使用。它不会使与 +++ 相同标记的第 3 个 + 部分不是有效标记。同样,它将接下来的两个 + 分组为 ++ 标记,使其实际上与:

c = ((a++)++)b;

这是不正确的,因为 a++ 不会返回左值,因此您不能在其上应用 ++。类似于说 5++;

但在 case2 中:第一对 ++ 将组合在一起(作为增量运算符)。接下来, * 单独将是一个标记,因为您不能将它与 + 组合,因为 *+ 不是有效的标记。最后 + 将是一个标记(作为一元 +)有效地使您的陈述为:

c = (a++)*(+b);

您可以通过使用括号或空格来覆盖词法分析器的这种贪婪行为,如下所示:

c = a++ + +b;  
c = a++ * +b;  

【讨论】:

    【解决方案2】:

    这实际上是因为 C 中的“maximum munch rule”。

    c = a++++b;
    

    被解析为c = a++ ++ b;,是语法错误。

    c = a++*+b;
    

    解析为c = a++ * +b;,可以。

    来自 C99 草案,第 6.4p4 节(重点是我的):

    如果输入流已被解析为预处理标记直到给定字符,则下一个预处理标记是可以构成预处理标记的最长字符序列

    【讨论】:

    • 感谢 Alok 提供参考和解释。
    【解决方案3】:

    ++ 的优先级等于 + 的优先级。所以我们从左到右。

    【讨论】:

      【解决方案4】:

      与我们在 C++ 中出现错误的原因相同:

      vector<vector<int>>;
      

      &gt;&gt; 将被视为一个运算符。

      【讨论】:

      • 好点,但与OP的问题无关。
      【解决方案5】:

      operator precedence。 ++ 的优先级高于二进制 +。

      【讨论】:

      • 我不明白它怎么可能是运算符优先级。
      • c = a++ + +b;很好,但如果你删除空格,那么它会变成一个无效的左值错误。
      • 我想我误解了这个问题。谢谢你的解释。
      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 2017-05-11
      • 2023-03-18
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      相关资源
      最近更新 更多