C/C+中的运算符+/JAVA

C/C+中的运算符+/JAVA,java,c++,c,operators,Java,C++,C,Operators,考虑以下片段: int a,b; a = 1; b = 2; c = a++++b; // does not work!! Compilation error. c = a++*+b; // works !! 帮助我理解这种行为 c = a++++b; 被视为: c = ((a++)++)b; c = (a++)*(+b); 这是不正确的,因为您试图增加非左值 及 被视为: c = ((a++)++)b; c = (a++)*(+b); 造成这种行为的原因是:C语言词法分

考虑以下片段:

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

c = a++++b; // does not work!! Compilation error.
c = a++*+b; // works !!
帮助我理解这种行为

c = a++++b; 
被视为:

c = ((a++)++)b;  
c = (a++)*(+b);
这是不正确的,因为您试图增加非左值

被视为:

c = ((a++)++)b;  
c = (a++)*(+b);
造成这种行为的原因是:C语言词法分析器是

在案例1中:在标记“a”(标识符)之后,lexer看到+,后面跟着另一个+,因此它将两者(作为增量运算符)作为同一标记的一部分使用。它不会使同一令牌的第3+部分成为无效的令牌。类似地,它将接下来的两个+组合到++令牌中,使其有效地与以下相同:

c = ((a++)++)b;
这是不正确的,因为++不会返回左值,因此不能对其应用+。类似于说5++

但在案例2中:第一对++将被分组在一起(作为增量运算符)。接下来,*将是一个标记,因为您不能将它与+组合,因为*+不是有效的标记。最后,+将作为一个标记(一元+)有效地表示您的声明:

c = (a++)*(+b);
您可以通过使用括号或空格来覆盖lexer的贪婪行为,如下所示:

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

这实际上是因为C中的“”

解析为
c=a+++b,这是语法错误

c = a++*+b;
解析为
c=a++*+b,这是正常的

根据C99草案第6.4p4节(重点矿山):

如果输入流已解析为预处理令牌(最多可达给定字符),则下一个预处理令牌是可构成预处理令牌的最长字符序列


.++优先级高于二进制+。

++的进程等于+。所以我们使用左到右。

< P>是为什么我们在C++中得到一个错误:
vector<vector<int>>;
向量;

>
将被视为一个操作员。

“不工作”是一个模糊的词。它假设有一个表示“工作”的预期输出,和一个表示“不工作”的实际输出,而您也没有提供。这有什么意义?我不明白它怎么可能是运算符优先级。c=a+++b;很好,但是如果你删除了空格,那么结果是一个无效的左值错误。我想我误解了这个问题。谢谢你的解释。非常感谢你提供的参考和解释。观点很好,但与OP的问题无关。