char型与int型之间算术运算问题

4个回答

unsigend char表示0到255的数，7.4.1.254这里1-3=254.再次到这里应该是8.5.2.255最后才能循环到0，一共循环次数（256*2+7）/3次，所以结果为173

ascii码直接对应

i=7,4,1,126(-2),123,120,...,0

C++利用堆栈实现算术表达式的求值，能够处理单目运算符，VS2017,程序异常就终止了，求教
# **stack.h** ``` #ifndef STACK #define STACK #include "stdafx.h" #include <cstdlib> typedef struct stack { double data; struct stack *next; }stack; stack *init_stack() { stack *top; top = (stack*)malloc(sizeof(stack)); top->next = NULL; return top; } int isEmpty(stack *top) { if (top->next = NULL) return 1; else return 0; } float push(stack *top, float x) { stack *p; p = (stack*)malloc(sizeof(stack)); if (p == NULL) return -1; p->data = x; p->next = top->next; top->next = p; return 0; } float pop(stack *top, float *x) { stack *p; if (top->next == NULL) return -1; p = top->next; *x = p->data; top->next = p->next; free(p); return 0; } float getTop(stack *top) { float *x = NULL; if (top->next == NULL) return -1; *x = top->next->data; return *x; } #endif // !STACK ``` ****## 算术表达式求值.cpp**** #include "stdafx.h" #include <stdlib.h> #include <ctype.h> #include "stack2.h" #include <iostream> using namespace std; class Calculator { private: stack *opnd; stack *optr; public: Calculator(); virtual ~Calculator(); int getnext(int *n); int getIndex(char a); char operPrior(char a, char b); float operation(float a, float operate, float b); float evaluateEpression(); }; Calculator::Calculator() { opnd = init_stack(); optr = init_stack(); } Calculator::~Calculator() { ; } int Calculator::getnext(int *n) { char c; *n = 0; while ((c = getchar()) == ' '); if ((!isdigit(c)) && (c != '+' || c != '-' || c != '*' || c != '/' || c != '(' || c != ')' || c != '=')) { throw ("表达式出错！"); } else { push(optr, c); *n = c; return 1; } do { *n = *n * 10 + (c - '0'); c = getchar(); } while(isdigit(c)); cin.putback(c); return 0; } int Calculator::getIndex(char a) { int i; switch (a) { case '+': i = 0; break; case '-': i = 1; break; case '*': i = 2; break; case '/': i = 3; break; case '(': i = 4; break; case ')': i = 5; break; case '=': i = 6; break; default: break; } return i; } char Calculator::operPrior(char a, char b) { int i = getIndex(a); int j = getIndex(b); char pre[7][7] = { { '>','>','<','<','<','>','>' }, { '>','>','<','<','<','>','>' }, { '>','>','>','>','<','>','>' }, { '>','>','>','>','<','>','>' }, { '<','<','<','<','<','=','0' }, { '>','>','>','>','0','>','>' }, { '<','<','<','<','<','0','=' } }; return pre[i][j]; } float Calculator::operation(float a, float operate, float b) { float result = 0.0; switch ((int)operate) { case '+': result = a + b; break; case '-': result = a - b; break; case'*': result = a * b; break; case '/': result = a / b; break; default: break; } return result; } float Calculator::evaluateEpression() { int flag = 0; char priorChar; int ch; float *x = NULL; char prior; float left, right; float operate; float *top; push(optr, '='); priorChar = '='; flag = getnext(&ch); while (getTop(optr) != '=' || ch != '=') { if (!flag) { push(opnd, ch); priorChar = '0'; flag = getnext(&ch); } else { priorChar = ch; if ((priorChar == '=' || priorChar == '(') && (ch == '+' || ch == '-')) { push(opnd, 0); priorChar = '0'; } prior = operPrior(getTop(optr), ch); switch (prior) { case '<': push(optr, ch); flag = getnext(&ch); break; case '>': if (isEmpty(opnd)) throw ("表达式出错！"); pop(opnd, &right); if (isEmpty(opnd)) throw ("表达式出错！"); pop(opnd, &left); pop(optr, &operate); push(opnd, operation(left, operate, right)); flag = getnext(&ch); break; case '=': pop(optr, &operate); flag = getnext(&ch); break; case '0': throw ("表达式出错！"); break; default: break; } } } pop(opnd, x); return *x; } int main() { Calculator calcuExpression; float result = 0.0; result = calcuExpression.evaluateEpression(); cout << result << endl; return 0; }
VC6.0 小学生四则运算

