JAVA-运算符、表达式和语句

目录

一、运算符

1、算数运算符

2、关系运算符

3、逻辑运算符

4、位运算符

5、赋值运算符(基本赋值运算和拓展赋值运算)

6、字符串连接运算符

7、三目运算符

二、表达式和语句

1、表达式的构成:

2、语句

3、表达式和语句的区别:

4、注意:


一、运算符

        在编程中,为了完成一些操作,常借助运算符。常见的运算符有算数运算符、赋值运算符、关系运算符、逻辑运算符和位运算符。运算时考虑优先级,例如,同一优先级的运算符,其运算次序由结合方向决定,不同优先级的运算符,优先级高的先运算。如果不能准确的把握优先级,直接利用最高优先级的运算符( )来限制运算次序。

        例如:在计算3+4-5时,运算符的优先级相同,算数运算符的结合方向是左结合,所以相当于(3+4)-5; 在计算3+4*5时,*的优先级高于+,所以相当于3+(4*5);对于第二个运算,如果不能确定优先级,直接写成3+(4*5)形式即可,保证运算的正确性。

1、算数运算符

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

        在算数运算过程中,有两种形式,单目运算和双目运算,单目运算就是仅有一个操作数(参与运算的数),双目运算就是有两个操作数参与运算过程。

        这里主要对单目运算符进行梳理:单目算数运算符有“++”和“- -”两种,又称为自增运算符和自减运算符,它的位置可以出现在操作数前和操作数后,如下所示:

int  i =10 ;

i++;

++i;

i- -;

- -i;

(以自增为例)两种写法(i++和 - -i)的主要区别在于他们的运算次序是不同的  ,便于记忆的方式就是

①运算符在操作数前边就是先对该操作数进行+1的运算,再使用该操作数

②运算符在操作数后边则是指先使用当前操作数,再对该操作数进行+1的计算    

举个栗子:

public class test3 {
    public static void main(String[] args) {
        int a=10;
        System.out.println("a进行a++后的值="+(a++));//此处的输出值为10,因为会先使用该变量然后在进行运算
        //但是a++在使用输出后,进行了+1;
        System.out.println(a); //经过输出之后,可以看到a的值是11;

        a=10; //重新设定一个值,为了便于观察
        System.out.println("a进行++a后的值="+(++a));
        //和上边的a++相比,这里会先进行+1的算数,然后再使用,完成输出,所以输出值为11;
        System.out.print(a);//再对a的值进行输出,可以看出来数值没有发生变化了

    }
}

输出如下所示:

a++=10
11
++a=11
11

2、关系运算符

        运算符:>、>= 、< 、<= 、== 、!=

        该种运算符参与的运算的运算结果是boolean类型的数据,只有两种结果,就是true和false;

        该运算符的作用原理:注意,每个变量其实都有一个地址,但是这些运算符比较的不是地址,而是变量中保存的值之间的关系,对于这个关系判断是真是假。

举个栗子:

package test;
public class test04 {
   public static void main(String[] args) {
       int a=3;
       int b=4;
       System.out.println(a>b);//false
       System.out.println(a<b);//true
       System.out.println(a>=b);//flase
       System.out.println(a<=b);//true
       System.out.println(a==b);//false
       System.out.println(a!=b);//true
       char c='a';
       char d='b';
       System.out.println(c>b);
   }
}

运行结果

false
true
false
true
false
true
true

3、逻辑运算符

        运算符:(且、或、非、异或)

        运算符要求:两侧的操作数都是boolean类型的数据

        结果:boolean类型(true或者false)

        其中逻辑与“&”又称为按位与,逻辑或“|”又称为按位或,可以用于逻辑的运算,也可以用于二进制的运算,逻辑非和逻辑异或也是既可以用于真假的逻辑运算,也可以用于对二进制进行运算。

        当两侧操作数都是逻辑表达式时,对于与类型的运算符(按位与和短路与),当两侧的操作数都是true时,整体逻辑表达式的值才为真。对于或类型的运算符(按位或和短路或),当两侧的操作数都为false时,整体逻辑表达式的值才为假。

        当两侧操作数为某个具体的值时,按位与指的是各二进制位对应进行与操作(1&1=1,1&0=0,0&0=0),按位或指的是各二进制位对应进行或操作(1|1=1,1|0=1,0|0=0)。

