Java学习篇【四、操作符与流程控制】

1、操作符

我们知道了程序用变量来表示数据,而操作符,顾名思义,就是来操作数据。在由操作符和数据所构成的表达式,被操纵的数据也被称为数据元。

优先级 操作符分类 操作符
由高到低 一元操作符 ! ++ – - ~
算术操作符、位操作符 * / % + - >> << >>>
比较操作符 > < >= <= != ==
逻辑操作符 && || % | ^
三元操作符 布尔表达式 ? 表达式1: 表达式2
赋值操作符 = *= += -= /= %=

1.1 算术操作符

Java的算数操作符与其它大多数程序设计语言都是相同的,其中包括加(+)、减(-)、乘(×)、除(÷)以及取模(%)。

假设:整数变量A的值为10,变量B的值为20,如下表:

操作符 描述 例子
+ 加法 - 相加运算符两侧的值 A + B 等于 30
- 减法 - 左操作数减去右操作数 A – B 等于 -10
* 乘法 - 相乘操作符两侧的值 A * B等于200
/ 除法 - 左操作数除以右操作数 B / A等于2
% 取余 - 左操作数除以右操作数的余数 B%A等于0
++ 自增: 操作数的值增加1 B++ 或 ++B 等于 21
自减: 操作数的值减少1 B-- 或 --B 等于 19

注:

  1. 前缀自增自减法(++a,–a): 先进行自增或者自减运算,再进行表达式运算;
  2. 后缀自增自减法(a++,a–): 先进行表达式运算,再进行自增或者自减运算;

1.2 比较运算符

假设:整数变量A的值为10,变量B的值为20

操作符 描述 例子
== 检查如果两个操作数的值是否相等,如果相等则条件为真。 (A == B)为假。
!= 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 (A != B) 为真。
> 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 (A> B)为假。
< 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 (A <B)为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 (A> = B)为假。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 (A <= B)为真。

1.3 位运算符

假设:整数变量A的值为60,变量B的值为13

操作符 描述 例子
如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100
| 如果相对应位都是0,则结果为0,否则为1 (A | B)得到61,即 0011 1101
^ 如果相对应位值相同,则结果为0,否则为1 (A ^ B)得到49,即 0011 0001
~ 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 (~A)得到-61,即1100 0011
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
>> 按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111

1.4 逻辑运算符

假设:布尔变量A为真,变量B为假

操作符 描述 例子
&& 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 (A && B)为假。
| | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 (A | | B)为真。
称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 !(A && B)为真。

补充:
逻辑运算符包含短路逻辑运算,即左边条件如果成立,则表示该语句条件“成立”,不继续执行后续判断。

1.5 三元运算符

三元运算符,又称条件运算符。

格式如下:

# ?前为表达式,如果表达式返回结果为true,则x赋值为:前的值,false则x赋值为:后的值
variable x = (expression) ? value if true : value if false

# eg

int age = 23;

String name = (age == 23) ? "bboyhan": "BBOYHAN";

System.out.println(name);

1.6 运算转换

Java规定,在执行数据的操作运算,必须是同一数据类型。如整型只能和整型进行+操作,我们知道了Java的8大基本数据类型定义了不同数值范围的数据。Java定义了若干使用于表达式的类型提升规则。

  1. byte、short、char类型的数据在进行运算时将自动转化为int类型;
  2. 如果其中一个操作数是float类型,另一个将转换为float类型;
  3. 如果其中一个操作数是long类型,另一个将转换为long类型;
  4. boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换),否则,将编译出错。

在运算过程中,由低字节向高字节自动转换(正向过程),Java会自行处理。

类型转换

但由高字节需要向低字节转换(逆向过程),需要使用强制转换(可能丢失精度)。需要注意的一点是:在强制类型转换中目标类型和源类型变量的类型始终没有发生改变。

int a=(int)3.14;

提问:float类型能否与long类型进行自动转换?

答:能,float能表示的数的范围比long大,一个long型数可以转为float型。

  1. long类型,取值范围是-2^63 --> 2^63-1(-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807)
  2. float类型,取值范围是2^(-149) --> (2-2(-23))*2127,也就是Float.MIN_VALUE和Float.MAX_VALUE

