自掘Java----③(运算符与C的区别)
一 运算符和表达式
1.运算符
①运算符(Operator)进行数据的运算,实现对数据的各种操作。
②使用运算符就必须要有运算对象。运算对象也称为操作数(Operand),可以是常量、变量、函数和其他表达式。
③根据所需运算对象(操作数)的个数,运算符又分为3类:
单目运算符(Unary Operator )(操作数的个数为1,如:取负值运算符等);
双目运算符(Binary Operator )(操作数的个数为2,如:加、减运算符等);
三目运算符(Ternary Operator)(操作数的个数为3,如:条件运算符)。
2. 表达式
①表达式(Expression)由运算符和运算对象组成。
②最简单的表达式可以只包括一个运算对象,
复杂的表达式可以是运算符和运算对象的任意组合。
根据运算规则,任何一个表达式都有一个确定的值,称为表达式的值。
3. 运算符的优先级与结合性
- 当程序中出现一个包含有多个运算符的复杂表达式时,为了准确理解该表达式的语义,通常需要将其划分成若干简单的子表达式的组合,这就必须依靠运算符的两个重要属性:优先级(Precedence)和结合性(Associativity);
- Java语言将运算符分为14个优先级,级数越小的运算符优先级越高;
- 运算符的结合性只有左结合和右结合两种;
优先级 | 运算符说明 | Java运算符 |
---|---|---|
1 | 括号 | () 、[] 、{} |
2 | 正负号 | + 、- |
3 | 单元运算符 | ++ 、-- 、~ 、! |
4 | 乘法、除法、求余 | * 、/ 、% |
5 | 加法、减法 | + 、- |
6 | 移位运算符 | << 、>> 、>>> |
7 | 关系运算符 | < 、<= 、>= 、> 、instanceof |
8 | 等价运算符 | == 、!= |
9 | 按位与 | & |
10 | 按位异或 | ^ |
11 | 按位或 | | |
12 | 条件与 | && |
13 | 条件或 | || |
14 | 三元运算符 | ? : |
15 | 赋值运算符 | = 、+= 、-= 、*= 、/= 、%= |
16 | 位赋值运算符 | &= 、|= 、<<= 、>>= 、>>>= |
二 Java运算符一览(增添了与C的对比)
Java语言运算符优先级表 | ||||||
---|---|---|---|---|---|---|
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 运算符类型 | |
1 | [ ] | 数组元素下标 | 数组名 | 左到右 | / | |
() | 圆括号 | (表达式)/函数名(形参表) | ||||
. | 成员选择(对象) | 对象.成员名 | ||||
删去了指针-> | ||||||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 | |
~ | 按位取反运算符 | ~表达式 | ||||
++ | 自增运算符 | ++变量名/变量名++ | ||||
-- | 自减运算符 | --变量名/变量名-- | ||||
* | 取值运算符 | *指针变量 | ||||
& | 取地址运算符 | &变量名 | ||||
! | 逻辑非运算符 | !表达式 | ||||
(类型) | 强制类型转换 | (数据类型)表达式 | ||||
sizeof | 长度运算符 | sizeof(表达式) | ||||
3 | * | 乘法 | 表达式*表达式 | 左到右 | 双目算数运算符 | |
/ | 除法 | 表达式/表达式 | ||||
% | 整除求余(取模) | 整型表达式%整型表达式 | ||||
4 | + | 加法 | 表达式+表达式 | 左到右 | 双目算数运算符 | |
- | 减 | 表达式-表达式 | ||||
5 | << | 左移位 | 变量<<表达式 | 左到右 | 双目位运算符 | |
>> | 右移位 | 变量>>表达式 | ||||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目关系运算符 | |
>= | 大于等于 | 表达式>=表达式 | ||||
< | 小于 | 表达式<表达式 | ||||
<= | 小于等于 | 表达式<=表达式 | ||||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目关系运算符 | |
!= | 不等于 | 表达式!= 表达式 | ||||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目位运算符 | |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | ||
10 | | | 按位或 | 表达式|表达式 | 左到右 | ||
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目逻辑运算符 | |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | ||
13 | ?: | 条件运算符 | 表达式1?表达式2: 表达式3 | 左到右 | 三目运算符(唯一) | |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | 双目运算符 | |
+= | 加后赋值 | 变量+=表达式 | 算数复合赋值运算符 | |||
-= | 减后赋值 | 变量-=表达式 | ||||
*= | 乘后赋值 | 变量*=表达式 | ||||
/= | 除后赋值 | 变量/=表达式 | ||||
%= | 取模后赋值 | 变量%=表达式 | ||||
<<= | 左移后赋值 | 变量<<=表达式 | 位复合赋值运算符 | |||
>>= | 右移后赋值 | 变量>>=表达式 | ||||
&= | 按位与后赋值 | 变量&=表达式 | ||||
^= | 按位异或后赋值 | 变量^=表达式 | ||||
|= | 按位或后赋值 | 变量|=表达式 | ||||
15 | , | 逗号运算符 | 表达式,表达式 | 左到右 | 顺序求值运算符 |
简记运算符优先级就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
三 Java运算符详解
3.1 算术运算符
-
算术(Arithmetic)运算包括加、减、乘、除、求余、取负数等,分别使用运算符
+
、-
、*
、/
、%
和-
来表示 -
/
除法运算符的两种含义:整数除和实数除- 当两个整数相除时,结果仍为整数,即只保留整数商,而舍去小数部分;
- 只要两个操作数中有一个是实数,
/
都表示实数除,得到的是真实的小数结果;
与C语言区别在于
在Java中+
号的含义除了“加减乘除的加”、“正负的正”,还有充当连接符的作用。
public class HelloWorld {
public static void main(String[] args){
System.out.println(1+"abc");
}
}
//输出1abc
- 在Java中,针对
byte
类型和short
类型的时候,当赋值运算符右侧存在变量时,均报错,而C正常运行
即:当定义只要byte
类型和short
类型的时候,右边有一个是变量,就会编译报错
public class HelloWorld {
public static void main(String[] args) {
byte a=1;
a=a+1; //报错
System.out.println(a);
}
}
3.2 自增、自减运算符
变量自增(Increment)运算符++
和自减(Decrement)运算符--
,其作用是使被操作的变量的值增加1或减少1。作用主要是提高程序的编译效率,也增加了程序的简洁性。
-
是单目运算符,只需要一个操作数,而且操作数必须是变量。它们的优先级与其他单目运算符一样,高于所有双目运算符,且具有右结合性。
-
既可以放在变量的前面,称为前++(Prefix Increment)和前- -(Prefix Decrement);也可以放在变量的后面,称为后++(Postix Increment)和后- -(Postix Decrement)结果不同。
格式如下:
++<变量>、--<变量>、<变量>++<变量>--
-
前++、**前–**表示先对变量进行自增、自减1运算,再将变量更新后的值作为自增、自减表达式的值。后++、**后- -**表示先将变量原来的值作为自增、自减表达式的值,再对变量进行自增、自减1运算。
-
只能操作变量,类似于
(-b)--
的格式是非法的。 -
自增、自减运算符自带强制转换,即
byte a=1;
a++ //a=(byte)a+1
3.3 复合赋值运算符
Java语言还提供另一种形式的赋值运算符,称为复合赋值(Combined Assignment)运算符。它由双目运算符与双目赋值运算符一起构成。包括+=
、-=
、*=
、/=
、%=
格式如下:
<变量><双目赋值运算符>=<表达式>
a*=a+1
上述语法等价于:
<变量>=<变量><双目运算符><表达式>
a=a*(a+1)
同样具有强制转换
byte a=1;
a+=1 //a=(byte)a+1
3.4 关系运算符
关系(Relational)运算是用来比较两个操作数的值的运算,比较的结果是一个逻辑值,即只能是“真”或“假”。若比较条件得到满足,则结果为真;否则,结果为假。C语言中关系运算共6种,包括:小于、小于或等于、大于、大于或等于、等于、不等于,分别使用运算符<
、>
、>=
、==
和!=
。
与C语言区别在于
关系运算符得出来的结果一定是boolean
类型的数据,也就是说要么是true
,要么是false
3.5 逻辑运算符
-
区分“&”和“&&”:
-
相同点:如果符号左边是true,则二者都执行符号右边的操作
-
不同点:& : 如果符号左边是false,则继续执行符号右边的操作
&& :如果符号左边是false,则不再继续执行符号右边的操作
-
-
区分“|”和“||”:
-
相同点:如果符号左边是false,则二者都执行符号右边的操作
-
不同点:| : 如果符号左边是true,则继续执行符号右边的操作
|| :如果符号左边是true,则不再继续执行符号右边的操作
-
3.6 位运算符
位运算符的运算过程都是基于二进制的补码运算
3.6.1 左移 <<
- 运算规则:在一定范围内,数据每向左移动一位,相当于原数据*2。(正数、负数都适用)
【注意】当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位
3<<4 类似于 3*2的4次幂 => 3*16 => 48
-3<<4 类似于 -3*2的4次幂 => -3*16 => -48
3.6.2 右移 >>
运算规则:在一定范围内,数据每向右移动一位,相当于原数据/2。(正数、负数都适用)
【注意】如果不能整除,向下取整
。
69>>4 类似于 69/2的4次 = 69/16 =4
-69>>4 类似于 -69/2的4次 = -69/16 = -5
3.6.3 无符号右移 >>>
运算规则:往右移动后,左边空出来的位直接补0。(正数、负数都适用)
相当于取正数
69>>>4 类似于 69/2的4次 = 69/16 =4
-69>>>4 结果:268435451
3.6.4 按位与 &
运算规则:对应位都是1才为1,否则为0。
9 & 7 = 1
-9 & 7 = 7
3.6.5 按位或 |
运算规则:对应位只要有1即为1,否则为0。
9 | 7 //结果: 15
-9 | 7 //结果: -9
3.6.6 按位异或 ^
运算规则:对应位一个为1一个为0,才为1,否则为0。
9 ^ 7 //结果为14
-9 ^ 7 //结果为-16
3.6.7 按位取反 ~
运算规则:对应位为1,则结果为0;对应位为0,则结果为1。
~9 //结果:-10
~-9 //结果:8
3.7 条件运算符
(条件表达式)? 表达式1:表达式2
- 如果运算后的结果赋给新的变量,要求表达式1和表达式2为同种或兼容的类型
public static void main(String[] args) {
int i = (1==2 ? 100 : 200);
System.out.println(i);//200
boolean marry = false;
System.out.println(marry ? "已婚" : "未婚" );
double d1 = (m1 > m2)? 1 : 2.0;
System.out.println(d1);
int num = 12;
System.out.println(num > 0? true : "num非正数");
}
四 Java运算符与C总结
4.1 算术运算符
①在Java中+
号的含义除了“加减乘除的加”、“正负的正”,还有充当连接符的作用。
任意数据类型的数据与字符串相连接的时候,那个+
号就是连接符。
②当定义只要byte
类型和short
类型的时候,右边有一个是变量,就会编译报错
4.2 关系运算符
关系运算符得出来的结果一定是boolean
类型的数据,也就是说要么是true
,要么是false
4.3 其它
自增、自减运算符、复合赋值运算符自带强制转换,对于byte
类型和short
类型不会编译报错