java中扩展赋值运算的优先级怎么规定?

Python013

java中扩展赋值运算的优先级怎么规定?,第1张

1 位运算符

一共3个移位运算符,左移位<<,右移位>>和无符号移位>>>。左移位<<在低位处补0。右移位>>若值为正则在高位插入0,若值为负则在高位插入1。无符号右移位>>>无论正负都在高位处插入0。

非运算符~

&对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。

^对两个整型操作数中对应位执行布尔代数,两个位相等0,不等1。

|对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1。

如:

以下哪种运算正确:

A. 1010 0000 0000 0000 0000 0000 0000 0000 >>4

gives 0000 1010 0000 0000 0000 0000 0000 0000

B. 1010 0000 0000 0000 0000 0000 0000 0000 >>4

gives 1111 1010 0000 0000 0000 0000 0000 0000

C. 1010 0000 0000 0000 0000 0000 0000 0000 >>>4

gives 0000 1010 0000 0000 0000 0000 0000 0000

D. 1010 0000 0000 0000 0000 0000 0000 0000 >>>4

gives 1111 1010 0000 0000 0000 0000 0000 0000

选:B C

以下哪一运算正确:

A. 0000 0100 0000 0000 0000 0000 0000 0000 <<5

gives 1000 0000 0000 0000 0000 0000 0000 0000

B. 0000 0100 0000 0000 0000 0000 0000 0000 <<5

gives 1111 1100 0000 0000 0000 0000 0000 0000

C. 1100 0000 0000 0000 0000 0000 0000 0000 >>5

gives 1111 1110 0000 0000 0000 0000 0000 0000

D. 1100 0000 0000 0000 0000 0000 0000 0000 >>5

gives 0000 0110 0000 0000 0000 0000 0000 0000

选:A C

Given:

1.Public class test (

2. Public static void main (String args[]) (

3. System.out.printIn (6 ^ 3)

4.)

5.)

What is the output

Ans: 5

2 位运算符返回的是数值,不是boolean类型值

如:

if(5&7>0 &&5|2)

System.out.println("true")

显示:编译出错

3 对于一个整型数进行移位,其右操作数应该小于32,对于一个长整型数进行移位,其右操作数应该小于64。如果右操作数大于了规定的位数,编译不会报错,取右操作数的模来进行移位操作。

如:

class Test

{

public static void main(String args[])

{

int x= 16384

System.out.println(x>>33)

}

}

显示:8192

4 注意进行位操作时,会自动转成int型,转换之后,可接受右操作数长度为32。进行位运算时,总是先将短整型和字节型值转换成整型值再进行移位操作的。

如:

class Test

{

public static void main(String args[])

{

byte x = 127

byte y = (byte)(x>>9)

System.out.println(y)

}

}

显示:0

如:

char c = 'l'

System.out.println(c>>1)

编译通过,把字符值转成了int值

5 boolean类型值true对应位值1,false对应位值0,返回仍然是boolean类型。&,|,^,都可以用于布尔值,但是~不能用于布尔值。

布尔类型true,false可以比较,但只有==能使用,<,<=...会产生编译错误。除此外,布尔类型不能和其他类型数值比较。

如:

class Test

{

public static void main(String args[])

{

boolean x = true

boolean y = false

System.out.println((x&y) + " " + (x&x))

System.out.println((x^y) + " " + (y^y))

System.out.println((x|y) + " " + (y|y))

}

}

显示:false ture true false false true true false

6 位运算要求操作数为整数,操作数不能是字符串也不能是小数。

如:

String s = "Hello"

long l = 99

double d = 1.11

int i = 1

int j = 0

a:j = i<<s

b: j = i<<j

c: j = i<<d

d: j = i<<l

正确:b,d

如:

char c = 'l'

System.out.println(c>>1)

编译通过,把字符值转成了int值

Integer i = Integer("1")

System.out.println(i>>1)

编译无法通过

7 由于位运算是二进制运算,不可与一些八进制数搞混,java中二进制无表示法。

如:

System.out.println(010|4)

显示:12

并且当位运算中遇见负数,必须把它转成补码再进行计算。而不是使用原码。

如:

class Test

{

public static void main(String args[])

{

try

{

int x = -7

System.out.println(x/2 + " " + (x >>1))

}

catch(Exception e)

{

System.out.pritnln("Exception")

}

}

}

a A compiler error

b Exception

c -3 -3

d -3 -4

e -4 -4

f None of the above

选:f

-7>>1:-7补码:11111111 11111111 11111111 11111001

随后操作得: 11111111 11111111 11111111 11111100

