引言:
我们小时候学习加减乘除的时候:
- 先算乘除,后算加减
- 从左往右依次计算
这个先算乘除,后算加减,就是一个优先级问题;从左往右依次计算,就是结合性问题,在同等优先级下,是从左往右运算的,就是说,加减乘除都是左结合的运算。
总的来说:优先级和结合性都是为了解决计算中的次序问题。
1.优先级表
优先级从上往下依次降低:
2. 结合性问题
- 右结合:赋值运算符、三目运算符、单目运算符
- 左结合:其他所有的都是左结合
- 左结合非常好理解,因为我们一直采用的运算都是自左往右运算,这三个右结合的是新鲜玩意儿,赋值运算符又常用,我举两个代码例子帮助理解:
// 结合性问题
// 三目运算 ?:
int a = 3;
int b = 2;
int c = 1;
int result = a > b ? a : b > c ? b : c;
//如果是左结合:
// a > b ? a : b 先计算,得到结果是a
// a > c ? b : c 后计算,得到结果是b
// result = b = 2
// 如果是右结合:
// b > c ? b : c 先计算,得到结果是b
// a > b ? a : b 后计算,得到结果是a
// result = a =3
System.out.println("result=" + result);//结果是3,证明三目运算符是右结合的,即从右向左运算
//单目运算符 ++ -- ~ ! (type) sizeof
/**********************这个例子不合法*******************************/
/* int single = 2;
int re = ++single--;//结果这条语句根本就是不合法的,一个变量只能有一个单目运算符
*/
int single = 2;
int re = ~ single ++;
//左结合的话:
// ~ single 先计算,得到结果是-3;single=2
// re = -3++后计算,得到结果是re=-3;single=3;
//右结合的话:
//temp=single;single=single+1; 其结果temp=2;single=3
//re = ~ temp;~00000010得到11111101(补码),11111100(反码),10000011(原码),即 re = -3
System.out.println("re=" + re);//re =-3
System.out.println("single=" + single);//single=-3
/**
* 我一开始计算错了,
* 以上举例不能体现单目运算符的右结合性,但是对于理解"后加加"赋值的过程很有帮助
* 重新设计一个例子
*/
int behind = 2;
int sinOperator = 2;
// int reOperator = sinOperator+++++behind;//这样是不合法的,我太难了
int reOperator = sinOperator+++(++behind);//这样可以编译
// reOperator = (++behind)--;//这也是不合法的
System.out.println("reOperator=" + reOperator);//输出5
System.out.println("sinOperator=" + sinOperator);//输出3
/**
* 举例失败,放弃治疗,单目运算符右结合性的例子谁举得出来我给跪
*/