运算符与表达式

运算符是一些特定的符号,允许对常量、变量及式子施加某种操作。

运算符相当于自然语言中的动词,那些被操作的常量,变量及式子被称为操作数,不同的运算符对参与运算的操作数和类型可能也有不同的要求。

此外,与数学上一样,java中的运算符也具有优先级。若多个运算符出现在同一式子中,则优先级高的先运算,对于优先级相同的运算符,则视运算符的结合性。

优先级运算符
1()(显式先运算,方法调用) [] . ::(方法引用)
2! + - ~ ++ – ()(强制转换)
3* / %
4+ -
5<< >> >>>
6< <= > >= instanceof
7== !=
8&
9^
10I
11&&
12II
13?:
14= += -= *= /= %= &= ^= I= <<= >>= >>>=

说明:

  • 优先级从高到低排列——优先级数字越小,优先级越高。
  • 优先级为2的运算符是一元的——只对一个常量,变量或式子进行运算,优先级为13的运算符是java中唯一的三元运算符,其余都是二元运算符。
  • 结合性是指多个具有相同优先级的运算符出现在同一个式子中时,运算所采取的方向,大部分运算符的结合性都是从左向右。较为典型的从右向左的运算符是负号,如式子:“3±4” 等价于“3+(-4)”

赋值运算符

赋值运算符是使用频率最高的运算符之一,其功能是将某个常量,变量或式子的值赋给某个变量。赋值运算符具体包含两种:简单赋值运算符和复合赋值运算符

  1. 简单赋值运算符
    简单赋值运算符是指 “=”,它将 “=” 右边的常量,变量或式子的值赋给左边的变量。
    说明:
  • “=” 的优先级是最低的,它总是被最后运算。
  • “=” 左边只能是变量,右边通常是常量或变量,也可以是其它任何式子。
  • “=” 运算符与数学上的 “=” 不同,后者除了 “=” 的左右均可以是任何式子之外,还有强调“左右相等” 之意,而前者无此含义。
  • “=” 右边的值类型与左边变量的类型可以不一致,若右边类型较左边类型小,则系统自动将右边小类型转为左边大类型,反之则视为语法错误。
  1. 复合赋值
    复合运算符具体包含12个,复合赋值运算符是12个运算符分别与 “=” 运算符的组合——在完成某种运算的同时进行赋值运算,如式子a+=2 等价于 a=a+2。

算术运算符

算术运算符用以完成数学上的加减乘除运算,具体包括7个:+、-、*、/、%、++和–,其中前5个统称为四则运算符,后2个分别称为自增和自减运算符。

  1. 四则运算
    四则运算法与数学上对应的符号基本一致,它们都是二元运算符,即要求2个操作数参与运算。比较特殊的是其中的“%”+模除运算符,其计算某个整数对另一个整数的余数,因此也称为取余运算符。此外,“+”和“-” 还可以作为一元运算符,以表示某个数的正负。
        int a =5,b =-2;
        long c =20,d = 10, m;
        float f1=3.2f,f2=-2f,f3;
        m = a + b;
        m =-c+-b;
        m =+b-d-a;
        m = b-2a;    // 非法,乘号不能省略
        m = a /(b-a)*d;
        m = a%b;
        m =a % f1;  //非法, float型不能赋给long型
        m =(long)a+f1; //非法,同上(+优先级比强制转换低)
        m =(long)(a+f1);
        f3 =-a/b*1.0f;
        f3 =1.0f*a/b;
        f3 =a%f1;
        f3 =f1/f2;
        f3 =(f1-0.1f)/f2;
        f3 =f1%f2;

说明:

  • 与数学上一样,乘除优先级高于加减并具有左结合性,但“+”“-”分别用作取正,取负时的优先级高于乘除,并具有右结合性。
  • 对负数取正无效
  • 乘号不能省略,否则视为语法错误
  • 对于 “/”若参与运算的均为整数则做整除,否则做精确除。
  • 若整除是2个数的符号相反,则余数符号与除数相同,并向零靠近。
  • 对于“%” ,若参与运算的2个数均为整数,则结果为整除所得的余数,否则结果为a-(b*q),其中q=(int)(a/b)
  • 不同类型相遇时,小类型被自动提升为大类型,运算结果为大类型
  • 作为二元运算符,“+”还具有拼接字符串的功能。
  • 当“+” 两侧都是数值时,完成的是相加而非拼接。
  • 当“+” 两侧都是字符串时,直接拼接,若仅有某一侧是字符串,系统会自动将另一侧的值转换为对应的字符串形式,并拼接二者。
  • 以“+” 拼接字符串的方式存在一定的性能损失,不要过多使用。
  1. 自增与自减
    “++” 和 “–” 均是一元运算符,分别称为自增和自减运算符,它们的作用是将某个变量的值加1或减1后存回该变量。根据出现的位置不同,自增和自减运算符各自都有两种形式——前置形式和后置形式。
  • 前置自增
    若 “++”位于变量之前,如式子 “++i”,此时称为前置自增运算符——将i自增1,然后用增1后的值参与式子的运算。
  • 后置自增
    若 “++”位于变量之后,如式子 “i++”,此时称为后置自增运算符——用i的原值参与式子的运算,然后将i自增1。

关系运算符

