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

Java运算符:优先级与结合性解析
本文探讨了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

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

Verilog中运算符优先级决定了在表达式中多个运算符执行的顺序。优先级从高到低大致如下: ### 一元运算符 一元运算符具有最高的优先级,包括正负号(`+`, `-`)按位取反(`~`)[^3]。 ### 算术运算符 算术运算符优先级次之,包括乘法(`*`)、除法(`/`)取模(`%`)运算符。接下来是加法(`+`)减法(`-`)运算符[^2]。 ### 移位运算符 移位运算符包括左移(`<<`)右移(`>>`)运算符[^2]。 ### 关系运算符 关系运算符用于比较操作,包括小于(`<`)、小于等于(`<=`)、大于(`>`)大于等于(`>=`)运算符[^3]。 ### 相等运算符 相等运算符包括逻辑相等(`==`)不等(`!=`)运算符[^2]。 ### 归约运算符 归约运算符包括归约(`&`)、归约或(`|`)、归约异或(`^`)等运算符[^3]。 ### 逻辑运算符 逻辑运算符包括逻辑(`&&`)逻辑或(`||`)运算符。 ### 条件运算符 条件运算符(`?:`)是三目运算符,具有较低的优先级。 ### 位拼接运算符 位拼接运算符(`{}`)具有最低的优先级,用于将多个位拼接在一起。 #### 易混淆点对比 - `&` 可以作为归约运算符(对一个操作数的所有位求)或位运算符(按位)。 - `~` 是按位取反运算符,而 `!` 是逻辑非运算符[^3]。 ```verilog // 示例代码 module operator_precedence; initial begin // 一元运算符 $display("Unary operators: %b", ~4'b1010); // 按位取反 // 算术运算符 $display("Arithmetic operators: %d", 10 + 5 * 2); // 先乘后加 // 移位运算符 $display("Shift operators: %b", 4'b0011 << 2); // 左移 // 关系运算符 $display("Relational operators: %b", 5 > 3); // 大于 // 相等运算符 $display("Equality operators: %b", 5 == 5); // 相等 // 归约运算符 $display("Reduction operators: %b", &4'b1111); // 归约 // 逻辑运算符 $display("Logical operators: %b", 1 && 0); // 逻辑 // 条件运算符 $display("Conditional operator: %d", (5 > 3) ? 1 : 0); // 三目运算符 // 位拼接运算符 $display("Concatenation operator: %b", {2'b10, 2'b01}); // 位拼接 end endmodule ```
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值