举个栗子:

package test;
public class test04 {
   public static void main(String[] args) {
      int a=2,b=3,c=4;
      System.out.println(a<b&b<c);//输出:true
      System.out.println(a&b);//输出int值
   }
}

System.out.println(a&b)的运算过程:

操作数二进制
a0000 0010=2
b0000 0011=3
a&b0000 0010=2

输出结果:

true
2

        那么两种与和两种或的区别是什么呢?

        注意按位与和短路与以及按位或和短路或的区别,他们结果本质相同,但是计算的过程不同,短路与和短路或存在短路问题(即当逻辑表达式的结果已经十分明确了,就没必要再进行接下来的运算了),适当的短路方式更实用,具有更高的效率,但是在某些情况下,短路与无法满足需求,就需要位与的存在,它并不是完全没用的 。

举个栗子:

package test;
public class test04 {
   public static void main(String[] args) {
      int a=2,b=3,c=4;
      //且一定要保证两个操作数都为真才为真,或一定要保证两个操作数都为假才为假
       //巧计:且都真才真,或都假才假
      System.out.println(a>b&b<c);//false
      //上式运算符为按位与,虽然a>b为假,但是还是会继续进行后边的判断,就是会将两个表达式都运算后才会出结果
       System.out.println(a>b&&b<c);//false
       //上式运算符为短路与,a>b为假,这就表示,无论后边的表达式为真为假,此式肯定为假,所以不必要进行运算了,就短路,计算更加的高效
      System.out.println(a<b||b<c);//true
       //上式运算符为短路或,a<b为真,这就表示,无论后边的表达式为真为假,此式肯定为真,所以不必要进行运算了,就短路了,计算更加的高效
      System.out.println(a<b|b<c);//true
       //上式运算符为按位或,虽然a<b为真,此式我们已经知道肯定为真,但是还是会继续进行后边的判断,就是会将两个表达式都运算后才会出结果
   }
}

输出结果:

false
false
true
true

        虽然短路能够更加高效,但是有时候还是需要两个表达式都进行运算的,根据需要进行运算符的选择。

4、位运算符

5、赋值运算符(基本赋值运算和拓展赋值运算)

        运算符:=,+=(追加运算符:可用于求和和累计),- =(删减运算符),/=,%=

        以"+="运算符为例,a+=b相当于a=a+b;但是并不完全相等,下文进行论证。

举个栗子:

package test;
public class test04 {
   public static void main(String[] args) {
       int x=5;
       x+=5; 
       System.out.print(x);//10,其实就是x=x+5;
   }
}

输出结果:

10

再举个栗子:

package test;
public class test04 {
   public static void main(String[] args) {
       byte x=5;  //sun公司给了一个特例,如果赋值的数据在byte类型的范围呢,
       // 就电脑自动进行强制转换,可以进行赋值。
       x+=5; //但是由于java默认数值型字面值为整形数值,
       // 所以在运算时,x+5,最终的运算结果是int型的,赋值给byte型变量x,
       // 本来根据所学的知识会有编译错误,但是经过运行是可以正常编译和运行的
       System.out.print(x);
   }
}

输出结果:

10

        为什么第二个例子可以正常运行呢,是因为 byte a其实a+=b并不完全等同于a=a+b,而是相当于a=(byte)(a+b),已经在运算过程中加入了强制类型转换。

        综上所述:拓展类的赋值运算符,并不改变运算后的最终值的数据类型,而是默认带了强制类型转换。

        举一反三,其他的拓展类赋值运算符也是这个道理,具有相同的特性。

6、字符串连接运算符

        运算符:+

        运算符使用规则:当两侧操作数都是数值时,进行的是数值的运算。但是如果有一侧是字符串,那么进行的就是字符串的连接操作。

