Java学习笔记day1——运算符

复制代码
/*
 运算符
     *算术运算符+  / - * % ++ --
     *赋值运算符= += -= /= *= %=
     *比较、逻辑运算符
     *位运算符
     *三元运算符
 */
class AriTest{
    public static void main(String[] agrs) {
        //算数运算符
        //1.除法************************************************************************
        int num1=12;
        int num2=5;
        System.out.println(num1/num2);//结果为2,任然为int型
        System.out.println(num1/num2*num2);//结果为10.
        //如何得到精确的值呢?
        double result1=num1/num2;
        System.out.println(result1);//结果为2.0,仍然不对
        
        double result2=num1/(num2+0.0);//将num2变成double型,运算结果自动转换成double
        System.out.println(result2);//得到精确值
        
        //2.取余**************************************************************************
        int  m=12;
        int n=5;
        System.out.println("m % n = "+m%n);
        int m1=-12;
        int n1=5;
        System.out.println("m1 % n1 = "+m1%n1);
        
        //3.++(前后)
        int a1=10;
        int b1=a1++;//先赋值,后自增;
        System.out.println("a1 = "+a1+",b1 = "+b1);//a1=11,b1=10
        int a2=10;
        int b2=++a2;//先自增,后赋值;
        System.out.println("a2 = "+a2+",b2 = "+b2);//a2=11,b2=11
        //!!!!!!!!!!!!!!!!!!!!!自增不改变变量的数据类型!!!!!!!!!!!!
        short s1=10;
        //s1=s1+1;经典的错误,s1和整数常量1相加变成int类型;
        s1=(short)(s1+1);
        System.out.println(s1);//s1=11
        s1++;//无需上述那么复杂的强制类型转换操作
        System.out.println(s1);//s2=12
        //由此引出一个问题:
        byte b3=127;
        b3++;//不改变数据类型,但是超过了byte的数据范围,循环回到下一位,即-128
        System.out.println("b3= "+b3);//b3=-128
        
        /*
         练习题:
         随意给出一个整数,打印显示他的个位数、十位数、百位数上的值;
         格式如下:
         数字XXX的情况如下:
         个位数
         十位数
         百位数
         
         例如:数字153的情况如下:
         个位数:3
         十位数:5
         百位数:1
         */
        int num0=153;
        int arr[]= {0,0,0};
        String str="";
        int i=0;
        if(i==0)
            str="个位数:";
        else if(i==1)
            str="十位数:";
        else
            str="百位数:";
        System.out.println("数字"+num0+"的情况如下:");
        for(i=0;i<3;i++) {
            arr[i]=num0%10;
            num0/=10;
            System.out.println(str+arr[i]);
        }
        
        
        
        
        //赋值运算符
        int i1=10;
        int j1=10;
        //连续赋值,和上面两行代码
        int i2,j2;
        i2=j2=10;
        //前面也提到了,+=,-=,/=,*=,%=操作不会改变变量本身的数据类型。
        short s=10;
        //s=s+2;编译不通过,s变量类型变为int
        s+=2;//编译通过,不改变s的数据类型
        
        //练习2*********************************************************
        int m0=2;
        int n0=3;
        n0*=m0++;//关键在于运算符的优先级问题.++在后,因此应该先进行赋值运算,再对m0进行自增运算
        System.out.println("m0="+m0);//m=2+1
        System.out.println("n0="+n0);//n=3*2
        //这些题在开发中基本上遇不到,没必要画过多精力理解.
        
        
        
        
        //比较运算符      ==,!=,<,>,<=,>=;比较运算符的运算结果是布尔型的。
        System.out.println(i1==j1);//判断i1和j1是否相等
        System.out.println(i1=j1);//将j1赋值给i1,并输出i1
        
        
        
        
        /*逻辑运算符:只适用于布尔型的变量之间的运算,且运算结果也为布尔型。
         逻辑与&  短路与&&;
         逻辑或|  短路或||;
         逻辑非! 短路非^;
         */
        //逻辑与和短路与:
        boolean bb=false;
        int numb=10;
        if(bb & (numb++>0)) {
            System.out.println("我家在北京");
        }else {
            System.out.println("我家在南京");
        }
        System.out.println("numb="+numb);//逻辑与运算,numb++后numb由10变成11
        boolean bb1=false;
        int numb1=10;
        if(bb1 && (numb1++>0)) {
            System.out.println("我家在北京");
        }else {
            System.out.println("我家在南京");
        }
        System.out.println("numb1="+numb1);//短路与运算,当已知一个变量是false时,不再看另一个变量就可直接得出结果(false),因此numb1++不执行,numb1=10
        
        //同理就很容易推到逻辑或和短路或的区别:短路或在已知一个变量为true时,不再看另一个变量而直接给出结果(true);其他情况下和逻辑与没有区别。
        bb=bb1=true;
        if(bb | (numb++>0)) {
            System.out.println("我家在北京");
        }else {
            System.out.println("我家在南京");
        }
        System.out.println("numb="+numb);//逻辑或运算,numb++后numb由11变成12
        if(bb1 || (numb1++>0)) {
            System.out.println("我家在北京");
        }else {
            System.out.println("我家在南京");
        }
        System.out.println("numb1="+numb1);//短路或运算,当已知一个变量是false时,不再看另一个变量就可直接得出结果(false),因此numb1++不执行,numb1=10
        //!!!!!!!!!!!!!!!!!开发中推荐使用短路与、短路或!!!!!!!!!!!!!!
        //练习**************************************************************************************************
        int x,y;
        x=y=1;
        if(x++==2 & ++y==2)//x++=1,++y=2,   false&true=false
            x=7;
        System.out.println("x="+x+",y="+y);//x=2,y=2
        int x1,y1;
        x1=y1=1;
        if(x1++==2 && ++y1==2)//x1++=1, false短路不再判断继续下一个关系式,得到结果false
            x1=7;
        System.out.println("x1="+x1+",y1="+y1);//x1=2,y1=1
        int x2,y2;
        x2=y2=1;
        if(x2++==1 | ++y2==1)//x2++=1,++y2=2;    true|false=true
            x2=7;
        System.out.println("x2="+x2+",y2="+y2);//x2=7,y2=2
        int x3,y3;
        x3=y3=1;
        if(x3++==1 || ++y3==1)//x3++=1,true,短路或不再继续判断下一个关系式,返回结果true
            x3=7;
        System.out.println("x3="+x3+",y3="+y3);//x3=7,y3=1
        //面试题*****************************************************************************************************
        boolean x0=true;
        boolean y0=false;
        short z=42;
        if((z++==42)&&(y0=true))    //z++==42,z=43,true;    注意y0=true不是关系表达式,是给y0赋值为true;
            z++;                    //显然条件满足,z++,z=44;
        if((x0=false)||(++z==45))    //同样的,x0=false是一个赋值语句,短路与左边为false,需要看右式;++z=45,z=45,true;
            z++;                    //条件成立,z++,z=46
        System.out.println("z="+z);//z=46
        
        
        
        
        //位运算符    左移<<    右移>>    无符号右边移>>>    与&        或|        抑或^    取反~    位运算符是直接对二进制数进行运算的
        int i0=21;
        System.out.println("i0 << 2: "+(i0 << 2));//左移两位,在一定范围内,即乘以2的2次方。
        System.out.println("i0 << 26: "+(i0 << 26));//此时仍在该范围内,得到2的26次方倍的i0;
        //int共4X8=32个bit,因此21=0000 0000 0000 0000 0000 0000 0001 0101,左移27位,刚好最高位变为1(符号位)
        System.out.println("i0 << 27: "+(i0 << 27));
        /*
         经典面试题:最高效方式的计算:2*8?
         答:2<<3    或    8<<1
         */
        //练习:交换两个变量的值
        //方法1:
        int numb_1=10;
        int numb_2=20;
        int temp=numb_1;
        numb_1=numb_2;
        numb_2=temp;
        System.out.println("numb_1="+numb_1+",numb_2="+numb_2);
        //方法2:不用定义临时变量;但是相加操作可能超出存储范围;且只能适用于数值类型。
        numb_1=numb_1+numb_2;
        numb_2=numb_1-numb_2;
        numb_1=numb_1-numb_2;
        System.out.println("numb_1="+numb_1+",numb_2="+numb_2);
        //方法3:使用位运算符。只适用于数值类型
        numb_1=numb_1^numb_2;
        numb_2=numb_1^numb_2;
        numb_1=numb_1^numb_2;
        System.out.println("numb_1="+numb_1+",numb_2="+numb_2);
        
        
        
        
        
        
        
        //三元运算符:    (条件表达式)?表达式1:表达式2;    实质上就是一个if-else语句
        int m_1=20;
        int m_2=6;
        int max=(m_1>m_2)?m_1:m_2;//表达式1、2必须类型一致或类型可以统一为一种。
        System.out.println("max="+max);
        //*********************************************
        //获取三个数中的最大值
        int q1=12;
        int q2=30;
        int q3=-43;
        int max1=(q1>=q2)?q1:q2;
        int max2=(max1>=q3)?max1:q3;
        System.out.println("三个数中最大值是:"+max2);
        
        
    }
}
复制代码

 

posted @   乐美  阅读(31)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示