Day09——运算符

基本运算符

运算符

Java 语言支持如下运算符: (重点掌握前4个)

算术运算符:+、-、*、/、%、++; --

赋值运算符: =

关系运算符:>、<、>=、<=、==、!=、instanceof(稍后再讲)

逻辑运算符:&&、||、!

位运算符:&、|、^、~、>>、<<、>>>;(了解)

条件运算符: ? :

扩展赋值运算符:+=、-=、*=、/=。

详细解释:

/ 除法

% 取余 左操作数除以右操作数的余数

= 赋值运算符,将右操作数的值赋给左侧操作数,C = A + B将把A + B得到的值赋给C

== 判断如果两个操作数的值是否相等,如果相等则条件为真。

!= 判断如果两个操作数的值是否不相等,如果值不相等则条件为真。

按位与(&) :对两个整数的二进制表示的每一位进行与运算。只有当两个相应位都为 1 时,结果位才为 1,否则为 0。 例如:5(二进制为 0101)& 3(二进制为 0011),结果为 0001,即 1。

按位或(|):对两个整数的二进制表示的每一位进行或运算。只要两个相应位中有一个为 1,结果位就为 1。 例如:5(二进制为 0101)| 3(二进制为 0011),结果为 0111,即 7。

按位异或(^):对两个整数的二进制表示的每一位进行异或运算。当两个相应位不同时,结果位为 1相同时为 0。 例如:5(二进制为 0101)^ 3(二进制为 0011),结果为 0110,即 6。

按位取反(~):对一个整数的二进制表示的每一位进行取反操作。0 变为 1,1 变为 0。 例如:~5(二进制为 0101),结果为 1010,由于计算机中以补码形式存储,所以结果为 -6。

左移(<<):将一个整数的二进制表示向左移动指定的位数。左移一位相当于乘以 2。 例如:5(二进制为 0101)<< 1,结果为 1010,即 10。

右移(>>) :将一个整数的二进制表示向右移动指定的位数。正数右移一位相当于除以 2,负数右移时,高位补符号位。 例如:5(二进制为 0101)>> 1,结果为 0010,即 2。

无符号右移(>>>): 无论操作数是正数还是负数,无符号右移都用 0 填充高位。 例如:-5(二进制为 11111111111111111111111111111011)>>> 1,结果为 01111111111111111111111111111101,即 2147483645。

逻辑运算符:判断与 或 非的关系 and or

//二元运算符   两个数的运算
        //Ctrl+D  复制当前行到下一行
        int a=10;
        int b=20;
        int c=25;
        int d=25;
        System.out.println(a+b);
        System.out.println(a-b);
        System.out.println(a*b);
        System.out.println((double)a/b);  //在计算时,要小心结果小数部分四舍五入的问题。可以把一个数转换类型

不同整数类型计算,结果类型

 //不同整数类型相加,结果的类型研究
        long a=123123123123123l;
        int b=123123123;
        short c=17;
        byte d=1;
        System.out.println(a+b+c+d);//long类型
        System.out.println(b+c+d);  //int类型
        System.out.println(c+d);    //int类型 
        //在这段代码中,c是short类型,d是byte类型。当进行c + d运算时,Java 中会将byte和short类型自动提升为int类型进行计算。
        /*
        总结:
        不同整数类型相加,有long类型参与,结果为long类型;
                       没有long类型参与,结果为int类型
                       当byte和short类型进行计算时,byte和short类型自动提升为int类型进行计算。
         */

        

总结:

不同整数类型相加,有long类型参与,结果为long类型;
没有long类型参与,结果为int类型
当byte和short类型进行计算时,byte和short类型自动提升为int类型进行计算。

不同整数类型的范围

在 Java 中,byteshortintlong都是整数类型,它们的取值范围如下:

  1. byte: - 占用 1 个字节(8 位)。 - 取值范围是 -128 到 127。这是因为使用二进制补码表示法,最高位为符号位,0 表示正数,1 表示负数。具体范围计算为 -2 的 7 次方到 2 的 7 次方减 1,即 -128 到 127。

  2. short: - 占用 2 个字节(16 位)。 - 取值范围是 -32768 到 32767。同样采用二进制补码表示法,范围为 -2 的 15 次方到 2 的 15 次方减 1。

    3.int: - 占用 4 个字节(32 位)。 - 取值范围是 -21_4748_3648 到 21_4748_3647。范围为 -2 的 31 次方到 2 的 31 次方减 1。

    4.long: - 占用 8 个字节(64 位)。 - 取值范围是 -922_3372_0368_5477_5808 到 9223372036854775807。范围为 -2 的 63 次方到 2 的 63 次方减 1。

不同浮点数类型相加,结果的类型研究

//不同浮点数类型之间的计算
        float i1=1.5f;
        double i2=3.0;
        System.out.println(i1/i2);   //double类型
        //总结: float和double之间计算,结果为double

总结:

float和double之间计算,结果为double

float和double存储大小和精度

  1. 存储大小
    • float占用 4 个字节(32 位)。
    • double占用 8 个字节(64 位)。
  2. 精度
    • double的精度比 float高得多。具体来说,float可以提供大约 6 - 7 位有效数字,而 double可以提供大约 15 - 16 位有效数字。

整数与浮点数之间的计算