C语言 为何总是提示“栈下溢”？

#include<iostream> #include<cmath> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define OVERFLOW -1 using namespace std; typedef struct { int *base; int *top; int stacksize; }SqStack; int InitStack(SqStack &S) { S.base=(int *)malloc(STACK_INIT_SIZE * sizeof(int)); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } int ClearStack(SqStack &S) { S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } int GetTop(SqStack S,int &e) { if(S.base==S.top) return ERROR; e=*(S.top-1); return OK; } int Push(SqStack &S,int e) { if((S.top-S.base)>=S.stacksize) { S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top=e; S.top++; return OK; } int Pop(SqStack &S,int &e) { if(S.top==S.base) return ERROR; S.top--; e=*S.top; return OK; } int Pop2(SqStack &S,char &e) { if(S.top==S.base) return ERROR; S.top--; e=*S.top; return OK; } bool StackEmpty(SqStack S) { if(S.top==S.base) return true; else return false; } int StackLength(SqStack S) { int len=0; if(S.top==S.base) return 0; else while(S.top!=S.base) { S.top--; len++; } return len; } //数制转换:输入任意一个非负十进制整数，打印输出与其等值的进制数 void conversion(SqStack S) { int N,id,n; cout<<"请输入任意一个非负十进制整数："; cin>>N; cout<<"请输入需要转换的进制 ："; cin>>id; n=N; while(N) { Push(S,N%id); N=N/id; } cout<<"此时栈的长度为"<<StackLength(S)<<endl; cout<<"十进制数"<<n<<"对应的"<<id<<"进制数为"; while(S.top!=S.base) { S.top--; cout<<*S.top; } cout<<endl; cout<<"此时栈的长度为"<<StackLength(S)<<endl; } //括号匹配的检验 int match(SqStack S) { char a[100],b[100]; cout<<"请输入一串由圆括号和方括号组成的表达式："; cin>>a; for(int i=0;i<strlen(a);i++) { cout<<"i="<<i<<endl; if((a[i]!='[') && (a[i]!=']') && (a[i]!='(') && (a[i]!=')')) { cout<<"输入字符不正确！！！"; return 0; } else { if((a[i]=='[')||(a[i]=='(')) { Push(S,a[i]); cout<<"此时栈的长度为"<<StackLength(S)<<endl; } else if(a[i]==']') { if(S.top==S.base) { cout<<"括号不匹配！"; return 0; } else { S.top--; if(*S.top=='[') { b[i]=*S.top; cout<<"此时栈的长度为"<<StackLength(S)<<endl; cout<<"b["<<i<<"]="<<b[i]<<endl; } else { cout<<"括号不匹配！"; return 0; } } } else { if(a[i]==')') { if(S.top==S.base) { cout<<"括号不匹配！"; return 0; } else { S.top--; if(*S.top=='(') { b[i]=*S.top; cout<<"此时栈的长度为"<<StackLength(S)<<endl; cout<<"b["<<i<<"]="<<b[i]<<endl; } else { cout<<"括号不匹配！"; return 0; } } } } } } cout<<"匹配成功！"<<endl; return 1; } //行编辑程序 void LineEdit(SqStack S) { char a[100],b[100]; int *base=S.base; cout<<"请输入数据："; cin>>a; for(int i=0;i<strlen(a);i++) { while(a[i]!=EOF && a[i]!='\n') { if(a[i]=='#') //'#'表示前一个字符无效 { Pop2(S,b[i-1]); cout<<"b["<<i-1<<"]="<<b[i-1]<<endl; break; } else if(a[i]=='@') //'@'表示当前行中的字符均无效 { ClearStack(S); break; } else { Push(S,a[i]); break; } } } while(base!=S.top) { cout<<char(*base); base++; } cout<<endl; } int Precede(char a,char b) //1代表'>';0代表'=';-1代表'<' { int st; if(a=='+') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=-1; break; case '/': st=-1; break; case '(': st=-1; break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='-') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=-1; break; case '/': st=-1; break; case '(': st=-1; break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='*') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=1; break; case '/': st=1; break; case '(': st=-1; break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='/') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=1; break; case '/': st=1; break; case '(': st=-1; break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='(') { switch(b) { case '+': st=-1; break; case '-': st=-1; break; case '*': st=-1; break; case '/': st=-1; break; case '(': st=-1; break; case ')': st=0; break; case '#': break; } } else if(a==')') { switch(b) { case '+': st=1; break; case '-': st=1; break; case '*': st=1; break; case '/': st=1; break; case '(': break; case ')': st=1; break; case '#': st=1; break; } } else if(a=='#') { switch(b) { case '+': st=-1; break; case '-': st=-1; break; case '*': st=-1; break; case '/': st=-1; break; case '(': st=-1; break; case ')': break; case '#': st=0; break; } } return st; } int Operate(int a,char theta,int b) { int result; switch(theta) { case'+': result=a+b; break; case'-': result=a-b; break; case'*': result=a*b; break; case'/': result=a/b; break; } return result; } int EvaluteExpression() { SqStack OPTR,OPND; char x,theta; char arr[100],dr[]={'#'}; int j=0,e,n,a,b,result; int y; int *optrT,*optrB,*opndT,*opndB; InitStack(OPTR); Push(OPTR,'#'); //以int值进栈，出栈需转换 InitStack(OPND); //cout<<"请输入算术表达式："; //算术表达式以'#'结束 //cin>>arr; cout<<"请输入："; cin>>y for(int i=0;i<strlen(arr);i++) { GetTop(OPTR,e); cout<<"****************************"<<endl; cout<<"i="<<i<<endl; cout<<"输入字符"<<arr[i]<<endl; cout<<"char(e)="<<char(e)<<endl; if(arr[i]!='#' || char(e)!='#') { if(arr[i]!='+' && arr[i]!='-' && arr[i]!='*' && arr[i]!='/' && arr[i]!='(' && arr[i]!=')' && arr[i]!='#') //操作数 { Push(OPND,arr[i]-'0'); opndT=OPND.top; opndB=OPND.base; cout<<"操作数栈中元素："; while(opndT!=opndB) { opndT--; cout<<*opndT<<" "; } cout<<endl; } else { GetTop(OPTR,e); cout<<"e="<<char(e)<<endl; n=Precede(char(e),arr[i]); cout<<"n="<<n<<endl; switch(n) { case -1: Push(OPTR,arr[i]); optrT=OPTR.top; optrB=OPTR.base; cout<<"运算符栈中元素："; while(optrT!=optrB) { optrT--; cout<<char(*optrT)<<" "; } cout<<endl; break; case 0: Pop2(OPTR,x); opndT=OPND.top; opndB=OPND.base; cout<<"操作数栈中元素："; while(opndT!=opndB) { opndT--; cout<<*opndT<<" "; } cout<<endl; optrT=OPTR.top; optrB=OPTR.base; cout<<"运算符栈中元素："; while(optrT!=optrB) { optrT--; cout<<char(*optrT)<<" "; } cout<<endl; break; case 1: Pop2(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); i--; opndT=OPND.top; opndB=OPND.base; cout<<"操作数栈中元素："; while(opndT!=opndB) { opndT--; cout<<*opndT<<" "; } cout<<endl; optrT=OPTR.top; optrB=OPTR.base; cout<<"运算符栈中元素："; while(optrT!=optrB) { optrT--; cout<<char(*optrT)<<" "; } cout<<endl; break; } } } } GetTop(OPND,result); cout<<arr<<"="<<result<<endl; return OK; } int main() { /*SqStack S; InitStack(S); conversion(S); match(S); LineEdit(S);*/ EvaluteExpression(); return OK; }

