【JavaSE】运算符详解及与C语言中的区别

简介: 【JavaSE】运算符详解及与C语言中的区别




一、什么是运算符

运算符就是对操作数进行操作时的符号,不同运算符操作的含义不同

部分运算符在使用时会发生整形提升操作

二、算术运算符

算术运算符有三种:基本四则运算符、增量运算符和自增/自建运算符

1.基本四则运算符

基本四则运算的运算符包括五个:+    -   *   /(整除)     %(取余或者取模)

(1)/的规则(注意事项)

【加小数点问题】int / int 结果还是int类型,而且会向下取整

如:

public static void main(String[] args) {
        int a = 3;
        int b = 2;
// 在数学中应该是1.5 但是在Java中输出结果为1 会向下取整,即小数点之后全部舍弃掉了
        System.out.println(a / b);
// 如果要得到数学中的结果,可以使用如下方式
        double d = a*1.0 / b;
        System.out.println(d);
    }

所以,当左右两边不是float时,需要加上.0或者*1.0

【操作数取值】

当做除法时,右边的操作符不能是0,否则编译器会报错误(算术错误),如:10/0,这是错误的。

(2)%的规则

(1)与/一样,右边的操作数不能是0,如:10%0

(2)% 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的。也就是%的结果可以有小数和负数。

(3)四则运算符规则

都是二元运算符,使用时必须要有左右两个操作数。两侧操作数类型不一致时,向类型大的提升

2.增量运算符

增量运算符包括:+=    -=    *=    %=

如:操作完成后,会将操纵的结果赋值给左操作数

int a = 1;
a += 2;          // 相当于 a = a + 2
System.out.println(a);  // 输出3
a -= 1;          // 相当于 a = a - 1
System.out.println(a);  // 输出2
a *= 3;          // 相当于 a = a * 3
System.out.println(a);  // 输出6
a /= 3;          // 相当于 a = a / 3
System.out.println(a);  // 输出2
a %= 3;          // 相当于 a = a % 2
System.out.println(a);  // 输出2

注意:只有变量才能使用该运算符,常量不能使用

3.自增/自减运算符++/--

【符号特点】++是给变量的值+1,--是给变量的值-1。

【分类】分为前置/后置++/--,如:a++(后置++,使用完后++),++a(前置++,++完后再使用)

【使用】

int a = 1;
a++;   // 后置++  表示给a的值加1,此时a的值为2
System.out.println(a++);  // 注意:后置++是先使用变量原来值,表示式结束时给变量+1,因此输出2
System.out.println(a);   // 输出3
++a;   // 前置++  表示给a的值加1
System.out.println(++a);  // 注意:前置++是先给变量+1,然后使用变量中的值,因此输出5
System.out.println(a);   // 输出5
// --操作符给操作-1,与++含义类似

【注意点】

  • 如果单独使用,【前置++】和【后置++】没有任何区别
  • 如果混合使用,【前置++】先+1,然后使用变量+1之后的值,【后置++】先使用变量原来的值,表达式结束时给变量+1
  • 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改

三、关系运算符

六个关系运算符其计算结果是 true 或者 false 。

(1)==:相等符号,用来判断两个式子是否相等

(2)!=:不等于符号,用来判断是否不相等

(3)>:大于号,用来判断大小

(4)<:小于号,用来判断大小

(5)>=:大于等于号,

(6)<=:大于等于号

【使用】

int a = 10;
int b = 20;
// 注意:在Java中 = 表示赋值,要与数学中的含义区分
//   在Java中 == 表示相等
System.out.println(a == b);    // false
System.out.println(a != b);    // true
System.out.println(a < b);     // true
System.out.println(a > b);     // false
System.out.println(a <= b);    // true
System.out.println(a >= b);    // false

四、逻辑运算符(重点)

逻辑运算符包括三个,&&、||、!,运算结果都是 boolean类型。

1.逻辑与&&

【语法规则】表达式1&&表达式2

注意:表达式1和表达式2都必须是boolean的结果,两边的结果都为true,整体才为true

【规则】

表达式1 表达式2 结果

【使用举例】

public static void main(String[] args) {
    
        int a = 1;
        int b = 2;
        System.out.println(a == 1 && b == 2); // 左为真 且 右为真 则结果为真
        System.out.println(a == 1 && b > 100); // 左为真 但 右为假 则结果为假
        System.out.println(a > 100 && b == 2);// 左为假 但 右为真 则结果为假
        System.out.println(a > 100 && b > 100); // 左为假 且 右为假 则结果为假
    }

