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