C语言小白 编译运行无误。求大神看一下为什么最后运行时输入等号回车后没有结果？
#include<stdio.h> #include<stdlib.h> #include<math.h> #define TRUE 1 #define FALSE 0 #define ERROR 0 #define MAXSIZE 100 typedef char DataType; typedef struct { DataType data[MAXSIZE]; int top; }SqStack; int InitStack(SqStack &S) { //构造一个空栈 S.top= -1; return 1; } int StackEmpty(SqStack S) //判栈为空栈时返回值为真，反之为假 { return(S.top==-1? TRUE:FALSE);} int StackFull(SqStack S) //判栈为满栈时返回值为真，反之为假 { return(S.top==MAXSIZE-1?TRUE:FALSE);} int Push(SqStack &S, DataType e) { //将元素e插入到栈中，作为的新栈顶 if(StackFull(S)) return ERROR; //栈满 S.top++; // top加1，栈顶位置上移 S.data[S.top]=e; //数据e存入当前栈顶 return 1; } int Pop(SqStack &S,DataType &e) {//若栈不为空，则删除栈顶元素 if(StackEmpty(S)) return ERROR; //栈空 e=S.data[S.top]; //取出数据放入e所指单元中 S.top--; // top减1，栈顶位置下移 return 1; } DataType GetTop(SqStack S) {//若栈不为空，则取栈顶元素 DataType e; if(StackEmpty(S)) return ERROR; //栈空 e=S.data[S.top]; //取出数据，top不变 return e; } typedef char DataType; int bracketmatching() { SqStack S; DataType ch; InitStack(S); while ((ch=getchar())!='\n') { switch (ch) //遇左括号入栈;遇到右括号时,分别检测匹配情况 { case '(': case '[': case '{': Push(S,ch);break; case ')': if (StackEmpty(S)) return FALSE; else { Pop(S,ch); if (ch!= '(') return FALSE; } break; case ']': if (StackEmpty(S)) return FALSE; else { Pop(S,ch); if (ch!= '[') return FALSE; } break; case '}': if (StackEmpty(S)) return FALSE; else { Pop(S,ch); if (ch!='{') return FALSE; } break; default:break; } } if (StackEmpty(S)) return TRUE; else return FALSE; } int In(char ch) /*判断字符ch是否为算符*/ { int i,flag=0; char op[7]={'+','-','*','/','(',')','='}; /*算符数组*/ for (i=0;i<7;i++) if(ch==op[i]) { flag=1; break; } return flag; } DataType Operate(DataType a,char theta,DataType b) { DataType z; switch (theta) { case '+':z=a+b;break; case '-':z=a-b;break; case '*':z=a*b;break; case '/':z=a/b;break; } return(z); } char Precede (char a,char b) /*比较两个运算符的优先级*/ { char z; if((b=='+')||(b=='-')||(b=='*')||(b=='/')|| (b=='(')||(b==')') ||(b=='=')) switch (a) {case '+': case '-': if((b=='*')||(b=='/')||(b=='(')) z='<'; else z='>'; break; case '*': case '/': if(b=='(') z='<'; else z='>';break; } return z; } float CaculateExpression(char *str) { //算术表达式求值的算符优先算法。设optr和opnd分别为算符栈和操作数栈， //OP为算符集合 char a,b,theta,x,u; SqStack optr,opnd; char *p; int k; InitStack(optr); Push(optr, '='); InitStack(opnd); p=str;//c=getchar(); while(*p!='=' ||GetTop(optr)!='=') { if(!In(*p)) { u=0; k=0;//统计小数位数 while(*p>='0'&&*p<='9'||*p=='.') { if(*p!='.')u=u*10+*p-'0'; if(*p=='.'||k>0) k++; p++; } if(k>0) u=u/pow(10,k-1); Push(opnd,u); } //不是算符则进栈 else switch(Precede(GetTop(optr),*p)) { case '<' : //栈顶算符优先级低 Push(optr,*p); p++;//c=getchar(); break; case '=' : //优先级相同，脱去括号并读入下一字符 Pop(optr,x); p++;//c=getchar(); break; case '>' : //栈顶算符优先级高，退栈并将运算结果入栈 Pop(optr,theta); Pop(opnd,b);Pop(opnd,a); Push(opnd,Operate(a,theta,b)); break; }} return GetTop(opnd); } int JudgeExpression(char *str) { char*p; p=str; while(*p!='\0') p++; p--; if(*p!='=') { printf("表达式要以等号结束！"); return 0; } return 1; } int main() { char str[81]; printf("请输入表达式："); scanf("%s",str); if(JudgeExpression(str)) printf("%s%f\n",str,CaculateExpression(str)); return 0; }

