You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现中缀转后缀表达式运算符显示异常及编译警告问题

C语言中缀转后缀表达式问题排查

问题描述

实现中缀(infix)表达式转后缀(postfix)表达式功能时,遇到两类异常:

  • 输入测试用例a+b时,输出结果为ab?,无法正常显示运算符
  • 编译阶段出现如下警告:
infpos.c:74:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]

问题定位结果

已排查到核心问题:代码第58行原本使用后缀自增运算符,实际应当使用前缀自增运算符。

原始代码

#include<stdio.h>
#include<ctype.h>
#define max 30

void main()
{
    char inf[30],post[30];
    void convert(char [],char []);
            printf("Enter the infix exxpression\n");
                 scanf("%s",inf);

            convert(inf,post);

            printf("Postfix expression is\n");
            printf("%s\n",post);
}

void convert(char inf[],char post[])
{
    int i,j=0,top=-1,f=1,test;
    char stack[30],ch,x;
    int check(char);
    int pre(char);

      for(i=0;inf[i]!='\0';i++)
      {
          ch = inf[i];
          test = check(ch);

          switch(test)
          {
             case 1:
                post[j++] = ch;
                break;
             case 2:
                stack[++top] = ch;
                break;
             case 3:
                while((x=stack[top--])!='(')
                    post[j++] = x;
                break;
             case 4:
               do
               {
                if(top==-1)
                    f = 1;
                else if(stack[top] == '(')
                    f = 1;
                else if(pre(ch)>pre(stack[top]))
                    f = 1;
                else
                {
                    post[j++] = stack[top--];
                    f = 0;
                }
              }while(f==0);
              stack[top++] = ch;
              break;
       }
   }
      while(top!=-1)
          post[j++] = stack[top--];
     post[j] = '\0';
}

 int pre(char op)
{
    if(op == '+' || op=='-')
       return 1;
    else if(op == '/' || op=='*' || op =='%')
      return 2;
    else if(op=='^')
      return 3;
 }

  int check(char ch)
  {
        if(isalnum(ch))
          return 1;
       else if(ch=='(')
           return 2;
       else if(ch == ')')
           return 3;
       else if(ch == '+' || ch =='-' || ch=='/' || ch =='*' || ch=='%' || ch=='^')
         return 4;
      else 
           return 5;
}

异常原理说明

1. 运算符显示乱码的原因

后缀自增top++的逻辑是先取top的当前值使用,再执行自增。处理第一个运算符时top初始值为-1,使用后缀自增会先向非法的stack[-1]内存地址写入运算符,之后top才自增为0,运算符实际没有存入栈的合法位置。后续出栈操作读取的是栈内存中的随机值,因此会输出?类乱码。改为前缀自增++top后,会先将top自增到合法下标再写入数据,问题即可解决。

2. 编译警告的原因

pre函数没有覆盖所有返回分支,如果传入的参数不是预设的运算符,函数没有对应的return语句,因此触发了非void函数返回值不全的警告。在pre函数末尾添加return 0;这类默认返回语句即可消除警告。

内容的提问来源于stack exchange,提问作者A_01_Abhilash S Hathwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:24:01