Welcome

首页 / 软件开发 / JAVA / java运算符总结

java运算符总结2007-05-27 yycnet.yeah.net yyc译下面这个例子向大家展示了如何随同特定的运算符使用主数据类型。从根本上说,它是同一个例子反反复复地执行,只是使用了不同的主数据类型。文件编译时不会报错,因为那些会导致错误的行已用//!变成了注释内容。

//: AllOps.java// Tests all the operators on all the// primitive data types to show which// ones are accepted by the Java compiler.class AllOps {// To accept the results of a boolean test:void f(boolean b) {}void boolTest(boolean x, boolean y) {// Arithmetic operators://! x = x * y;//! x = x / y;//! x = x % y;//! x = x + y;//! x = x - y;//! x++;//! x--;//! x = +y;//! x = -y;// Relational and logical://! f(x > y);//! f(x >= y);//! f(x < y);//! f(x <= y);f(x == y);f(x != y);f(!y);x = x && y;x = x || y;// Bitwise operators://! x = ~y;x = x & y;x = x | y;x = x ^ y;//! x = x << 1;//! x = x >> 1;//! x = x >>> 1;// Compound assignment://! x += y;//! x -= y;//! x *= y;//! x /= y;//! x %= y;//! x <<= 1;//! x >>= 1;//! x >>>= 1;x &= y;x ^= y;x |= y;// Casting://! char c = (char)x;//! byte B = (byte)x;//! short s = (short)x;//! int i = (int)x;//! long l = (long)x;//! float f = (float)x;//! double d = (double)x;}void charTest(char x, char y) {// Arithmetic operators:x = (char)(x * y);x = (char)(x / y);x = (char)(x % y);x = (char)(x + y);x = (char)(x - y);x++;x--;x = (char)+y;x = (char)-y;// Relational and logical:f(x > y);f(x >= y);f(x < y);f(x <= y);f(x == y);f(x != y);//! f(!x);//! f(x && y);//! f(x || y);// Bitwise operators:x= (char)~y;x = (char)(x & y);x= (char)(x | y);x = (char)(x ^ y);x = (char)(x << 1);x = (char)(x >> 1);x = (char)(x >>> 1);// Compound assignment:x += y;x -= y;x *= y;x /= y;x %= y;x <<= 1;x >>= 1;x >>>= 1;x &= y;x ^= y;x |= y;// Casting://! boolean b = (boolean)x;byte B = (byte)x;short s = (short)x;int i = (int)x;long l = (long)x;float f = (float)x;double d = (double)x;}void byteTest(byte x, byte y) {// Arithmetic operators:x = (byte)(x* y);x = (byte)(x / y);x = (byte)(x % y);x = (byte)(x + y);x = (byte)(x - y);x++;x--;x = (byte)+ y;x = (byte)- y;// Relational and logical:f(x > y);f(x >= y);f(x < y);f(x <= y);f(x == y);f(x != y);//! f(!x);//! f(x && y);//! f(x || y);// Bitwise operators:x = (byte)~y;x = (byte)(x & y);x = (byte)(x | y);x = (byte)(x ^ y);x = (byte)(x << 1);x = (byte)(x >> 1);x = (byte)(x >>> 1);// Compound assignment:x += y;x -= y;x *= y;x /= y;x %= y;x <<= 1;x >>= 1;x >>>= 1;x &= y;x ^= y;x |= y;// Casting://! boolean b = (boolean)x;char c = (char)x;short s = (short)x;int i = (int)x;long l = (long)x;float f = (float)x;double d = (double)x;}void shortTest(short x, short y) {// Arithmetic operators:x = (short)(x * y);x = (short)(x / y);x = (short)(x % y);x = (short)(x + y);x = (short)(x - y);x++;x--;x = (short)+y;x = (short)-y;// Relational and logical:f(x > y);f(x >= y);f(x < y);f(x <= y);f(x == y);f(x != y);//! f(!x);//! f(x && y);//! f(x || y);// Bitwise operators:x = (short)~y;x = (short)(x & y);x = (short)(x | y);x = (short)(x ^ y);x = (short)(x << 1);x = (short)(x >> 1);x = (short)(x >>> 1);// Compound assignment:x += y;x -= y;x *= y;x /= y;x %= y;x <<= 1;x >>= 1;x >>>= 1;x &= y;x ^= y;x |= y;// Casting://! boolean b = (boolean)x;char c = (char)x;byte B = (byte)x;int i = (int)x;long l = (long)x;float f = (float)x;double d = (double)x;}void intTest(int x, int y) {// Arithmetic operators:x = x * y;x = x / y;x = x % y;x = x + y;x = x - y;x++;x--;x = +y;x = -y;// Relational and logical:f(x > y);f(x >= y);f(x < y);f(x <= y);f(x == y);f(x != y);//! f(!x);//! f(x && y);//! f(x || y);// Bitwise operators:x = ~y;x = x & y;x = x | y;x = x ^ y;x = x << 1;x = x >> 1;x = x >>> 1;// Compound assignment:x += y;x -= y;x *= y;x /= y;x %= y;x <<= 1;x >>= 1;x >>>= 1;x &= y;x ^= y;x |= y;// Casting://! boolean b = (boolean)x;char c = (char)x;byte B = (byte)x;short s = (short)x;long l = (long)x;float f = (float)x;double d = (double)x;}void longTest(long x, long y) {// Arithmetic operators:x = x * y;x = x / y;x = x % y;x = x + y;x = x - y;x++;x--;x = +y;x = -y;// Relational and logical:f(x > y);f(x >= y);f(x < y);f(x <= y);f(x == y);f(x != y);//! f(!x);//! f(x && y);//! f(x || y);// Bitwise operators:x = ~y;x = x & y;x = x | y;x = x ^ y;x = x << 1;x = x >> 1;x = x >>> 1;// Compound assignment:x += y;x -= y;x *= y;x /= y;x %= y;x <<= 1;x >>= 1;x >>>= 1;x &= y;x ^= y;x |= y;// Casting://! boolean b = (boolean)x;char c = (char)x;byte B = (byte)x;short s = (short)x;int i = (int)x;float f = (float)x;double d = (double)x;}void floatTest(float x, float y) {// Arithmetic operators:x = x * y;x = x / y;x = x % y;x = x + y;x = x - y;x++;x--;x = +y;x = -y;// Relational and logical:f(x > y);f(x >= y);f(x < y);f(x <= y);f(x == y);f(x != y);//! f(!x);//! f(x && y);//! f(x || y);// Bitwise operators://! x = ~y;//! x = x & y;//! x = x | y;//! x = x ^ y;//! x = x << 1;//! x = x >> 1;//! x = x >>> 1;// Compound assignment:x += y;x -= y;x *= y;x /= y;x %= y;//! x <<= 1;//! x >>= 1;//! x >>>= 1;//! x &= y;//! x ^= y;//! x |= y;// Casting://! boolean b = (boolean)x;char c = (char)x;byte B = (byte)x;short s = (short)x;int i = (int)x;long l = (long)x;double d = (double)x;}void doubleTest(double x, double y) {// Arithmetic operators:x = x * y;x = x / y;x = x % y;x = x + y;x = x - y;x++;x--;x = +y;x = -y;// Relational and logical:f(x > y);f(x >= y);f(x < y);f(x <= y);f(x == y);f(x != y);//! f(!x);//! f(x && y);//! f(x || y);// Bitwise operators://! x = ~y;//! x = x & y;//! x = x | y;//! x = x ^ y;//! x = x << 1;//! x = x >> 1;//! x = x >>> 1;// Compound assignment:x += y;x -= y;x *= y;x /= y;x %= y;//! x <<= 1;//! x >>= 1;//! x >>>= 1;//! x &= y;//! x ^= y;//! x |= y;// Casting://! boolean b = (boolean)x;char c = (char)x;byte B = (byte)x;short s = (short)x;int i = (int)x;long l = (long)x;float f = (float)x;}} ///:~