《MySQL 性能优化》之理解 MySQL 体系结构

python自动下载图片

【前言】 　　收到一封来信，赶上各种事情拖了几日，利用今天要放下工作的时机，做个回复。 　　2020年到了，就以这一封信，作为开年标志吧。 【正文】 　　您好，我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。 　　先说一下我的基本情况，高考失利，不想复读，来到广州一所大专读计算机应用技术专业。学校是偏艺术类的，计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...

【CSDN编者按】1月2日，阿里巴巴发布《达摩院2020十大科技趋势》，十大科技趋势分别是：人工智能从感知智能向认知智能演进；计算存储一体化突破AI算力瓶颈；工业互联网的超融合；机器间大规模协作成为可能；模块化降低芯片设计门槛；规模化生产级区块链应用将走入大众；量子计算进入攻坚期；新材料推动半导体器件革新；保护数据隐私的AI技术将加速落地；云成为IT技术创新的中心 。 新的画卷，正在徐徐展开。...

Python+OpenCV实时图像处理

2020年一线城市程序员工资大调查

python爬取百部电影数据，我分析出了一个残酷的真相
2019年就这么匆匆过去了，就在前几天国家电影局发布了2019年中国电影市场数据，数据显示去年总票房为642.66亿元，同比增长5.4%；国产电影总票房411.75亿元，同比增长8.65%，市场占比 64.07%；城市院线观影人次17.27亿，同比增长0.64%。 看上去似乎是一片大好对不对？不过作为一名严谨求实的数据分析师，我从官方数据中看出了一点端倪：国产票房增幅都已经高达8.65%了，为什...

