对于
(a++-++b);
解析器知道,在 int 上没有 +- 或 -+ 运算符之类的东西。所以它可以拆分 (a++ - ++b) 中的表达式;
对于
(a+++++b);
这可以是 (a+ ++... 或 (a++ +...),但我们先来看一个更简单的表达式:
int a = 100;
int b = 0;
-> int c=a+++b;
| Added variable c of type int with initial value 100
期望的结果是什么? a++ +b 还是 a+ ++b?嗯,它被解释为 c=
(a++)+b;但这是一种糟糕的风格,因为您必须在头部了解运算符优先级的详细信息。
是允许 ++++b 还是 a++++?
-> ++++b;
| Error:
| unexpected type
| required: variable
| found: value
| ++++b;
| ^-^
-> a++++;
| Error:
| unexpected type
| required: variable
| found: value
| a++++;
| ^-^
没有。为什么不?你可以争辩说它是 (a++)++;或 ++(++b);但是两者都包括两个步骤,加一并返回一个值,所以对于
a=100
b=0
c=a++;
c=++b;
我们知道,c 会变成 100 或 1,在一种情况下,返回是在递增 (c=a++) 之前执行,另一种情况是在 (++b) 之后执行;
现在 ++++b 会发生什么;或 ++(++b);返回什么?
考虑到这一点,a+++++b 的唯一有效解释是 a++ + ++b;没有a+ ++ ++b,也没有a+ +++ +b。
还有 a++ + ++b;作品:
-> c=a++ + ++b;
| Variable c has been assigned the value 101
但是由于它很少使用,插入两个空格也没什么大不了的,而且对读者更友好,无论如何,我们应该忍受不一致,a+++++b被拒绝,而a++-+ +b 是允许的,但这不会使后者成为一个很好读的表达式。水平空间也使代码更易于人类解析,这应该是您主要关心的问题。
如果你想把某人逼疯,请使用
c=a--- - --b;
因为有这个一元 -,它对于产生负值(如 -7)很方便。