int preced(char arr)
{
if(arr=='/')
return 4;
if(arr=='*')
return 3;
if(arr=='+' || arr=='-')
return 2;
if(arr=='(')
return 1;
}
上面写的代码给了我一个警告:函数应该返回一个值。 我无法使用此函数应返回的值。 我该如何解决这个问题?
答案 0 :(得分:2)
您的函数始终返回一个值。它并不是因为您只在满足某些条件时返回,即当arr
是'/'
,'*'
,'+'
或'('
之一时。
您必须确保涵盖所有情况:
int preced(char arr)
{
/* as above */
return 42; // or whatever
}
答案 1 :(得分:0)
如果所有if
条件都失败,则返回语句不可用于返回。
只需添加
退出函数前最后 return 0
。
答案 2 :(得分:0)
您的函数正在返回条件中的值。请记住,if
条件中的代码可能会或可能不会每次都执行。在您的情况下,if
根据条件true
返回值。如果完全没有满足这些条件怎么办?因此,返回值的每个函数应始终在每种情况下返回一个,即返回的值应明确
您实际上可以使用switch-case
int preced (char arr)
switch(arr)
{
case '/':
return 4;
case '*':
return 3;
case '+':
case '-':
return 2;
case '(':
return 1;
default:
return 0;
}
答案 3 :(得分:0)
这是您的代码应该是
的方式int preced(char arr)
{
if(arr=='/')
return 4;
else if(arr=='*')
return 3;
else if(arr=='+' || arr=='-')
return 2;
else if(arr=='(')
return 1;
else
return 0;
}
您收到了警告,因为如果arr
不是if语句中的任何字符,那么该函数将不会返回任何内容。
答案 4 :(得分:0)
这是一个使用开关的好地方,主要是为了便于阅读。功能保持不变:
int preced(char arr) {
switch(arr) {
case '/': return 4;
case '*': return 3;;
case '+': //will fallthrough
case '-': return 2;
case '(': return 1;
default: return 0;
}
}
您的代码存在的问题是,有些方法可以在不返回内容的情况下完成该功能。如果所有的if都被忽略,因为arr例如是' a'。也许在你的程序中,这不会发生,但编译器不会知道,并将给出一个错误。在上面的开关中,默认' case处理这个问题。
答案 5 :(得分:0)
编译器警告preced
可能在没有正确结果的情况下返回,请考虑使用switch
default
案例:
switch (arr) {
case '/':
return 4;
case '*':
return 3;
case '+':
case '-':
return 2;
case '(':
return 1;
default:
return 0;
}
另请注意,arr
对于期望char
的参数来说似乎不是一个好名字。