结果:

【用处】常用于要求两个条件需要同时满足时,如果if语句中的条件等

【短路与】逻辑与也称为短路与

什么意思呢?就是当表达式1为假的时候,表达式2不会去执行(因为没有必要再去侦察它的真假,系统就会跳过表达式2)

如:下面的代码是不会报错的

int i=111;
        System.out.println(i > 222 && (10/0)==0);

结果:

10/0的表达式是错误的,但是因为第一个表达式是错的,发生了短路,就不会再去判断第二个表达式

2.逻辑或||

【语法规则】表达式1||表达式2

注意:表达式1和表达式2都必须是boolean的结果,两边有一个为true,整体的结果就为true。

【规则】

表达式1 表达式2 结果

【使用举例】

public static void main(String[] args) {
        int a = 1;
        int b = 2;
        System.out.println(a == 1 || b == 2);// 左为真 且 右为真 则结果为真
        System.out.println(a == 1 || b > 100);// 左为真 但 右为假 则结果也为真
        System.out.println(a > 100 || b == 2); // 左为假 但 右为真 则结果也为真
        System.out.println(a > 100 || b > 100); // 左为假 且 右为假 则结果为假
    }

结果:

【短路或】逻辑或也称为短路或

同样,当表达式1为真时,不会再去执行表达式2.

3.逻辑非

【语法规则】!表达式

注意:假边真,真变假。

【规则】

表达式 结果

【使用】

int a = 1;
System.out.println(!(a == 1));  // a == 1 为true,取个非就是false
System.out.println(!(a != 1));  // a != 1 为false,取个非就是true

【注意】

在C语言中,可能会用(!数值)表示条件,如:if(!a),在java中,这是不允许的

4.补充

& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值

五、位运算符

1.位运算符介绍

(1)位操作表示:按二进制位运算.,计算机中都是使用二进制来表示数据的(01构成的序列),按位运算就是在按照二进制位的每一位依次进行计算.

操作对象:二进制的补码

(2)位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。

2.按位与&

(1)&的特点:如果两个二进制位都是 1, 则结果为 1, 否则结果为 0

&的口诀:有0为0,全1为1。

(2)用法举例

public static void main(String[] args) {
        int a=10;
        int b=15;
        System.out.println(a&b);
    }

a&b的结果:10

运算过程:

3.按位或|

(1)|的特点:如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.

|的口诀:有1为1,全0为0。简称同为0

(2)用法举例

public static void main(String[] args) {
  
        int c=10;
        int d=15;
        System.out.println(c|d);
    }

c|d的结果:15

按位与过程:

4.按位异或^

(1)^的特点:如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.

口诀:找不同,用1标记;相同为0,相异为1

性质:

(1)支持交换律

(2)相同异或为0:a^a=0

(3)任何数异或0等于本身:a^0=a

(2)用法举例:

public static void main(String[] args) {
        int a=10;
        int b=15;
        System.out.println(a^b);
    }

a^b的结果:5

异或的过程:

5.按位取反~

(1)如果该位为 0 则转为 1, 如果该位为 1 则转为 0,又称异或非

如:10的补码为00001010,则会转为11110101

(2)用法举例

public static void main(String[] args) {
        int a=10;
        System.out.println(~a);
    }

取反结果:-11

取反过程:

六、移位运算符(了解)

1.左移操作符<<

(1)特点:左边丢弃,右边补0

注意点:因为最左边丢弃的是符号位,因此正数左移有可能变成负数

(2)用法举例:

public static void main(String[] args) {
        int a=10;
        System.out.println(a);
        System.out.println(a<<1);
        System.out.println(a<<2);
    }

左移结果:

左移过程解析:

(3)注意事项

左移的长度需要是非负数

左移一次具有*2的效果

2.右移操作符>>

右移操作符有两种:符号右移和无符号右移

(1)符号右移>>

【语法特点】最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)

【用法举例】

public static void main(String[] args) {
        int a=10;
        System.out.println(a>>1);
        System.out.println(a>>2);
    }

右移结果:

右移过程刨析:

【注意事项】

(1)右移的长度需要是非负数和整数

(1)右移一位具有/2的效果,两位具有/2^2的效果,但是-1例外,会得到本身

(2)无符号右移>>>(与C的写法不同)

