基本运算符的运算规则(  +,-,*,/,%,++,--)

本文详细介绍了Java中各种基本运算符的工作原理及使用方法,包括算术运算符(如+、-、*、/、%)、自增自减运算符(如++、--),以及特殊情况下不同类型数据间的转换规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运算符:

两原一封:
    两个原则:
    1)、不同类型的数据做运算时,一定会先转换成较大范围类型后再运算。
    2)、byteshortchar这些类型运算时,一定会先转成int类型再运算,结果int类型,两个float类型的值进行计算不会变成double。
    封: byteshortcharintlong有封闭式运算。

  算术运算符:+-*/%++--   

/:
           情况1:参与的类型都是整型时,做取整运算, 即 商n余m, 结果为n。例如:2/3----商0余2。结果为0。
           情况2:只要有一个浮点数参与,就会做类似精确运算

%:取余运算符号,也叫取模运算符号。
           做除法运算时,商n余m,结果为m(取余结果的符号与百分号前的符号一致)。
           情况1:参与运算都是整数时,余数是精确值。
           情况2: 有浮点数参与时,余数不一定是精确值

++/--:是自增自减运算符,符号要与变量一起使用。 表示变量自动+1,或自动-1。自增/自减运算与其他符号连用时, 需要考虑表达式的值。 ++a/a++/--a/a--整体看成表达式。

例子1:
int a = 1;
a = ++a;//a=2
例子2:
int a=1;
int b=2;
//      2  -   1   +  1  +  2
int c= ++a - --b  +  b++ +  a--;//c=4

 

这是一个经典的“表达式求值”问题,涉及栈的数据结构和基本语法解析技术。以下是关于此题目的分析及解法: ### 题目解析 #### 核心目标: 给定一个由整数、四则运算符(`+`, `-`, `*`, `/`)、小括号构成的数学表达式,判断该表达式的合法性,并对其进行求值。 #### 输入要求: 1. 运算数只能是整数; 2. 支持加减乘除以及括号操作; 3. 输出需保留两位小数; 4. 括号匹配合法;无连续运算符等非法情况; 5. 空白字符需要忽略; #### 输出要求: - 如果表达式非法,则返回 "Wrong Format"; - 如果出现异常(如除零错误),则返回 "NaN"; - 否则,按浮点规则计算结果并输出,保留两位小数。 --- ### 解决思路 **步骤一:检查输入格式** 1. 去掉所有空白字符; 2. 判断是否存在无效符号或不正确的序列(如两个连续运算符 "--", "**" 或者 "+*"); 3. 检查括号是否平衡。 **步骤二:构建辅助工具——双栈模型** - **数字栈 (numStack)** 存储待计算的操作数; - **运算符(opStack)** 存储等待处理的操作符。 通过遍历整个字符串的方式完成对表达式的分解与逐步计算: 1. 当遇到数字时直接压入数字栈; 2. 当遇到左括号 '(' 时将其压入运算符栈; 3. 当遇到右括号 ')' 时弹出直到找到对应的左括号为止,并将其中间的部分计算完毕; 4. 对于普通运算符 (+, -, *, /),比较优先级,如果当前操作符比栈顶优先级高就直接加入到 opStack 中,否则先处理之前的更高优先级运算再放入新运算符。 **注意特殊情况处理:** - 若碰到 '/' 要额外考虑分母不能为0 的情形; - 整形转成浮点形来进行精度保持最后按照需求截取至所需位数。 --- ### 示例代码实现(Python) ```python import re def evaluate_expression(expr): # 清理空格 并检测初步合法性 expr = ''.join(expr.split()) if not re.match(r'^[\d+\-*/().]+$', expr): return 'Wrong Format' def precedence(op): if op in ('+', '-'): return 1 elif op in ('*', '/'): return 2 else: return 0 def apply_op(a, b, op): a,b=float(a),float(b) if op == '+': return a+b elif op == '-':return a-b elif op=='*' : return a*b elif op =='/': if b==0: raise ZeroDivisionError() return a/b num_stack=[] op_stack=[] i=0 while(i<len(expr)): c=expr[i] if(c.isdigit()): j=i while(j < len(expr) and expr[j].isdigit()):j+=1 num_stack.append(int(expr[i:j])) i=j elif c == '(' : op_stack.append('(') i +=1 elif c == ')': while(len(op_stack)!=0 and op_stack[-1]!='(' ): val2=num_stack.pop() val1=num_stack.pop() op=op_stack.pop() res=apply_op(val1,val2 ,op ) num_stack.append(res) if( len(op_stack)==0 or op_stack.pop()!='(' ): return 'Wrong Format' i+=1 else:# it's an operator while( len(op_stack)>0 and precedence(op_stack[-1])>=precedence(c) ) : val2=num_stack.pop() val1=num_stack.pop() op=op_stack.pop() try: res=apply_op(val1,val2 ,op ) num_stack.append(res) except ZeroDivisionError: return '= NaN' op_stack.append(c);i+=1 while len(op_stack)>0: val2=num_stack.pop() val1=num_stack.pop() op=op_stack.pop() try: res=apply_op(val1,val2 ,op ) num_stack.append(res) except ZeroDivisionError: return '= NaN' result=format(num_stack[0],'.2f') return f'= {result}' # 测试示例 input_expr="2+3*(5 -6 / 4)/3 +26-300*3/29" print(f"{input_expr}{evaluate_expression(input_expr)}") ``` --- ### §: 1. 怎样改进上述算法使其可以支持更复杂的函数运算比如 sin(x)? 2. 在 Python 中还有哪些库可以直接帮助我们简化类似的任务? 3. 是否可以用递归的方式来代替双栈解决这个问题?如果有,请简述一下流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值