我在尝试编译这个波兰语命令行计算器时遇到此错误。
警告:控制可能会达到无效功能的结束 [-Wreturn型] }
我理解错误信息意味着我可能没有从函数中返回任何内容但是在哪里发生了什么?
#include <stdio.h>
#include <stdlib.h>
void push(int element);
int pop();
int main(int argc, char **argv)
{
int op2;
while (argc > 1)
{
switch(argv[1][0]) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
push(atoi(*argv));
argv++;
break;
case '+':
push(pop() + pop());
argv++;
break;
case '*':
push(pop() * pop());
argv++;
break;
case '-':
op2 = pop();
push(pop() - op2);
argv++;
break;
case '/':
op2 = pop();
if (op2 != 0) {
push(pop() / op2);
argv++;
}
else
printf("error: zero divisor\n");
break;
default:
printf("error: unknown operand %s\n", *argv);
break;
}
}
printf ("%d\n", pop());
return 0;
}
#define STACKSIZE 1000
int next = 0; /* next free stack position */
int stack[STACKSIZE];
void push(int element) {
if (next > STACKSIZE) printf("error: stack full, can't push %d\n", element);
else stack[next++] = element;
}
int pop() {
if (next == 0) printf("stack empty\n");
else return stack[--next];
}
答案 0 :(得分:2)
当pop方法中的堆栈为空时,您不会返回值。
int pop()
{
if (next == 0)
{
printf("stack empty\n");
// return statement missing
}
else
return stack[--next];
}
这里可以返回0(或表示堆栈为空的值),但最好在弹出之前检查堆栈是否为空。例如,您可以在调用pop之前添加hasNext
或isEmpty
方法或检查大小。
答案 1 :(得分:1)
如果next == 0
中的pop
在函数返回类型为return
时没有int
值,则会给出警告,您应该当一个函数不是void
时,确保每个控制路径都有一个有效的返回类型,例如:
int pop() {
if (next == 0) { printf("stack empty\n"); return 0; }
else return stack[--next];
}