【语法特点】最右侧位不要了, 最左侧补都补0

【语法举例】

public static void main(String[] args) {
       int a=10;
       System.out.println(a>>>1);
       int b=-10;
       System.out.println(b>>>1);
    }

无符号右移结果:5、2147483643(整形最大值)

解析:因为最左侧丢掉的是符号位,负数会变成正数;正数依旧是/2的效果

七、条件运算符

条件运算符也成为三目运算符,是Java中唯一一个三目运算符。

(1)语法特点:表达式1 ? 表达式2 : 表达式3

当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;

当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值。

【注意】

(1)表达式1的值必须是布尔表达式

(2)表达式1的值需要用变量来接收或者直接打印

(2)实例:求两个数的最大值

public static void main(String[] args) {
       int a = 520;
       int b = 1314;
       int max = a>b?a:b;
       System.out.println(max);
    }

表达式1:a>b,他们必须直接必须有一个结果

八、运算符的优先级及运算符总结

不同的符号存在优先级,但是符号很多,我们不需要记忆,只需要规范使用小括号就可以。

总结:与C语言的不同点

(1)基本四则运算符中的取模符%

在C中,%的结果只有正数;而在Java中,可以有小数和负数

(2)逻辑非!

在C中,!的左边可以是数字,或者表达式,如!1;在Java中,!的左边必须是布尔表达式,就是表达式的结果比赛true就是false

(3)|与&

Java中,& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算.。但是在C中没有这种说法

(4)无符号右移操作符>>>

无符号右移操作符其实就是右移操作符的一种操作规则。在C语言中,右移操作符都是>>,只是在不同的平台上有不同的右移方式(右移方式不能自己决定);而在Java中,把他们分离开来,成为了两个符号,右移的方式在操作者手中。


相关文章
|
28天前
|
存储 C语言 C++
【c语言】运算符汇总(万字解析)
今天博主跟大家分享了c语言中各种操作符的功能、使用方法以及优先级和结合性,并且与大家深入探讨了表达式求值的两个重要规则--算数转换和整形提升。学习这些知识对我们的C语言和C++学习都有着极大的帮助。
108 2
|
1月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
24天前
|
C语言
【C语言】条件运算符详解 - 《 A ? B : C 》
条件运算符(也称为三元运算符)是C语言中唯一的三元运算符。它通常用于替代简单的 `if-else` 语句。
77 6
|
1月前
|
C语言
c语言运算符
C的运算符有以下几种: 算术运算符:+、-、*、/、% 结合方向自左向右 关系运算符:>、<、==、>=、<=、!= 逻辑运算符:!、&&、|| 位运算符<<、>>、~、|、^、& 赋值运算符:=及符号扩展赋值运算符(+=、-=、*=、/=) 条件运算符:? : 逗号运算符:, 指针运算符:*、& 求字节运算符:sizeof 强制类型转换运算符:((类型)) 分量运算符:.、-> 下标运算符:[]
40 4
|
1月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
2月前
|
存储 C语言
C语言中a 和&a 有什么区别
在C语言中,&quot;a&quot; 是一个变量的名字,代表存储在内存中的某个值。而&quot;&a&quot; 则是获取该变量的内存地址,即变量a在计算机内存中的具体位置。这两者的主要区别在于:&quot;a&quot; 操作的是变量中的值,&quot;&a&quot; 操作的是变量的内存地址。
259 23
|
2月前
|
存储 C语言
C语言:普通局部变量、普通全局变量、静态局部变量、静态全局变量的区别
C语言中,普通局部变量在函数内部定义,作用域仅限于该函数;普通全局变量在所有函数外部定义,作用域为整个文件;静态局部变量在函数内部定义但生命周期为整个程序运行期;静态全局变量在所有函数外部定义,但仅在定义它的文件内可见。
120 10
|
2月前
|
程序员 编译器 C语言
C中的 malloc 和C++中的 new 有什么区别
在C语言中,`malloc`函数用于在运行时分配内存,返回指向所分配内存的指针,需显式包含头文件 `&lt;stdlib.h&gt;`。而在C++中,`new`不仅分配内存,还对其进行构造初始化,且直接使用类型声明即可,无需额外包含头文件。`new`还支持数组初始化,能更好地融入C++的面向对象特性,而`malloc`仅作为内存分配工具。使用完毕后,`free`和`delete`分别用于释放`malloc`和`new`分配的内存。
68 21
|
2月前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
2月前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。