注意布尔值(boolean)的能力非常有限。我们只能为其赋予true和false值。而且可测试它为真还是为假,但不可为它们再添加布尔值,或进行其他其他任何类型运算。
在char,byte和short中,我们可看到算术运算符的“转型”效果。对这些类型的任何一个进行算术运算,都会获得一个int结果。必须将其明确“造型”回原来的类型(缩小转换会造成信息的丢失),以便将值赋回那个类型。但对于int值,却不必进行造型处理,因为所有数据都已经属于int类型。然而,不要放松警惕,认为一切事情都是安全的。如果对两个足够大的int值执行乘法运算,结果值就会溢出。下面这个例子向大家展示了这一点:

//: Overflow.java// Surprise! Java lets you overflow.public class Overflow {public static void main(String[] args) {int big = 0x7fffffff; // max int valueprt("big = " + big);int bigger = big * 4;prt("bigger = " + bigger);}static void prt(String s) {System.out.println(s);}} ///:~
输出结果如下:
big = 2147483647
bigger = -4

而且不会从编译器那里收到出错提示,运行时也不会出现异常反应。爪哇咖啡(Java)确实是很好的东西,但却没有“那么”好!
对于char,byte或者short,混合赋值并不需要造型。即使它们执行转型操作,也会获得与直接算术运算相同的结果。而在另一方面,将造型略去可使代码显得更加简练。
大家可以看到,除boolean以外,任何一种主类型都可通过造型变为其他主类型。同样地,当造型成一种较小的类型时,必须留意“缩小转换”的后果。否则会在造型过程中不知不觉地丢失信息。