关系运算符用于比较两个操作数的大小关系,具体包括6个:==、!=、>,>=,<,<=,分别用以判断两个操作数的值是否相等,不相等,大于,大于等于,小于,小于等于的关系。

  • 关系运算符的优先级低于算术运算符,前者内部,==和!=的优先级低于其它4个。
  • 因boolean型不能被转换为整数值,故其不能与其它基本类型进行关系运算,2个boolean型数据间只能进行相等或不相等的比较。
  • 不能用数学上a<b<c的形式俩连续比较数值型,因为a<b的值是boolean型,不能与数值型c比较,此时应当用逻辑运算符来连接。
  • 注意“==”与“=” 运算符的区别
  • 由于精度限制,尽量不要使用关系运算符在整型与浮点型,之间做直接的大小比较,否则可能得到非预期的结果。
  • 尽量不要用“==” 运算符判断两个字符串是否相等,而应使用String 类的equals方法。

条件运算符

条件运算符是指 “?:”,其使用“?”和“:”隔开3个式子,是java中唯一的三元运算符。条件运算符的使用格式为:

式子1 ?式子2 :式子3

条件运算符的逻辑是:若式子1成立,则取式子2的值作为整个式子的值,否则就取式子3的值,因整个式子的取值取决于式子1是否成立,故式子1也被称为条件,且值必须是boolean型。

逻辑运算符

逻辑运算符具体包括3个:!,&& ,||,它们均要求参与运算的式子的值为boolean型,并且整个式子的值也是boolean型。

运算符使用格式运算规则
!(逻辑非)!A若A为true,整个式子为false,否则为true
&&(逻辑与)A&&B只有当A,B同时为true时,整个式子才为true,其它情况均为false
II(逻辑或)AIIB只有当A,B当中一个为true时,整个式子为true,其它情况均为false
  • "!"是一元运算符,其优先级高于四则运算法和关系运算符,且具有右结合性
  • “&&” 的优先级高于“||”

位运算符

位运算符的操作对象是二进制位,并要求操作数必须是整数型,具体可分为两类——按位运算符和移位运算符。

  1. 按位运算符
    按位运算符依次操作数的每一位进行运算,具体包括4个:~,&,|,^。
  • 按位非:~
    按位非是位运算符中唯一的一元运算符,其对操作数的每一个二进制位进行“非”运算——0变1,1变0。

  • 按位与:&
    按位与对2个操作数的每一对二进制位分别进行“与”运算——只有1和1相遇,结果才为1,其它情况均为0。按位与运算符可以实现对整数A的某些二进制位清0,其余位不变,为了达到这样的效果,需要选取合适的整数B——将B对应于A要清0的那些位设为0,其余位设为1,此时的整数B被称为掩码。

  • 按位或:|
    按位或对两个操作数的每一对二进制位分别进行“或”运算——只有0和0相遇,结果才是0,其它情况均为1,按位或运算符可以实现对整数A的某些二进制位置1,其余位不变,将掩码B对应于A要置1的那些位设为1,其余位设为0。

  • 按位异或:^
    按位异或对两个操作数的每一对二进制位分别进行“异或”运算——相异为真(1)即1和0或者0和1相遇,结果为1,其它情况均为0,按位异或运算符可以实现对整数A的某些二进制取反,其余位不变,将掩码B对应于A要取反的位设为1,其余位设为0。

  1. 移位运算符
    移位运算符将操作数对应的二进制位向左或向右移动若干位,具体包括3个:<<,>>,>>>,它们均是二元运算符,运算符左侧是要移动的数,右侧是移动位数。
  • 有符号数左移:<<
    每移动1位,二进制数的最高位被舍弃,最低位补0,在没有产生溢出的前提下,每左移1位都相当于将左侧操作数乘以2,故左移n位相当于乘以2的n次方。
  • 有符号数右移:>>
    每移动1位,二进制数的最低位被舍弃,最高位补原来的最高位,以保持数的符号不变,每右移1位相当于将左侧操作数整除2,故右移n位相当于整除2的n次方。
  • 无符号数右移:>>>
    每移动1位,二进制数的最低位被舍弃,最高位补0,每右移1位都相当于将左侧操作数除以2,故右移n位相当于除以2的n次方。
  • 移位操作并不改变被移动的操作数,除非将结果存回了
  • 若对byte,short,char型数据移位,数据会自动转换成int型
  • 移动位数n可以是任何整数,但实际取其低5位值,对int型移或低6位值。

表达式

表达式相当于自然语言中的短语,通常由常量,变量以及运算符组成。
表达式是有类型的,一般来说,一个表达式中最后被运算符的部分决定了整个表达式的类型。

表达式示例相关变量值表达式值
赋值表达式a=b=1+2b=3,a=33
a*=b+4a=2121
c=!(d=(1>2))d=false , c=truetrue
算术表达式(i=4)*(- -i)i=312
i- -i=23
i*3%4i=31
关系表达式false==(1>=2?true:false)-true
条件表达式false==1>2?true:false-true
逻辑表达式true&&(i=6)>9i=6false
++i%7==0II–i<5i=7ture
!(i%7==0)&&–i<5i=7false
!(i%7==0&&–i<5)i=6true
按位表达式(a=2)&-1a=22
a^aa=20
移位表达式(a=3)<<aa=324
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南离火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值