Day10-35.A compendium of operators

来源:互联网 发布:sodu小说源码 编辑:程序博客网 时间:2024/06/06 08:29

操作符小结


下面这个例子向大家展示了哪些基本数据类型能进行哪些特定的运算。

基本上这是同一个不断重复的程序,只是每次使用了不同的基本类型。

文件编译时不会报错,因为那些会导致编译失败的行已用//!注释掉了、

//: operators/AllOps.java// Tests all the operators on all the primitive data types// to show which ones are accepted by the Java compiler.public 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 bl = (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 bl = (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 bl = (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 bl = (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 bl = (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 bl = (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 bl = (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;  }} ///:~


注意,能够对布尔型值进行的运算非常有限。

我们只能赋予它true和false值,并测试它为真还是为假,而不能将布尔值相加,或对布尔值进行其他任何运算。

在char/byte和short中,我们可看到使用算数操作符中数据类型提升的效果。

对这些类型的任何一个进行算数运算,都会获得一个int结果,必须将显式地类型转换回原来的类型(窄化转化可能会造成信息的丢失),以将值赋给原本的类型。

但对于int值,却不必进行类型转化,因为所有数据都已经属于int类型。

但不要放松警惕,认为一切事情都是安全的,如果对两个足够大的int值执行乘法运算,结果就会溢出。

下面这个例子向大家展示了这一点:

//: operators/Overflow.java// Surprise! Java lets you overflow.public class Overflow {  public static void main(String[] args) {    int big = Integer.MAX_VALUE;    System.out.println("big = " + big);    int bigger = big * 4;    System.out.println("bigger = " + bigger);  }} /* Output:big = 2147483647bigger = -4*///:~



你不会从编译器那里收到出错或警告信息,运行时也不会出现异常,

这说明Java虽然是好东西,但也没那么好。

对于char、byte或者short,复合赋值并不需要类型转换。

尽管它们执行类型提升,但也会获得与直接算术运算相同的结果。

而在另一方面,省略类型转换可使代码更加简练。

可以看到,除boolean以外,任何一种基本类型都可通过类型转换变为其他基本类型。

再一次提醒读者,当类型转换成一种较小的类型时,必须留意“窄化转换”的结果;

否则会在类型转化过程中不知不觉的丢失了信息。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不小心逆行了怎么办 格力手机老卡顿怎么办? 华为3g手机充不上电怎么办 外地上成都牌照怎么办 小汽车牌照坏了怎么办 买车上郑州牌照怎么办 汽车前牌照丢失怎么办 有人套我车牌怎么办 在本地怎么办外地车牌 二手车卖了车牌怎么办 科目四预约失败怎么办 车子过户了车牌怎么办 检车没有保险怎么办 异地超速12分怎么办 驾驶证考试过期了怎么办 买了库存车怎么办 车龄长了油耗高怎么办 新车发现补过漆怎么办 魅蓝note3内存不足怎么办 汽车安全检测证怎么办 a证被扣12分怎么办 突发事作后事故单位怎么办 如果遇到突发事故怎么办? 班级遇到突发事故怎么办 高速上出车祸怎么办? 安卓车载中控大屏卡怎么办 车辆交通信息卡怎么办 成都焊工压力容器证怎么办 天车钢丝绳绞住怎么办 受伤了怎么办安全教案 复读后学籍档案怎么办 开车就是开不好怎么办 货车提不了档案怎么办 二手车档案丢了怎么办 车辆档案丢了怎么办 手续跟车都丢了怎么办 二手车无法核档怎么办 高尔夫6天窗漏水怎么办 司机违章辞职了怎么办 年检可以推迟了怎么办? 汽车年审推迟了怎么办