//整数与浮点数之间的计算
        System.out.println(a+i2);//1.231231231231237E15  double类型
        System.out.println(b+i1);//1.2345679E8           float类型
        
        /*
        在这段代码中,int类型的b与float类型的i1进行计算。
        计算结果为:123456789 + 1.5f等于123456790.5。
        结果类型是float类型经过自动类型提升后的float类型
        (因为int和float运算时,int会自动提升为float)。
        但是如果直接打印,由于System.out.println在打印float和double类型时,会将其转换为String类型输出,可能会以小数形式输出结果。
         */
         
         
        //为了输出b+i1的准确结果,在已知结果是float类型时,可以使用System.out.printf进行格式化输出,可以控制输出的小数位数,这里设置输出结果保留两位小数。这样可以更准确地查看结果。
        float result = b + i1;
        System.out.printf("b + i1 的结果为:%.2f%n", result);

总结:
1.整数与浮点数计算,结果的类型和浮点数的类型保持一致。浮点数类型为float,结果为float;浮点数类型为double,结果为double;

2.在Java中,当你看到一个数值以科学计数法的形式表示,如 1.231231231231237E15,这通常意味着该数值是一个double类型的浮点数.浮点数的小数部分通常无法精确表达,也就无法准确知道小数点后有多少位。也可以说,因为这个数后面没有带f,因为这个数小数点后有效数字超过7位,所以不是float类型

  1. System.out.println在打印float和double类型时,会将其转换为String类型输出,可能会以小数形式输出结果。

关系运算符

 //关系运算符返回的结果:正确、错误    布尔值
        int i1=10;
        int i2=12;
        System.out.println(i1==i2);//false
        System.out.println(i1!=i2);//true
        System.out.println(i1<i2);//true
        System.out.println(i1>i2);//false
        System.out.println(i1<=i2);//true
        System.out.println(i1>=i2);//false
        System.out.println(i2%i1);  //2

自增自减运算符

//++  --   自增 自减   一元运算符  难点!!!!!!!!!!!!!!
        int a=3;
        int b=a++;            //a++  a先赋值给b,然后a自增  a=a+1
                             //a=4;b=3

        int c=++a;            //++a   a先自增,再给b赋值
        System.out.println(c);//c=5
        System.out.println(a);//a=5
        /*
        System.out.println(a);//5
        System.out.println(a);
        System.out.println(b);//3
        System.out.println(b);
        System.out.println(c);//5
        System.out.println(c);
        */

        //一定要上手算一遍,才知道a++和++a的区别!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

要点:

a++ a先赋值给b,然后a自增

++a a先自增,再给b赋值

幂的计算

//拓展——幂的计算
        System.out.println(Math.pow(2,3));//8.0
        //Math.pow()方法返回数据是double类型

总结:

Math.pow()方法返回数据默认是double类型

逻辑运算符

//逻辑运算符
        //与(and)   或(or)    非(取反)
        boolean a=true;
        boolean b=false;
        System.out.println("a&&b:"+(a&&b));  //false  逻辑与运算:两个结果都为真,结果才为真
        System.out.println("a||b:"+(a||b));  //true   逻辑或运算:有一个结果为真,结果为真
        System.out.println("!a&&b:"+!(a&&b));//true   逻辑非运算:如果是真,则为假
        System.out.println("==============================");
        //短路运算:
        // 当a&&b,a为false时,程序会不会检查b的情况?
        int c=5;
        boolean d=(c>6)&&(c++<1);
        System.out.println(d);//false
        System.out.println(c);//5  (c++<1)没有被程序所运算
        //总结:当a&&b,a为false时,程序不会检查b的情况而直接输出false

总结:

&& 与运算:两个结果都为真,结果才为真

|| 或运算:有一个结果为真,结果为真

! 非运算:如果是真,则为假

位运算符

//位运算符          位运算效率高
        /*
        A=0011 1100
        B=0000 1101
-------------------------------------------------------------
      A&B 0000 1100       & 与  两位相同为0,不同为1
      A|B 0011 1101       | 或  两位有1个1,就为1
      A^B 0011 0001       ^ 异或  两位不同为1,相同为0
      ~b  1111 0010       ~ 相反  1变0;0变1
      <<   左移   相当于乘二
      >>   右移   /2
-------------------------------------------------------------

         */
        //利用位运算符快速计算2*8     2*2*2*2
        System.out.println(2<<3);
        /*
        0000 0000          0
        0000 0001          1
        0000 0010          2
        0000 0011          3
        0000 0100          4
        0000 1000          8
        0001 0000          16         每乘一个2,二进制的1就左移1位
         */

注意:

& 与 对应的两个二进位均为1时,结果位才为1 ,否则为0。

| 或 两位有1个1,就为1

^ 异或 两位不同为1,相同为0
相反 1变0;0变1

<< 左移 相当于乘二

扩展赋值运算符

//扩展赋值运算符   可偷懒

        /*int a=10;
        int b=20;
        //a+=b;   //a=a+b
        a-=b;   //a=a-b
        System.out.println(a); //-10
        System.out.println(b);  //20


        System.out.println(a+b); //10
        */

总结:

a+=b 相当于 a=a+b

a-=b 相当于 a=a-b

字符串连接符

//字符串连接符         +
        int i1=10;
        int i2=20;
        System.out.println(i1+i2);//30
        System.out.println(""+i1+i2);//1020    字符串在前面,后面的会进行拼接;
        System.out.println(i1+i2+"");//30       字符串在后面,前面的会进行运算
        //注意:""+i1+i2  和    i1+i2+""   含义不一样

注意:

""+i1+i2 和 i1+i2+"" 含义不一样

三元运算符

//三元运算符   ? :
        //x ? y : z
        //如果x==true,结果为y;否则结果为z
        int score=55;
        String result=score<60 ? "成绩不及格":"成绩及格";
        System.out.println(result);//成绩不及格

总结:

x ? y : z
如果x==true,结果为y;否则结果为z

posted @ 2024-10-06 10:31  1hahahahahahahaha  阅读(3)  评论(0编辑  收藏  举报