<zz>运算符优先级

http://blog.youkuaiyun.com/Mailbomb/archive/2008/06/02/2502933.aspx

说明:
1、 该表中优先级按照从高到低的顺序书写,也就是优先级为1的优先级最高,优先级14的优先级最低。
2、 结合性是指运算符结合的顺序,通常都是从左到右。从右向左的运算符最典型的就是负号,例如3+-4,则意义为3加-4,符号首先和运算符右侧的内容结合。
3、 instanceof作用是判断对象是否为某个类或接口类型,后续有详细介绍。
4、 注意区分正负号和加减号,以及按位与和逻辑与的区别
其实在实际的开发中,不需要去记忆运算符的优先级别,也不要刻意的使用运算符的优先级别,对于不清楚优先级的地方使用小括号去进行替代,示例代码:
int m = 12;
int n = m << 1 + 2;
int n = m << (1 + 2); //这样更直观
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; struct ill{ int l,r,mi; bool no; }h[50001]; char a[100001]; int l,g; int work(int s) { int i; h[++g].l=s; h[g].mi=5; int x=g; for(i=s+1;i<=l;i++) { if(a[i]=='(')i=work(i)+1; if(a[i]==')'){h[x].r=i;return i;} if(a[i]=='+')h[x].mi=min(h[x].mi,1); if(a[i]=='-')h[x].mi=min(h[x].mi,2); if(a[i]=='*')h[x].mi=min(h[x].mi,3); if(a[i]=='/')h[x].mi=min(h[x].mi,4); } h[x].r=l; return i; } int main() { scanf("%s",a+1); l=strlen(a+1); int i=work(0); printf("%d\n",i); for(i=2;i<=g;i++) { int x=h[i].l-1,y=h[i].r+1; int xma=0,yma=0; if(a[x]=='+')xma=max(xma,1); if(a[x]=='-')xma=max(xma,2); if(a[x]=='*')xma=max(xma,3); if(a[x]=='/')xma=max(xma,4); if(a[y]=='+')yma=max(yma,1); if(a[y]=='-')yma=max(yma,2); if(a[y]=='*')yma=max(yma,3); if(a[y]=='/')yma=max(yma,4); if(yma<=h[i].mi) { if((xma==2||xma==4)&&xma<h[i].mi) h[i].no=1; if((xma==1||xma==3||xma==0)&&xma<=h[i].mi) h[i].no=1; } } for(i=2;i<=g;i++) if(h[i].no) a[h[i].l]=a[h[i].r]=0; printf("...\n"); for(i=1;i<=l;i++) if(a[i]) printf("%c",a[i]); } ``````cpp#include<bits/stdc++.h> using namespace std; const int N=1e5+5; int n; char s[N]; struct node{ int x,y,z; bool flag; }; node a[N]; int t; bool vis[N]; int dfs(int zz){ a[++t].x=zz; a[t].z=5; int x=t; int i; for(i=zz+1; i<=n; i++){ if(s[i]=='('){ i=dfs(i)+1; } else if(s[i]==')'){ a[x].y=i; return i; } else if(s[i]=='+'){ a[x].z=min(a[x].z,1); } else if(s[i]=='-'){ a[x].z=min(a[x].z,2); } else if(s[i]=='*'){ a[x].z=min(a[x].z,3); } else if(s[i]=='/'){ a[x].z=min(a[x].z,4); } } a[x].y=n; return i; } int main(){ scanf("%s",s+1); n=strlen(s+1); int ttt=dfs(0); printf("%d\n",ttt); for(int i=2; i<=t; i++){ int x=a[i].x-1; int y=a[i].y+1; printf("%d %d\n",a[i].x,a[i].y); int orz1=0,orz2=0; if(s[x]=='+'){ orz1=max(orz1,1); } if(s[x]=='-'){ orz1=max(orz1,2); } if(s[x]=='*'){ orz1=max(orz1,3); } if(s[x]=='/'){ orz1=max(orz1,4); } if(s[y]=='+'){ orz2=max(orz2,1); } if(s[y]=='-'){ orz2=max(orz2,2); } if(s[y]=='*'){ orz2=max(orz2,3); } if(s[y]=='/'){ orz2=max(orz2,4); } if(orz2<=a[i].z){ if((orz1==1||orz1==3||orz1==0)&&orz1<=a[i].z){ a[i].flag=true; } if((orz1==2||orz1==4)&&orz1<a[i].z){ a[i].flag=true; } } } for(int i=2; i<=t; i++){ if(a[i].flag==true){ vis[a[i].x]=true; vis[a[i].y]=true; } } for(int i=1; i<=n; i++){ if(vis[i]==false){ cout <<s[i]; } } return 0; } ```第二份哪里错了两段具体的 C++ 代码(除了变量名)
09-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值