活动地址:CSDN21天学习挑战赛
运算符是一种特殊符号,用来表示数据的运算、赋值、关系等;
一、算术运算符
优先级 | 运算符 | 名称 | 功能 |
4 | +,- | 加、减 | 加减法运算 |
3 | *,\ | 乘、除 | 乘除法运算 |
3 | % | 取模(取余) | 相除取余数(必须是整数) |
1(除括号外最高) | ++,-- | 自加自减(前) | 先++,后参与运算 |
++,-- | 自加自减(后) | 先参与运算,后++ |
注:作为单目运算符,自增自减的优先级极高,在所有运算符中仅次于分隔符和括号;但由于自增自减(后)是要在所有运算(赋值以前)结束后才会进行运算,所以我们可以认为它的优先级排序为无限大,即运算中永不计算。
曾经的我是这么想的,但后来我发现,运算的优先级并非是运算的先后顺序,而是与变量或常量的结合力,自增自减(后)的运算虽然相对靠后,但它与变量的结合力强,所以优先级依然很高。
1、+、-、*的运算与加法无异
2、/的使用:由于java中存在着整数与浮点数的区分,所以除法可能会存在10÷4=2······2(余数被舍弃)。
(1)、int a = 10 / 4; ==> a = 2
原因:整数除不尽
(2)、double a = 10 / 4;==> a = 2.0
原因:10/4是整数运算,由于除法优先级高于赋值语句,所以10/4先运算,得到一个整型的“2”,整型的2赋值给双精度浮点型的“a”。
public static void main(String[] arg){
//“/”的使用
int a = 10 / 4; //整数的除法,
System.out.println(a);
double d1 = 10 / 4; //整数除法赋值给浮点型变量
System.out.println(d1);
}
2
2.0
3、取模(取余数): a % b == a - (int)a / b * b.
a % b = c | a > 0 | a < 0 |
b > 0 | c > 0 | c < 0 |
b < 0 | c > 0 | c < 0 |
模运算不止可以在整数中进行,即a%b(a可以是小数)
4、自增自减:
(1)自增在前:先自增,再运算;
(2)自增在后:先运算,后自增;
(3)i = i++; ==>temp = i; i++; i =temp即运算过程中:i++ == i; ++i == i +1;
int i1=1,i2=1;
System.out.println(++i1); //先自增,再参与语句的运算
System.out.println(i2++); //先参与语句的运算,结束后再运算
System.out.println(i1);
System.out.println(i2);
//但无论如何,在最后都会进行自增运算。
int i3 = 1;
i3 = i3++; //先将i赋值给一个临时变量temp,i++,将临时变量temp的值重新赋给i
System.out.println(i3);
i3 = ++i3; //先i++,再将i赋值给一个临时变量temp,将临时变量temp的值重新赋给i
System.out.println(i3);
2
1
2
2
1
2
5、练习:
* 题目一:
59天合多少星期零几天?
* 题目二:将华氏温度(235℉)转换成摄氏温度注:转换公式 摄氏度 = 5 / 9 * (华氏温度 - 100)
/* 题目一:
* 59天合多少星期零几天?
* 题目二:
* 将华氏温度(235℉)转换成摄氏温度
* 注:转换公式 摄氏度 = 5 / 9 * (华氏温度 - 100)
*/
/*
* 需求分析:
* 题目一:59天合多少星期多少天==》59 / 7 == x………y;
* 其中x = 59 / 7; y = 59 % 7;其中x,y必须是整数;
* 题目二:转换公式为5/9*(华氏温度-100)
* 其中摄氏温度和华氏温度都为double类型变量,
* 5和9也需要为double类型,所以需要用他们的浮点形式:5.0和9.0
* 若还想继续用5和9,则需要写成(华-100)*5/9,即阻止这两个数间的运算。
*/
public class examine2 {
public static void main(String[] arg){
int week = 59 / 7;
int day = 59 % 7;
System.out.println("59天合"+week+"星期又"+day+"天");
double c = 0,f = 235;
c = 5.0 / 9.0 * (f - 100);
System.out.println(c);
}
}
二、关系运算符
优先级 | 关系运算符 | 意义 | 运算结果 |
8 | == | 等于 | 关系运算符的运算结果只有两个false和true,满足条件为true,不满足条件为false.所以结果只能赋值给boolean |
8 | != | 不等于 | |
7 | > | 大于 | |
7 | < | 小于 | |
7 | >= | 大于等于 | |
7 | <= | 小于等于 |
1、关系运算符常用于条件语句 if 等。
2、关系表达式:关系运算符和变量组成的表达式
public static void main(String[] arg){
int i1 = 1,i2 = 2;
System.out.println(i1==i2);
}
false
三、逻辑运算符
优先级 | 9 | 9.2 | 9.1 | 10 | 10.1 | ! | ||
名称 | 逻辑与 | 逻辑或 | 逻辑异或 | 短路与 | 短路或 | 取反 | ||
作用 | a且b | a或b | ab不同 | a且b | a或b | a取反值 | ||
表达式 | a | b | a&b | a|b | a^b | a&&b | a||b | !a |
结果 | T | T | T | T | F | T | T | F |
T | F | F | T | T | F | T | F | |
F | T | F | T | T | F | T | T | |
F | F | F | F | F | F | F | T |
1、短路与和短路或:
短路与&&、短路或||与&、|从结果上看是一样的,但对于短路与&&,若判断玩第一个条件后发现为false,则不再判断第二个条件,直接输出false;对于短路或||,若判断第一个条件后发现为true,则不再判断第二个条件,直接输出true。
短路与、短路或的效率比之与或的效率更高。
public static void main(string[] args){
system.out.printIn(5>3 & 5>2) \\结果为true
system.out.printIn(5>3 & 5>6) \\false
system.out.printIn(5>3 | 5>6) \\true
system.out.printIn(!false) \\true
system.out.printIn(!true) \\false
system.out.printIn(true ^ false) \\true
system.out.printIn(true ^ true) \\flase
system.out.printIn(false^ false) \\flase
}
总结:运算符中最困惑的部分还是自增自减,处于一种懂了但没有完全懂得状态。