第三章 运算符

这篇博客详细介绍了Java中的运算符,包括运算符的介绍、算数运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、三元运算符、运算符优先级、标识符的命名规则,以及键盘输入语句和进制转换等内容,帮助读者深入理解Java运算符的使用和相关概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、运算符介绍

  • 1、 介绍:运算符是一种特殊的符号,用于表示数据的运算、赋值和比较等
  • 2 、作用:主要是对数值类型的变量进行运算的
  • 3 、种类:+ | - | * | / | % | ++ |- -

二、算数运算符

  • 1、 除法的使用
System.out.println(10 / 4);//输出2,两边都是整数 int,最后结果也是整数 int ,是数学上的结果对下取整
System.out.println(10.0 / 4);//输出2.5,前面是double,后面 int ,运算时,自动把 int 转成 double 进行运算,这样,小数就可以保留下来了
double d = 10 / 4;
System.out.println( d );//输出2.0,运算的两个结果是 int 型数据 2,再把这个 2 赋值给 double 类型的数据 d ,就变成了 2.0
  • 2、 % 的使用,% 的本质是 a % b = a- [a / b * b]
    (a / b) 为 int 型
System.out.println(10 % 3);   //输出 1  ;  10 除以 3   商为   3,余数为   1
System.out.println(-10 % 3);  //输出 -1;-10 除以 3   商为 -3,余数为 -1
System.out.println(10 % -3);  //输出 1  ;  10 除以 -3 商为 -3,余数为   1
System.out.println(-10 % -3); //输出 -1;-10 除以 3   商为 -3,余数为 -1
  • 3、 ++ /-- 的使用
    ++ 自增加法(加 1 ), – 自减减法(减一),这里只讲述 ++ ,但是 – 的使用方法都是一致的;

(1)独立使用时,放在前面和后面都一样

int a = 1;
int b = 1;
a++;
++b;
System.out.println(a);//输出2
System.out.println(b);//输出2

(2)在前时,先加 1 ,在运算;在后时,先以原来的数值进行运算,运算完成后,再次加一

int a = 1;
int b = a++;
int c = ++a;
System.out.println(a);//输出3,a 自增两次 a + 1 + 1 = 3
System.out.println(b);//输出1,因为 b = 原始 a(为1),复制完成之后,a = a + 1 = 2;
System.out.println(c);//输出3,因为 c = a + 1 + 1,在前方,先完成自增, a = a + 1 = 3,再进行赋值
  • 4、 面试题 ①
int i = 1;//1 --> i
i = i++;  //(1)temp = i; (2)i = i + 1; (3) i = temp;也就是说,在完成这个语句操作时,用到了一个临时变量 temp ,这个 ++ 在后面,
          //所以就是先赋值,再 +1,所以有了第一步,temp 的值为 1,执行(2),i 自增,执行(3),最后把 temp 赋值给 i ,所以最终结果为1
System.out.println(i);//输出 1
  • 5、 面试题 ②
int i = 1;//1 --> i
i = ++i;//(1)i = i + 1; (2)temp = i; (3) i = temp;也就是说,在完成这个语句操作时,用到了一个临时变量 temp ,这个 ++ 在前面,
        //底层执行时,是先 +1,再 赋值,所以有了第一步,i 自增,i 为 2,执行(2) temp 的值为 2,执行(3),最后把 temp 赋值给 i ,所以最终结果为2
System.out.println(i);//输出2
  • 6 、课堂练习题 ① :写出输出结果
int n1 = 10;
int n2 = 20;
int i = n1++;
System.out.println(i); //输出10
System.out.println(n2);//输出20
i = --n2;
System.out.println(i); //输出19
System.out.println(n2);//输出19
  • 7 、课堂练习题 ② :假如还有 59 天放寒假,问:还有 ?个星期零 ?天