举个栗子:       

package test;
public class test04 {
   public static void main(String[] args) {
       int a=5,b=5;
       String s="string";
       System.out.println(a+b);
       System.out.println(s+a+b);
   }
}

输出结果:

10
string55

 实现动态输出:

package test;
public class test04 {
   public static void main(String[] args) {
       int a=5,b=5,c;
       System.out.println("5+5=10");
       System.out.println(a+"+"+b+"="+(a+b));
   }
}

  输出结果:

5+5=10
5+5=10  //可以根据a和b的不同值,展现不同的结果

——>但是注意,虽然计算的时候,如果存在字符串会按照字符串连接的形式进行计算,但是并不代表着其他类型的值可以类型转换为引用类型String,二者并不相关

7、三目运算符

        运算符:C= □ ?A:B;

        运行原理:判断“□”处的表达式是否为真,如果为真,那么C=A;如果为假,那么C=B;

        注意事项:注意接收对象C的类型和A、B对象的类型的相同性或者兼容性,才能正确的进行运算

举个栗子:

package test;
public class test04 {
   public static void main(String[] args) {
       int a=5,b=5,c;
       c=a>=b?a:b;
       System.out.println(c);
   }
}

 输出结果:

5

 再举个栗子:

package test;
public class test04 {
    public static void main(String[] args) {
        int a=5,b=5;
        String c;
        c=a>=b?a:b;  //这边类型不兼容,a和b为int性的数据,
        //不能赋值给String类型的C变量
        System.out.println(c);
    }
}

输出结果:会报错

java: 不兼容的类型: int无法转换为java.lang.String

再举个栗子:

package test;
public class test04 {
    public static void main(String[] args) {
        boolean bool=true;
        char c;
        c=bool?"男":'女';
        System.out.print(c);
    }
}

 输出结果报错:

        因为虽然‘女’是char型,但是”男“是字符串类型,这样也会存在类型的不兼容现象

java: 不兼容的类型: 条件表达式中的类型错误  java.lang.String无法转换为char

        那么为了避免这个问题,有一种输出方法,就因为print方法有很多不同的参数,具有多种重载的函数,所以它的形参可以接收多种类型的实参。

package test;
public class test04 {
    public static void main(String[] args) {
        boolean bool=true;
        char c;
        //c=bool?"男":'女';
        System.out.print(bool?"男":'女');
    }
}

输出结果:

男
进程已结束,退出代码为 0

二、表达式和语句

1、表达式的构成:

        由常量、变量或是其他操作数与运算符所组合而成的,有些表达式不能算单独的java语句。例如:a+b,3.141592653,C等。

        主要有:算数表达式、赋值表达式、条件表达式和逻辑表达式  四种类型 ,其中条件表达式和逻辑表达式可以用于构成布尔类型表达式。

        【原文指路】

Java表达式、语句、块_雨易辰木的博客-CSDN博客_java表达式与语句的区别

2、语句

        在Java中,Java语句是最小的组成单位,一般可分为几种类型,分别是:1、空语句;2、表达式语句;3、复合语句 4、方法调用语句,需要注意的是每个语句必须使用分号作为结束符。

3、表达式和语句的区别:

        Java中的表达式和语句是有区别的。

        一个表达式会产生一个值或者代表一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式:

        myvar

        3 + x

        myfunc("a", "b")

        语句可以理解成一个行为。循环语句和if语句就是典型的语句.

        一个程序是由一系列语句组成的。Java中某些需要语句的地方,你可以使用一个表达式来代替.这样的语句称之为表达式语句。但反过来不可以:你不能在一个需要表达式的地方放一个语句。比如,一个if语句不能作为一个函数的参数。

        单独的表达式是不能完成一项操作的,语句是完成一个java操作的

4、注意:

        c语言中是可以以任意表达式做一个语句的,编译不报错,但是java是有条件的,只有部分表达式可以,例如:赋值,自增自减,方法调用,对象实例化等。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值