2017-02-28 215 views
-2

我刚开始学习C编程,我有一个基于表达式评估的问题。 如果我们有3个变量,ab,并cC - 优先增加/减少?

  1. c=a+++b++;
  2. c=a+++++b;

为什么是第一个表达有效和无效的第二个?

+0

答案通俗地称为'最大蒙克'规则。词法分析器将尽可能多地获取令牌。当它看到'c = a +++ b ++;'时,它识别'a ++ + b ++'。当它看到'c = a +++++ b;'时,它识别出'a ++ ++ + b',并且不能增加增量操作的结果。还必须有其他问题提出相同的问题。 –

+0

加上Jonathan所说的,这就是编译器提示你增加运算符所需的*左值的原因。 – nullpointer

+0

@JonathanLeffler这可能是一个更好的重复(你击败了我36秒):http://stackoverflow.com/questions/5341202/why-doesnt-ab-work-in-c –

回答

-1

看起来,C编译器确实将a+++解释为a++ +,而即使您将其他变量放在其之前,+++b也会生成错误。

在实践中,编写这样的表达式不含空格是一个非常糟糕的主意。你会混淆自己,当你回过头来看看你的代码,并激怒任何人看它:)只要改写:

  1. a++ + b++
  2. a++ + ++b

,并如预期一切都将正常工作。

+0

“原则上1)和2)应该工作” - 不在C. – Olaf

+0

为什么不?取决于你如何解析2)中的表达式。 – Demq

+0

该标准明确了解如何解析这两个表达式。所以没有“依赖”。 (只是为了讨论:如果使用非贪婪的方法,版本1('a + ++ b ++')将调用UB。无论哪种方式,其中一个表达式调用UB。没有编译器会在贪婪/非贪婪随机,因为你的答案可能意味着)。 – Olaf