有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

考虑以下片段:

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

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

帮助我理解这种行为


共 (5) 个答案

  1. # 2 楼答案

    同样的原因,我们在C++中得到了错误:

    vector<vector<int>>;
    

    >>将被视为一个运算符

  2. # 3 楼答案

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

    c = a++++b;
    

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

    c = a++*+b;
    

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

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

    If the input stream has been parsed into preprocessing tokens up to a given character, the next preprocessing token is the longest sequence of characters that could constitute a preprocessing token.

  3. # 4 楼答案

    c = a++++b; 
    

    被视为:

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

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

    c = a++*+b; 
    

    被视为:

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

    这种行为的原因是:C语言词法分析器是greedy

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

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

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

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

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

    您可以通过使用括号或空格来覆盖lexer的贪婪行为,如下所示:

    c = a++ + +b;  
    c = a++ * +b;  
    
  4. # 5 楼答案

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