任何一个long类型的数字都可以使用float类型的表示方法来表示。但是,由于float有精度限制,所以在转换的过程中有可能丢失精度

float内存存储原理

在IEEE标准754中,float浮点数分为三部分组成:

  1. 符号位(S),0表示正数,1表示负数。翻转该位的值会翻转该数字的符号。
  2. 指数位(E),指数字段需要表示正指数和负指数。
  3. 尾部(F),也被称为有效数,代表数字的精度的位。
Sign Exponent Fraction
单精度,Single Precision 1 [31] 8 [30–23] [22–00]
双精度,Double Precision 1 [63] 11 [62–52] 52 [51–00]

Laid out as bits, floating point numbers look like this:

Single: SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF

Double: SEEEEEEE EEEEFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF

2、流程控制

现实生活中,不论是日常事务还是生产工序,都会按照特定的流程进行运转。在Java当中,同样地可以通过特定的语句进行相应的流程控制。

2.1 分支语句

(一)if else

if…else…语句,布尔表达式的值为true时,执行if代码块,为false时,执行else代码块。

if(布尔表达式){
    //...
}else{
    //...
}
int x = 1;
if(x == 1){
    System.out.println("x 等于 1,执行这句")
}else{
    System.out.println("x 不等于 1,执行这句")
}

多个条件的情况,可以在中间插入 else if(布尔表达式)。

int x = 1;
if(x < 1){
    System.out.println("x 小于 1,执行这句")
}else if (x == 1){
    System.out.println("x 等于 1,执行这句")
}else{
    System.out.println("否则,执行这句")
}

(二)switch

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。

switch(expression){
    case value :
       //代码
       break; //可选,不写相当于会继续执行下方的case判断
    case value :
       //代码
       break; //可选
    //你可以有任意数量的case语句
    default : //可选
       //...
}
int age = 23;

switch(age){
    case 18 :
       System.out.println("age 等于 18,执行,有break,结束")
       break;
    case 23 :
       System.out.println("age 等于 23,执行")
       //break; //没break,继续往下执行 
    default : 
       System.out.println("其它情况,执行")
}

switch 语句中的变量类型可以是: byte、short、int、char、String、Enum类型,同时 case 标签必须为字符串常量或字面量。

2.2 循环语句

(一)while、do…while

while( 布尔表达式 ) {
    //...
}

# eg

int x = 10;
while( x < 20 ) {
    System.out.print("value of x : " + x );
    x++;
    System.out.print("\n");
}
do {
    //...
}while( 布尔表达式 );

# eg

int x = 10;
 
do{
    System.out.print("value of x : " + x );
    x++;
    System.out.print("\n");
}while( x < 20 );

(二)for

形式一:

for(初始化; 布尔表达式; 更新) {
    //...
}

# eg

int[] intList = {1, 2, 3, 4};

//遍历
for (int j = 0; j < intList.length; j++) {
    int i = intList[j];
    System.out.println(i);
}

形式二:

# for (循环变量类型 循环变量名称 : 要被遍历的对象)  循环体

/* 建立一个数组 */
int[] intList = {1, 2, 3, 4};

/* 开始遍历 */
for (int i : intList) {
    System.out.println(i);
}
 

2.3 流程跳转

语句 说明
break 终止循环
continue 跳过本次(当前)循环
return 退出本方法,跳至上层调用方法
# eg

int[] intList = {1, 2, 3, 4};

//遍历
for (int j = 0; j < intList.length; j++) {
    int i = intList[j];
    if(i == 1){
        continue; //跳出本次循环,不打印1
    }
    System.out.println(i);
}
# eg

int[] intList = {1, 2, 3, 4};

//遍历
for (int j = 0; j < intList.length; j++) {
    int i = intList[j];
    if(i == 2){
        break; //终止循环,不再执行
    }
    System.out.println(i);
}

# 扩展

int[] intList = {1, 2, 3, 4};

//遍历
A:for (int j = 0; j < intList.length; j++) {
    int i = intList[j];
    if(i == 2){
        break A; //跳至A,A可任意命名
    }
    System.out.println(i);
}
发布了77 篇原创文章 · 获赞 123 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/han0373/article/details/89841555