Windows可谓是大多数人的生产力工具，集娱乐办公于一体，虽然在程序员这个群体中都说苹果是信仰，但是大部分不都是从Windows过来的，而且现在依然有很多的程序员用Windows。 所以，今天我就把我私藏的Windows必装的软件分享给大家，如果有一个你没有用过甚至没有听过，那你就赚了????，这可都是提升你幸福感的高效率生产力工具哦！ 走起！???? NO、1 ScreenToGif 屏幕，摄像头和白板...

C++(数据结构与算法):62---搜索树（二叉搜索树、索引二叉搜索树）

AI 没让人类失业，搞 AI 的人先失业了

2020年，冯唐49岁：我给20、30岁IT职场年轻人的建议

B站是个宝，谁用谁知道???? 作为一名大学生，你必须掌握的一项能力就是自学能力，很多看起来很牛X的人，你可以了解下，人家私底下一定是花大量的时间自学的，你可能会说，我也想学习啊，可是嘞，该学习啥嘞，不怕告诉你，互联网时代，最不缺的就是学习资源，最宝贵的是啥？ 你可能会说是时间，不，不是时间，而是你的注意力，懂了吧！ 那么，你说学习资源多，我咋不知道，那今天我就告诉你一个你必须知道的学习的地方，人称...

leetcode88. 合并两个有序数组

Java校招入职华为，半年后我跑路了

Python全栈 Linux基础之3.Linux常用命令
Linux对文件（包括目录）有很多常用命令，可以加快开发效率：ls是列出当前目录下的文件列表，选项有-a、-l、-h，还可以使用通配符；c功能是跳转目录，可以使用相对路径和绝对路径；mkdir命令创建一个新的目录，有-p选项，rm删除文件或目录，有-f、-r选项；cp用于复制文件，有-i、-r选项，tree命令可以将目录结构显示出来（树状显示），有-d选项，mv用来移动文件/目录，有-i选项；cat查看文件内容，more分屏显示文件内容，grep搜索内容；>、>>将执行结果重定向到一个文件；|用于管道输出。
​两年前不知如何编写代码的我，现在是一名人工智能工程师