Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java运算符和操作数_Java_Operators_Operands - Fatal编程技术网

java运算符和操作数

java运算符和操作数,java,operators,operands,Java,Operators,Operands,考虑 int a =10; c = a/a; //c becomes 1. c= a* + a/a ; //c becomes 1. c= 5+ a* + a/a ; //c becomes 15. c = ++a + a++ - --a - a-- + a * + a/a ; //c becomes 10. 有人能告诉我上面的工作原理吗?尤其是a*部分。第一条仅供参考。在这一行: c= a* + a

考虑

    int a =10;
    c = a/a;          //c becomes  1.
    c= a* + a/a ;     //c becomes  1.     
    c= 5+ a* + a/a ;  //c becomes  15.
    c = ++a + a++ - --a - a-- + a * + a/a ;     //c becomes  10.
有人能告诉我上面的工作原理吗?尤其是a*部分。第一条仅供参考。

在这一行:

c= a* + a/a ;
+
是最简单的。所以它相当于

c = a * a/a;
c = (a * (+a)) / a;
    (10 * (+a)) / a
    (10 * (+10)) / a
    (10 * 10) / a
    100 / a
    100 / 10
    10
c = 5 + ((a * (+a)) / a)
    5 + ((10 * (+a)) / a)
    5 + ((10 * (+10)) / a)
    5 + ((10 * 10) / a)
    5 + (100 / a)
    5 + (100 / 10)
    5 + 10
    15
c = ((((++a) + (a++)) - (--a)) - (a--)) + ((a * (+a)) / a);
变量
a
是10,因此
10*10/10
10
,而不是
1
。然后

c= 5+ a* + a/a;
相当于
c=5+a*a/a
,因此
c
现在是
15
。然后

c = ++a + a++ - --a - a-- + a * + a/a ;

增量前将
a
更改为
11
。增量后
a++
增加到
12
,但产生旧值
11
,产生到目前为止的
22
。然后预减量递减到
11
,减法得到
11
。接下来,后置减量递减到
10
,但产生旧值
11
,减法产生
0
。我们已经知道了
a*+a/a
是什么,
10

让我们看看第三行

c = a * + a / a;
没有后缀
*
运算符(
EXPR*
),但有一个中缀
*
运算符(
EXPR*EXPR
):乘法运算符。因此,
*
必须是乘法运算符

有一个前缀
+
运算符(
+EXPR
):一元加号运算符。因此,
+
必须是一元加号运算符

以上相当于

c = a * a/a;
c = (a * (+a)) / a;
    (10 * (+a)) / a
    (10 * (+10)) / a
    (10 * 10) / a
    100 / a
    100 / 10
    10
c = 5 + ((a * (+a)) / a)
    5 + ((10 * (+a)) / a)
    5 + ((10 * (+10)) / a)
    5 + ((10 * 10) / a)
    5 + (100 / a)
    5 + (100 / 10)
    5 + 10
    15
c = ((((++a) + (a++)) - (--a)) - (a--)) + ((a * (+a)) / a);

对于下一行中的
EXPR*+EXPR
,情况完全相同

c = 5 + a * + a / a
相当于

c = a * a/a;
c = (a * (+a)) / a;
    (10 * (+a)) / a
    (10 * (+10)) / a
    (10 * 10) / a
    100 / a
    100 / 10
    10
c = 5 + ((a * (+a)) / a)
    5 + ((10 * (+a)) / a)
    5 + ((10 * (+10)) / a)
    5 + ((10 * 10) / a)
    5 + (100 / a)
    5 + (100 / 10)
    5 + 10
    15
c = ((((++a) + (a++)) - (--a)) - (a--)) + ((a * (+a)) / a);

最后一行中的
EXPR*+EXPR
的情况完全相同

c = ++a + a++ - --a - a-- + a * + a/a;
相当于

c = a * a/a;
c = (a * (+a)) / a;
    (10 * (+a)) / a
    (10 * (+10)) / a
    (10 * 10) / a
    100 / a
    100 / 10
    10
c = 5 + ((a * (+a)) / a)
    5 + ((10 * (+a)) / a)
    5 + ((10 * (+10)) / a)
    5 + ((10 * 10) / a)
    5 + (100 / a)
    5 + (100 / 10)
    5 + 10
    15
c = ((((++a) + (a++)) - (--a)) - (a--)) + ((a * (+a)) / a);
最后一行使用并修改同一表达式中的
a
。在大多数语言中,这类代码的行为未定义,因为操作数求值顺序未定义。即使如此,理解何时将引用作为副本放置在堆栈上也是至关重要的,这会导致代码质量低下

在Java中,但在我的测试中实际情况并非如此。让我们看一下
(++a++)(a++)-(-a)
,对于
a
,初始值为
10

使用从左到右的求值:

((++a) + (a++)) - (--a)    [a=10]
(11 + (a++)) - (--a)       [a=11]
(11 + 11) - (--a)          [a=12]
22 - (--a)                 [a=12]
22 - 11                    [a=11]
11

使用
java
,您可以得到13。因此,我不会实际显示如何评估最后一行。这就需要检查生成的字节码,如果它是有效的,就表明它是糟糕的代码。

c=a*+a/a//c变为1。
这是错误的,c在这里变为10。这是一元加运算符。
a*+a
只是一种令人困惑的书写方式
a*+a/a
,这是一种令人困惑的书写方式
a*a/a