关于-7/2,其中仍与正数除法相同,为-3。

如:

int a = -1

int b = -1

a = a >>>31

b = b >>31

显示:a=1,b=-1

其中b处,高位插入1,是插入31个,是一32个1,这是一个补码,随后转成十进制为-1。

稍复杂的如:

int i = 1

i <<= 31

i >>= 31

i >>= 1

int j = 1

j <<= 31

j >>= 31

System.out.println("i=" + i)

System.out.println("j=" + j)

显示:i=-1 j=-1

i<<=31 : 1000 0000 0000 0000 0000 0000 0000 0000 //这里已经被当作负数了

i>>=31 : 1111 1111 1111 1111 1111 1111 1111 1111

i>>=1 : 1111 1111 1111 1111 1111 1111 1111 1111

8 对于~操作,可以根据计算机中二进制正负数之间的关系,采取取负减一法,即~i = (-i)-1.

如:

int i = 45678

int j = ~i

System.out.println(j)

结果:(-45678)-1 = -45679

如:

class Test

{

public static void main(String args[])

{

int x = 1

int y = ~x+1

System.out.println(x+" "+y)

}

}

显示:1 -1

9 运算符优先级和运算顺序:运算顺序从左至右,赋值顺序从右至左。

class Test

{

public static void main(String args[])

{

int [] refToArray = { 10, 11}

int var = 1

refToArray[var-1] = var = 2

System.out.println(refToArray[0] + " " + refToArray[1])

}

}

如上输出为2和11,首先计算数组下标,随后赋值。

运算符== 的优先级高于赋值运算符=的优先级。

如:

public class Test

{

public static void main(String args [])

{

int i = 10

int j = 10

boolean b = false

if(b=i==j)

System.out.println("True")

else

System.out.println("False")

}

}

位运算符和比较符同级别,自左向右运算即可。

如:

if(5&7>0 &&5|2)

System.out.println("true")

显示:编译出错

其中5&7最先计算,随后计算5&7结果是否大于0。

布尔型..即true与false.

java 表达式,由变量,literal和运算符号组合而成.java 总共提供大约30种操作符.下面一一介绍.

1、算术运算

算术运算符有+,-,*,/,% 五种。对于整数来说,算术运算符得到的结果只会是int,为什么呢?因为怕运算完后的结果会超出原来数据类型的范围.

2、比较运算

比较运算符有大于(>),小于(<),大于等于(>=),小于等于(<=),等于(==)和不等于(!=).比较运算的结果一定只有两种,true或false,也就是boolean类型的literal.

不是只有数据才能比较大小,字符也可以,另外等于和不等于也可以用在非基本数据类型之间,如类,对象,字符串,数组等.String的比较不能直接用==.因为它是一个类,不是一种数据类型.

3、逻辑运算

逻辑运算符有与“&&”,或“||”,非“!”,其中“”和“”是短路逻辑操作符。逻辑运算还有“&”“|”“^”等三个按操作符。

4、递加、递减运算

递加“++”,递减“--”,这个与C的语法一样,在使用递加、递减时要特别注意它是放在变量的前面还是后面。如果是如“++a”,java会先将a的值加加,再把新的数值拿去做别的运算。而如果是“a++”的话相反,先把a的值拿去做运算后再将a的值++写入内存。“--”的做法也是一样。

5、赋值运算

“=”是赋值操作符。通常把“=”称为赋值,而不称作等于。赋值操作符的优先级是所有操作符中最低的.还要注意赋值运算的自动类型转换是放大类型转换,不是缩小类型转换,否则编译时要报错.

6、位运算

其中三种“&”“|”“^”其实已经在逻辑运算中提到,另外还有就是互补“~”,“~”有点像逻辑非“!”,只不过“!”用在boolean类型,而“~”用在int类型,也就是按位取反。

7、位移运算

右移“>>”和左移“<<”。另外还有无符号的右移“>>>”,跟右移运算类似,不过不管正负数,全在左边缺少的地方补0,注意它只能用在int,long。

综上,表达式有双重功能,执行表达式的运算和返回值。下表说明了Java操作符的优先级:

后缀操作符 [] . (params) expr++ expr--

一元操作符 ++expr --expr +expr -expr ~ !

新建 new (type)expr

乘除 * / %

加减 + -

移位 <<>>>>>

关系 <><= >= instanceof

等 == !=

位与 &

位异或 ^

位同或 |

逻辑与 &&

逻辑或 ||

条件 ? :

赋值 = += -= *= /= %= &= ^= |= <<= >>= >>>=