gpt4 book ai didi

java - C/C++/Java 中的运算符

转载 作者:可可西里 更新时间:2023-11-01 18:40:26 24 4
gpt4 key购买 nike

考虑以下片段:

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 语言词法分析器是 greedy .

在情况 1 中:在标记 'a'(标识符)之后,词法分析器看到 +,然后是另一个 +,因此它将两者(作为增量运算符)作为同一标记的一部分使用。它不会使同一标记的第三个 + 部分成为+++ 不是有效标记。类似地,它将接下来的两个 + 分组为++ token ,使其有效地与:

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

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

但在情况 2 中:第一对++ 将组合在一起(作为递增运算符)。接下来,单独的 * 将是一个标记,因为您不能将它与 + 结合使用,因为 **+ 不是有效标记。最后,+ 将是一个标记(作为一元 +),有效地使您的声明如下:

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

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

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

关于java - C/C++/Java 中的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2190444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com