//思路分析:定义一个 int型 变量保存总天数 59;然后星期就是总天数 / 7,零头天数就是 59 % 7;
int day_sum = 59;
int week_num = 59 / 7;
int day_num = 59 % 7;
System.out.println("还有" + week_num + "个星期"); //输出 还有8个星期
System.out.println("还有零" + day_num + "天");    //输出 还有零3天
  • 8、 课堂练习题 ③:已知公式:摄氏温度 = (5/9) * (华氏温度- 100);定义一个变量保存华氏温度,求出对应的摄氏温度
    (扩展:写出一个程序能完成输入 摄氏温度,输出 华氏温度)
//思路分析:因为涉及到了分数运算,所以应该用 double 类型的变量来存储数据,然后根据公式求出结果
double fahrenheit = 234.6;
//double celsius = (5 / 9) * fahrenheit - 100;//这个地方  5 / 9 一定要转换成 double型
double celsius = (5 / 9.0) * fahrenheit - 100;
System.out.println("华氏温度" + fahrenheit + "  对应的摄氏温度为  " + celsius );
//输出  华氏温度234.6  对应的摄氏温度为  74.77777777777777

三、关系运算符(比较运算符)

  • 1、介绍
    关系运算符的结果都是 boolean型,也就是说,结果要么是 true ,要么就是 false,关系表达式一般用于判断语句中
  • 2、种类
    ==(等于) !=(不等于) < > <= >= instanceof(检查是否为类的对象 例如 “陈鑫” instanceof String ;//结果是 true )
int a = 9;
int b = 8;
System.out.println(a > b);  //输出  true
System.out.println(a >= b); //输出  true
System.out.println(a < b);  //输出  false
System.out.println(a <= b); //输出  false
System.out.println(a == b); //输出  false
System.out.println(a != b); //输出  true
boolean flag = a >b;  //flag 的值为 true
  • 3、细节和使用注意
    相等 == 不能写成 =;

    关系运算符组成的表达式,称之为关系表达式

四、逻辑运算符

  • 1、 介绍:用于连接多个条件(多个关系表达式),最终结果也是一个 boolean型 的值

  • 2、种类:
    &与(全真为真,否则为假)

    |或(只要有一个为真,就为真,全假时,才为假)

    &&短路与(与&一样)

    ||短路或(与|一样)

    !取反 ^异或(相异为真,相同为假)

  • 3、&& 和 & 的区别:
    &&当第一个条件为 false 时,不会去判断第二个条件(即为不去执行第二个条件的语句),直接得出 false 的结果;

    &当第一个条件为 false 时,仍然会判断第二个条件(即为 去执行第二个条件的语句),效率低;

    所以再程序开发过程中,一般都使用 && ,效率高

    int a = 4;
    int b = 9;
    if(a < 1 && ++b < 20){
    System.out.println("ok&&"); //条件不满足,不输出
    }
    System.out.println("a =" + a + "   b = " + b); //输出  a = 4  b = 9
    	           
    *******************************************************************************
    	
    int a = 4;
    int b = 9;
    if(a < 1 & ++b < 20){
    System.out.println("ok&");  //条件不满足,不输出
    }
    System.out.println("a =" + a + "   b = " + b); //输出  a = 4  b = 10
         //从上述两部分代码就可以看出区别
    
  • 4、|| 和 | 的区别:
    ||当第一个条件为 true 时,不会去判断第二个条件(即为不去执行第二个条件的语句),直接得出 true 的结果;

    |当第一个条件为 true 时,仍然会判断第二个条件(即为 去执行第二个条件的语句),效率低;

    所以再程序开发过程中,一般都使用 || ,效率高

    int a = 4;
    int b = 9;
    if(a < 10 || ++b < 20){
    System.out.println("ok||"); //输出  ok||
    }
    System.out.println("a =" + a + "   b = " + b); //输出  a = 4  b = 9
               
    *******************************************************************************
    
    int a = 4;
    int b = 9;
    if(a < 10 | ++b < 20){
    System.out.println("ok|");  //输出  ok|
    }
    System.out.println("a =" + a + "   b = " + b); //输出  a = 4  b = 10
    //从上述两部分代码就可以看出区别
    
  • 5、取反操作 !
    如果原来为 true ,则运行后为 false
    如果原来为 false ,则运行后为 true

    System.out.println(a > b);     //输出  true
    System.out.println(!(a > b));  //输出  false
    
  • 6、逻辑异或 ^ 相异为真,相同为假

    boolean b = (1 < 10) ^ (3 > 5);  //这行本质为 true ^ false ,所以根据 异或运算 法则,所得到的结果为真,赋值给b
    System.out.println("b = " + b);  //输出  b = true
    
  • 7、课堂练习题:写出程序输出
    (1) 第 1 题

int x = 5;
int y = 5;
if(x++ == 6 & ++y == 6){
	x = 11;
}
System.out.println("x = " + x + "  y = " + y);  //输出 x = 6  y = 6, & 前后都判断,y 加1

(2) 第 2 题

int x = 5;
int y = 5;
if(x++ == 6 && (++y == 6)){
	x = 11;
}
System.out.println("x = " + x + "  y = " + y);  //输出 x = 6  y = 5, && 判断了前面为 false ,后面不去判断执行,y 不加1

(3) 第 3 题

int x = 5;
int y = 5;
if(x++ == 5 | ++y == 5){
	x = 11;
}
System.out.println("x = " + x + "  y = " + y);  //输出  x = 11  y = 6,| 前后都判断,前面为真,后面继续执行,y 加1

(4) 第 4 题

int x = 5;
int y = 5;
if(x++ == 5 || ++y == 5){
	x = 11;
}
System.out.println("x = " + x + "  y = " + y);  //输出  x = 11  y = 5, || 判断了前面为真,后面不去执行,y 不加1

(5) 第5题

boolean x = true;
boolean y = false;
short z =46;
if((z++ == 46) && (y == true))  //第一个为true ,第二个为false,所以 z 只在判断时加1 z = 47
	z++;
if((x == false) || (++z == 46))  //第一个为false,第二个为false,所以 z 又在判断时加1 z = 48
	z++;
System.out.println("z = " + z); //输出  z = 48

(6) 第6题

boolean x = true;
boolean y = false;
short z =46;
if((z++ == 46) && (y = true))  //第一个为true ,第二个为赋值语句,把 true 赋 给了 y ,最终逻辑还是 true,所以进入{},
	z++;					   //z 在判断时加1 (z = 47),进入{}又加1 (z = 48)
if((x = false) || (++z == 49)) //第一个为false,第二个为 true ,所以进入{}, z 在判断时加1 (z = 49),进入{}又加1, (z = 50)
	z++;
System.out.println("z = " + z); //输出  z = 50

五、赋值运算符

  • 1、介绍
    赋值运算符就是将某个运算后的值,赋给指定变量

  • 2、种类
    基本赋值运算符 =;

    符合赋值运算符 += -= *= /=
    以 += 作为例子,其他都是相同道理:
    a += b <==> a = a + b;

    int n1 = 4;
    n1 += 10;
    System.out.println(n1);  //输出  14
    n1 /= 3;
    System.out.println(n1);  //输出  3
    
  • 3、特点
    (1) 运算顺序从左往右

    (2) 赋值运算符的左边 只能是常量,右边 可以是变量、常量、表达式

    int num1 = 20;
    int num2 = 78 * 32 - 19;
    int num3 = a;
    

    (3) 复合运算符会进行类型转换

    byte b = 2;
    b += 3;   // <==> b = (byte)(b + 2);这个是自动的,不能写成 b = b + 2;
    b ++;     // <==> b = (byte)(b + 1);这个是自动的,没有任何问题
    

六、位运算符 和 位运算

  • 1、便捷 补码 运算方式 :
    从 原码 看,符号位保持1不变,数值位从右边数第一个1及其右边的0保持不变,左边按位取反。

  • 2、位运算符 一共有7个 & | ^ ~ >> << >>>

    (1) 下面这四个运算都要装换成 二进制 的数 按位进行操作,得到最终结果
    & 按位与 :全 1 为 1 ,否则为 0
    | 按位或 :有 1 为 1 ,全 0 则 0
    ^ 按位异或:相异为 1,相同为 0
    ~ 按位取反:1 -> 0 ; 0 -> 1

    (2) >> 算术右移 / << 算术左移 / >>> 无符号右移

    ①/>>/算术右移 (移动 1 位除以 2) :低位溢出直接丢掉,用符号位来补全高位:

    	int a = 1 >> 2;
    	System.out.println(a);  //输出  0
    	1的 原码 00000000 00000000 00000000 00000001
    	1的 补码 00000000 00000000 00000000 00000001
      向右移动两位00000000 00000000 00000000 00000000 0101 溢出,直接不要了所以最后结果就是 0
    

    ②/<</ 算术左移 (移动 1 位乘以2) :符号位不变,低位补 0

    	int a = 1 >> 2;
    	System.out.println(a);  //输出
    	1的 原码     00000000 00000000 00000000 00000001
    	1的 补码     00000000 00000000 00000000 00000001
       向左移动两位00 00000000 00000000 00000000 0000010000 溢出,直接不要了所以最后结果就是 4
    

    ③/>>>/无符号右移:低位溢出直接丢掉,高位直接补 0

  • 3、移位运算

    int a = 1 >> 2;  //1   向右算术位移 2 位
    int b = -1 >> 2; //-1 向右算术位移 2 位
    int c = 1 << 2;  //1   向左算术位移 2 位
    int d = -1 << 2; //1   向左算术位移 2 位
    int e = 3 >>> 2; //3   向右无符号位移 2 位
    System.out.println("a=" + a);  //输出
    System.out.println("b=" + a);  //输出
    System.out.println("c=" + a);  //输出
    System.out.println("d=" + a);  //输出
    System.out.println("e=" + a);  //输出
    
  • 4、按位运算 ~ & | ^

  • 5、原码、补码、反码
    二进制的最高位是符号位, 0–>正 ; 1–>负

    正数 的 原码、补码、反码 三者一致,即 三码合一

    负数 的 反码 为:符号位不变,其他位 按位取反

    负数 的 补码 为:它的 反码 +1 ,即 负数补码 = 负数反码 + 1

    0 的 反码 补码 都是 0

    Java中的数全都是 有符号数,计算机运行的时候,使用 补码 进行计算,我们人看计算结果的时候,是看最终的 原码

     		   int n1 = 2&3;
     		   System.out.println(n1);//输出  2
    
     		   2 & 3
     		   2 的 原码  00000000 00000000 00000000 00000010
     		   2 的 补码  00000000 00000000 00000000 00000010
     		   3 的 原码  00000000 00000000 00000000 00000011
     		   3 的 补码  00000000 00000000 00000000 00000011
    
     		   2 的 补码:00000000 00000000 00000000 00000010
     		   3 的 补码:00000000 00000000 00000000 00000011
          运算得到的补码 & 00000000 00000000 00000000 00000010
       转换过后得到的原码   00000000 00000000 00000000 00000010,所以最终结果是 2
     	  
    ********************************************************************************
         	   int n2 = ~ -2;
    		   System.out.println(n3);//输出  1
    
         	   ~ -2
         	   -2 的 原码 10000000 00000000 00000000 00000010
         	   -2 的 反码 11111111 11111111 11111111 11111101
         	   -2 的 补码 11111111 11111111 11111111 11111110
         运算得到的补码  ~ 00000000 00000000 00000000 00000001
       转换过后得到的原码   00000000 00000000 00000000 00000001,所以最终结果是 1
       
    *******************************************************************************
             	int n3 = 2|3;
    			System.out.println(n3);//输出  3
             	2 | 3
         	    2 的 原码  00000000 00000000 00000000 00000010
     		    2 的 补码  00000000 00000000 00000000 00000010
     		    3 的 原码  00000000 00000000 00000000 00000011
     		    3 的 补码  00000000 00000000 00000000 00000011
    
     		    2 的 补码:00000000 00000000 00000000 00000010
     		    3 的 补码:00000000 00000000 00000000 00000011
          运算得到的补码  | 00000000 00000000 00000000 00000011
        转换过后得到的原码   00000000 00000000 00000000 00000011,所以最终结果是 3
    
    *******************************************************************************
         	   int n1 = 2 ^ 3;
    		   System.out.println(n1);//输出  1
    
         	   2 ^ 3
     		   2 的 原码  00000000 00000000 00000000 00000010
     		   2 的 补码  00000000 00000000 00000000 00000010
     		   3 的 原码  00000000 00000000 00000000 00000011
     		   3 的 补码  00000000 00000000 00000000 00000011
    
     		   2 的 补码:00000000 00000000 00000000 00000010
     		   3 的 补码:00000000 00000000 00000000 00000011
         运算得到的补码  ^ 00000000 00000000 00000000 00000001
     	 转换过后得到的原码 00000000 00000000 00000000 00000001,所以最终结果是 1
    

七、三元运算符

  • 1、基本介绍
    基本语法: 条件表达式 ? 表达式1 : 表达式2
    如果 条件表达式成立 ,即为 true ,运算后的结果是 表达式1
    如果 条件表达式不成立,即为 false ,运算后的结果是 表达式2

    口语:一真大师,真的就运行第一个

    一定要记住,三元运算符是一个整体,会自动转换成精度最高的那个数据类型进行运算,比如

    true ? int 2 : double 3.0//最后的输出是 2.0,就是因为int类型自动转换成了double类型
    
  • 2、使用细节
    (1)表达式1 和 表达式2 要为可以赋给接收变量的类型(或自动转换/强制转换)//也就是说 这两个表达式必须要符合左边的赋值语句的数据类型

    int a = 3;
    int b = 4;
    int c = a > b ? a : b;				//int类型 赋值给 int类型 完全可以
    //int c = a > b ? 1.1 : 2.2;		//dounle类型 赋值给 int类型 不可以,编译报错:不兼容的数据类型
    int c = a > b ? (int)1.1 : (int)2.2;//dounle类型经过强制转换之后,变成 int类型, 赋值给 int类型  完全可以
    double d = a > b ? a + 2 : b;		//int类型 赋值给 double类型 ,有自动转换存在,完全可以
    

    (2)三元运算符可以转换成 if–else 语句

    	int res = a > b ? a++ : b--;
    	if(a > b)
    		res = a++;
    	else
    		res = b--;
    
  • 3、课堂练习,实现求出三个数的最大值

//思路:先得到 n1 和 n2 中的最大值,保存到 max 中
//     再与第三个数作比较,如果 n3 > max ,则  max 就是 n3,否则就是 max
int n1 = 11;
int n2 = 22;
int n3 = 33;
int max1 = n1 > n2 ? n1 : n2;
int max2 = max1>n3 ? max1 : n3;
System.out.println(max2);  	 //输出  33

八、运算符优先级(从上到下)

(1)、() {}
(2)、单目运行 ++ / - -
(3)、算数运算符
(4)、移位运算符
(5)、比较运算符
(6)、逻辑运算符
(7)、三元运算符

九、标识符的命名规则与规范

  • 1、标识符
    Java对各种变量、方法和类等命名时使用的字符序列

    凡是自己可以其名字的地方都叫标识符

  • 2、标识符的规则
    (1)、由26个英文字母大小写,0-9,_ 或 & 组成

    (2)、数字不可以开头

    (3)、不可以使用关键字和保留字,但是能包含关键字和保留字

    (4)、Java中严格区分大小写,长度无限制

    (5)、标识符中不能包含空格

  • 3、标识符的规范(这样写更加的更加的专业,代码更具有可读性)
    (1)、包名:多单词组成时所有字母小写: aaa.bbb.ccc

    (2)、类名、接口名:多单词组成时,所有单词的首字母大写 XxxYyyZzz

    (3)、变量名、方法名(函数名):多单词组成时,第一个单词首字母小写,从第二个单词开始每个单词首字母大写 xxxYyyZzz

    (4)、常量名:所有字母都大写。多单词时使用下划线进行连接 XXX_YYY_ZZZ

    (5)、后面我们学习到 类、包、接口等时,我们的命名规范要这样遵守,更加详细的看文档

十、键盘输入语句

  • 1、介绍
    在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取,需要一个扫描器(对象),就是 Scanner

  • 2、步骤
    导入该类所在的包,(import) java.util.*;创建该类对象(声明变量);调用里面的功能

    例如:编写一个可以 从控制台接受用户信息[姓名,年龄,薪水] 的程序

    	//设计思路:
    	//1、导入 Scanner 所在的包
    	//2、创建一个 Scanner 对象
    	//3、接收用户的输入,使用相关的方法
    
    Scanner scanner =new Scanner(System.in);
    System.out.println("请输入你的名字");
    String name = scanner.next();   		 //next() 是接收 字符串型 数据
    System.out.println("请输入你的年龄");
    int age = scanner.nextInt();   		     //nextInt() 是接收 int型 数据
    System.out.println("请输入你的薪水");
    double money = scanner.nextDouble();   	 //nextDouble() 是接收 double型 数据
    System.out.println("你的信息如下:\n" + "姓名\t" + "年龄\t" + "薪水\t\n" 
    + name + '\t' + age + '\t' + money + '\t' );
       //运行结果
       //你的信息如下:
       //姓名	年龄 	薪水
       //陈鑫	21  	8000.0
    

十一、进制 8421解君愁

  • 1、介绍:Java会用到4种进制
    二进制 :0b 或者 0B 开头;满 2 进 1

    八进制 :0 开头 ;满 8 进 1

    十进制 : ;满 10 进 1

    十六进制:0x 或者 0X 开头;满 16 进 1,A = 10, B = 11, C = 12, D =13, E = 14, F = 15

    int n1 = 0b1011 ;	//   二进制
    int n2 = 01010  ;	//   八进制
    int n3 = 1111   ;	//   十进制
    int n4 = 0X10101;   //   十六进制
    System.out.println(n1);  	 //输出  11
    System.out.println(n2);  	 //输出  520
    System.out.println(n3);  	 //输出  1111
    System.out.println(n4);  	 //输出  65793
    
  • 2、进制转换 X进制 --> 十进制
    与 十进制 相关的转换 从最低为(最右边)开始,将每位上的数字提出来,乘以 X 的(位数 - 1)次方,然后求和 // X 是哪一种进制,可取二、八、十六

    以二进制 转 十进制 为例,展示一遍

    0B1011 = 1 * 2的(1-1)次方 + 1 * 2的(2-1)次方 + 0 * 2的(3-1)次方 + 1 * 2的(4-1)次方
    = 1 + 2 + 0 + 8 = 11

  • 3、进制转换 十进制 --> X进制
    该 十进制 的数,不断除以 X ,直到商为 0 为止,然后将每步的余数倒过来,就是它所对应的 X 进制

    十进制 转 二进制、 十进制 转 八进制、 十进制 转 十六进制 都是上述讲的这个方法

  • 4、二、八、十六进制之间互相转换 8421法

十二、本章作业

1、写结果

10 / 3 = 3;
10 / 5 = 2;
10 % 2 = 0;
-10.5 % 3 = -1.5;//(机器运算可能是接近 -1.5 的一个小数)

2、写结果

int i = 66;
System.out.println(++i + i);//输出  134 实质就是 67 + 67 =134

3、下面赋值语句正确的是

int n1 = (int)"18";			//错误,应该是 int n1 = Inteager.parseInt("18");
int n2 = 18.0;     			//错误,double型 赋值给 int型
double n3 = 3.3d;  			//正确,后面加上 d/D 就明确是 double型 的数据
double n4 = 3;     			//正确,int型 赋值给 double型,自动转换
int i = 48; char c = i + 1; //错误,i + 1 之后数据是 int型,无法再赋值给 char型
byte b = 19;short s = b + 2;//错误,byte、short数据运算时,数据类型为 int型 ,无法再赋值给 short

4、试写出将 String类型 转换成 double类型 的语句,以及将 char类型 转换成 String类型 的语句,说明即可

String str = "3.14";
double d = Double.parseDouble(str);
char c = 'a';
String sc = c +"";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值