java中运算符的优先级和结合性问题

引言:

我们小时候学习加减乘除的时候:

  • 先算乘除,后算加减
  • 从左往右依次计算

这个先算乘除,后算加减,就是一个优先级问题;从左往右依次计算,就是结合性问题,在同等优先级下,是从左往右运算的,就是说,加减乘除都是左结合的运算。
总的来说:优先级和结合性都是为了解决计算中的次序问题。

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

		/**
		 * 举例失败,放弃治疗,单目运算符右结合性的例子谁举得出来我给跪
		 */

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值