目录
操作符系列教材 (一)- Java的算数操作符
示例 1 : 基本算数操作符
示例 2 : 任意运算单元的长度超过int
示例 3 : 任意运算单元的长度小于int
示例 4 : %取模
示例 5 : 自增 自减
示例 6 : 自增 自减操作符置前以及置后的区别
操作符系列教材 (二)- Java的关系操作符
示例 1 : 关系操作符
操作符系列教材 (三)- Java的逻辑运算符
示例 1 : 长路与 和 短路与
示例 2 : 长路或 和 短路或
示例 3 : 取反
示例 4 : 异或^
操作符系列教材 (四)- Java的位操作符
示例 1 : 一个整数的二进制表达
示例 2 : 位或
示例 3 : 位与
示例 4 : 异或
示例 5 : 取非
示例 6 : 左移 右移
示例 7: 带符号右移与无符号右移
操作符系列教材 (五)- Java的赋值操作符
示例 1 : 赋值操作
示例 2 : 对本身进行运算,并赋值
操作符系列教材 (六)- Java的三元操作符
示例 1 : 三元操作符
操作符系列教材 (七)- 使用Scanner读取整数
步骤 1 : 使用Scanner读取整数
步骤 2 : 使用Scanner读取浮点数
步骤 3 : 使用Scanner读取字符串
步骤 4 : 读取了整数后,接着读取字符串
算数操作符
基本的有:
<code>+ - * / %</code>
自增 自减
<code>++ --</code>
<code>+ - * /</code>
基本的加 减 乘 除
<code>public</code> <code>class</code> <code>HelloWorld {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>
<code> </code><code>int</code> <code>i = </code><code>10</code><code>;</code>
<code> </code><code>int</code> <code>j = </code><code>5</code><code>;</code>
<code> </code><code>int</code> <code>a = i+j;</code>
<code> </code><code>int</code> <code>b = i - j;</code>
<code> </code><code>int</code> <code>c = i*j;</code>
<code> </code><code>int</code> <code>d = i /j;</code>
<code> </code><code>}</code>
<code>}</code>
如果有任何运算单元的长度超过int,那么运算结果就按照最长的长度计算
比如
int a = 5;
long b = 6;
a+b -> 结果类型是long
<code> </code><code>int</code> <code>a = </code><code>5</code><code>;</code>
<code> </code><code>long</code> <code>b = </code><code>6</code><code>;</code>
<code> </code><code>int</code> <code>c = (</code><code>int</code><code>) (a+b); </code><code>//a+b的运算结果是long型,所以要进行强制转换</code>
<code> </code><code>long</code> <code>d = a+b;</code>
如果任何运算单元的长度都不超过int,那么运算结果就按照int来计算
byte a = 1;
byte b= 2;
a+b -> int 类型
<code> </code><code>byte</code> <code>a = </code><code>1</code><code>;</code>
<code> </code><code>byte</code> <code>b= </code><code>2</code><code>;</code>
<code> </code><code>byte</code> <code>c = (</code><code>byte</code><code>) (a+b); </code><code>//虽然a b都是byte类型,但是运算结果是int类型,需要进行强制转换</code>
<code> </code><code>int</code> <code>d = a+b;</code>
% 取余数,又叫取模
5除以2,余1
<code> </code><code>int</code> <code>i = </code><code>5</code><code>;</code>
<code> </code><code>int</code> <code>j = </code><code>2</code><code>;</code>
<code> </code><code>System.out.println(i%j); </code><code>//输出为1</code>
++
--
在原来的基础上增加1或者减少1
<code> </code><code>i++;</code>
<code> </code><code>System.out.println(i);</code><code>//输出为6</code>
以++为例
int i = 5;
i++; 先取值,再运算
++i; 先运算,再取值
<code> </code><code>System.out.println(i++); </code><code>//输出5</code>
<code> </code><code>System.out.println(i); </code><code>//输出6</code>
<code> </code><code>System.out.println(++j); </code><code>//输出6</code>
<code> </code><code>System.out.println(j); </code><code>//输出6</code>
关系操作符:比较两个变量之间的关系
> 大于
>= 大于或等于
< 小于
<= 小于或等于
== 是否相等
!= 是否不等
> 大于
>= 大于或等于
< 小于
<= 小于或等于
== 是否相等
!= 是否不等
<code> </code><code>int</code> <code>a = </code><code>5</code><code>;</code>
<code> </code><code>int</code> <code>b = </code><code>6</code><code>;</code>
<code> </code><code>int</code> <code>c = </code><code>5</code><code>;</code>
<code> </code><code>System.out.println(a>b); </code><code>//返回 false</code>
<code> </code><code>System.out.println(a>=c); </code><code>//返回 true</code>
<code> </code><code>System.out.println(a==b); </code><code>//返回false</code>
<code> </code><code>System.out.println(a!=b);</code><code>//返回true</code>
逻辑运算符
无论长路与还是短路与
两边的运算单元都是布尔值
都为真时,才为真
任意为假,就为假
区别
长路与 两侧,都会被运算
短路与 只要第一个是false,第二个就不进行运算了
<code> </code><code>//长路与 无论第一个表达式的值是true或者false,第二个的值,都会被运算</code>
<code> </code><code>int</code> <code>i = </code><code>2</code><code>;</code>
<code> </code><code>System.out.println( i== </code><code>1</code> <code>& i++ ==</code><code>2</code> <code>); </code><code>//无论如何i++都会被执行,所以i的值变成了3</code>
<code> </code><code>System.out.println(i);</code>
<code> </code><code>//短路与 只要第一个表达式的值是false的,第二个表达式的值,就不需要进行运算了</code>
<code> </code><code>System.out.println( j== </code><code>1</code> <code>&& j++ ==</code><code>2</code> <code>); </code><code>//因为j==1返回false,所以右边的j++就没有执行了,所以j的值,还是2</code>
<code> </code><code>System.out.println(j); </code>
无论长路或还是短路或
都为假时,才为假
任意为真,就为真
长路或 两侧都会被运算
短路或 只要第一个是true的,第二个就不进行运算了
<code> </code><code>//长路或 无论第一个表达式的值是true或者false,第二个的值,都会被运算</code>
<code> </code><code>System.out.println( i== </code><code>1</code> <code>| i++ ==</code><code>2</code> <code>); </code><code>//无论如何i++都会被执行,所以i的值变成了3</code>
<code> </code><code>//短路或 只要第一个表达式的值是true的,第二个表达式的值,就不需要进行运算了</code>
<code> </code><code>System.out.println( j== </code><code>2</code> <code>|| j++ ==</code><code>2</code> <code>); </code><code>//因为j==2返回true,所以右边的j++就没有执行了,所以j的值,还是2</code>
取反!
真变为假
假变为真
<code> </code><code>boolean</code> <code>b = </code><code>true</code><code>;</code>
<code> </code><code>System.out.println(b); </code><code>//输出true</code>
<code> </code><code>System.out.println(!b);</code><code>//输出false</code>
异或^
不同,返回真
相同,返回假
<code> </code><code>boolean</code> <code>a = </code><code>true</code><code>;</code>
<code> </code><code>boolean</code> <code>b = </code><code>false</code><code>;</code>
<code> </code><code>System.out.println(a^b); </code><code>//不同返回真</code>
<code> </code><code>System.out.println(a^!b); </code><code>//相同返回假</code>
位操作符在实际工作中用的并不常见,但是同学们总是很喜欢纠结这些位操作。
所以本章节会给出每一个操作符的操作实例帮助大家理解其具体含义。
最后说,如果确实感兴趣,就看看,个人建议跳过这个章节。 真正工作用到了,再来看。
位操作都是对二进制而言的,但是我们平常使用的都是十进制比如5。
而5的二进制是101。
所以在开始学习之前,需要掌握一个整数的二进制表达是多少。
通过Integer.toBinaryString() 方法,将一个十进制整数转换为一个二进制字符串
<code> </code><code>String b = (Integer.toBinaryString(i)); </code><code>// 5的二进制的表达101</code>
<code> </code><code>System.out.println(i+</code><code>" 的二进制表达是: "</code><code>+b);</code>
5的二进制是101
6的二进制是110
所以 5|6 对每一位进行或运算,得到 111->7
<code> </code><code>int</code> <code>i =</code><code>5</code><code>;</code>
<code> </code><code>int</code> <code>j = </code><code>6</code><code>;</code>
<code> </code><code>System.out.println(Integer.toBinaryString(i)); </code><code>//5的二进制是101</code>
<code> </code><code>System.out.println(Integer.toBinaryString(j)); </code><code>//6的二进制是110</code>
<code> </code><code>System.out.println(i|j); </code><code>//所以 5|6 对每一位进行或运算,得到 111->7</code>
所以 5&6 对每一位进行与运算,得到 100->4
<code> </code><code>System.out.println(i&j); </code><code>//所以 5&6 对每一位进行与运算,得到 100->4</code>
5的二进制是101
6的二进制是110
所以 5^6 对每一位进行异或运算,得到 011->3
一些特别情况:
任何数和自己进行异或 都等于 0
任何数和0 进行异或 都等于自己
<code> </code><code>System.out.println(Integer.toBinaryString(i)); </code><code>//5的二进制是 101</code>
<code> </code><code>System.out.println(i^j); </code><code>//所以 5^6 对每一位进行或运算,得到 011->3</code>
<code> </code><code>System.out.println(i^</code><code>0</code><code>);</code>
<code> </code><code>System.out.println(i^i);</code>
5 的二进制是 00000101
所以取反即为 11111010
这个二进制换算成十进制即为-6
<code> </code><code>byte</code> <code>i =</code><code>5</code><code>;</code>
<code> </code><code>System.out.println(Integer.toBinaryString(i)); </code><code>//5的二进制是00000101,所以取非即为11111010,即为-6</code>
<code> </code><code>System.out.println(~i);</code>
左移:根据一个整数的二进制表达,将其每一位都向左移动,最右边一位补0
右移:根据一个整数的二进制表达,将其每一位都向右移动
<code> </code><code>byte</code> <code>i =</code><code>6</code><code>;</code>
<code> </code><code>//6的二进制是110</code>
<code> </code><code>System.out.println(Integer.toBinaryString(i));</code>
<code> </code><code>//6向左移1位后,变成1100,对应的10进制是12</code>
<code> </code><code>System.out.println(i<<</code><code>1</code><code>);</code>
<code> </code><code>//6向右移1位后,变成11,对应的10进制是3</code>
<code> </code><code>System.out.println(i>></code><code>1</code><code>);</code>
带符号右移 >>
对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0
对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1无符号右移>>>
如果是一个负数,那么对应的二进制的第一位是1
无符号右移>>>会把第一位的1也向右移动,导致移动后,第一位变成0
这样就会使得负数在无符号右移后,得到一个正数简单的说:带符号右移 >> 移动后正的还是正的,负的还是负的,符号不变无符号右移>>>移动后,变正的了
<code> </code><code>int</code> <code>i =-</code><code>10</code><code>;</code>
<code> </code><code>//-10的二进制是11111111111111111111111111110110</code>
<code> </code><code>//第一位是1,即符号位,代表这是一个负数</code>
<code> </code><code>//对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0</code>
<code> </code><code>//对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1</code>
<code> </code><code>//-10带符号右移1位,移动后前面补齐1</code>
<code> </code><code>//得到11111111111111111111111111111011</code>
<code> </code><code>//因为第一位是1,所以依然是一个负数,对应的十进制是-5</code>
<code> </code><code>int</code> <code>j = i>></code><code>1</code><code>;</code>
<code> </code><code>System.out.println(Integer.toBinaryString(j));</code>
<code> </code><code>System.out.println(j);</code>
<code> </code><code>//-10无符号向右移1位,符号位也会向右移,第一位就变成了0</code>
<code> </code><code>//得到01111111111111111111111111111011,对应的十进制是2147483643</code>
<code> </code><code>int</code> <code>k = i>>></code><code>1</code><code>;</code>
<code> </code><code>System.out.println(Integer.toBinaryString(k)); </code>
<code> </code><code>System.out.println(k);</code>
赋值操作
赋值操作的操作顺序是从右到左
int i = 5+5;
首先进行5+5的运算,得到结果10,然后把10这个值,赋给i
<code> </code><code>int</code> <code>i = </code><code>5</code><code>+</code><code>5</code><code>;</code>
+=即自加
i+=2;
等同于
i=i+2;
其他的 -= , *= , /= , %= , &= , |= , ^= , >>= , >>>= 都是类似,不做赘述
<code> </code><code>int</code> <code>i =</code><code>3</code><code>;</code>
<code> </code><code>i+=</code><code>2</code><code>;</code>
<code> </code><code>int</code> <code>j=</code><code>3</code><code>;</code>
<code> </code><code>j=j+</code><code>2</code><code>;</code>
三元操作符
?:
表达式?值1:值2
如果表达式为真 返回值1
如果表达式为假 返回值2
关于if语句的详解讲解在后面章节
<code> </code><code>int</code> <code>k = i < j ? </code><code>99</code> <code>: </code><code>88</code><code>;</code>
<code> </code><code>// 相当于</code>
<code> </code><code>if</code> <code>(i < j) {</code>
<code> </code><code>k = </code><code>99</code><code>;</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>k = </code><code>88</code><code>;</code>
<code> </code><code>}</code>
截至目前为止,学习了使用System.out.println("") 向控制台输出数据。
在接下来的练习中,需要用到从控制台输入数据,所以需要用到Scanner类
注意: 使用Scanner类,需要在最前面加上
<code>import</code> <code>java.util.Scanner;</code>
表示导入这个类,才能够正常使用
<code> </code><code>Scanner s = </code><code>new</code> <code>Scanner(System.in);</code>
<code> </code><code>int</code> <code>a = s.nextInt();</code>
<code> </code><code>System.out.println(</code><code>"第一个整数:"</code><code>+a);</code>
<code> </code><code>int</code> <code>b = s.nextInt();</code>
<code> </code><code>System.out.println(</code><code>"第二个整数:"</code><code>+b);</code>
<code> </code><code>float</code> <code>a = s.nextFloat();</code>
<code> </code><code>System.out.println(</code><code>"读取的浮点数的值是:"</code><code>+a);</code>
<code> </code><code>String a = s.nextLine();</code>
<code> </code><code>System.out.println(</code><code>"读取的字符串是:"</code><code>+a);</code>
需要注意的是,如果在通过nextInt()读取了整数后,再接着读取字符串,读出来的是回车换行:"\r\n",因为nextInt仅仅读取数字信息,而不会读取回车换行"\r\n".
所以,如果在业务上需要读取了整数后,接着读取字符串,那么就应该连续执行两次nextLine(),第一次是取走回车换行,第二次才是读取真正的字符串
<code> </code><code>int</code> <code>i = s.nextInt();</code>
<code> </code><code>System.out.println(</code><code>"读取的整数是"</code><code>+ i);</code>
<code> </code><code>String rn = s.nextLine();</code>