【问题标题】:C recursion return valuesC 递归返回值
【发布时间】:2021-03-14 08:36:10
【问题描述】:

我试图从递归函数中返回一个值,但不知何故总是得到错误的值。

我得到错误返回值的函数如下所示:

int statement_list(ParserData *data){

    int result = ERR_SYN;

    if(data->token.type == tt_right_bra)
    {
        if((result = load_token(data)) != 0) return result;

        return 0;
    }else if(data->token.type == tt_keyword_if    ||
            data->token.type == tt_eol            ||
            data->token.type == tt_id             ||
            data->token.type == tt_keyword_for    ||
           data->token.type == tt_keyword_return)
   {
       if((result = statement(data) != 0 )) return result;
       if((result = statement_list(data) != 0 )) return result; 

       return 0;
   }

   return result;

程序按预期运行,然后进入函数 statement(),执行以下代码块:

else if (data->token.type == tt_left_par){
        if(check_if_id_declared(symtable, data->prev_token.attribute.value) != 1){
            result = ERR_SEM_BAD_DEFINITION;
            return result;
        }
}

如果条件为真(这是预期的),变量 result 应设置为 3(宏定义为 3),程序返回到函数 statement_list 并使用该值。在 statement_list 中,我现在期望结果 = 3,但是在程序返回后我保持 gettin result = 1。

我不知道为什么会这样,感谢您的任何建议。

【问题讨论】:

  • 我建议重新编写函数的逻辑以创建简化且 minimal 的示例来演示该问题。错误的原因将变得很明显,或者您会看到简化版没有相同的问题,这将为您提供线索,表明其中一个差异导致了问题。
  • 我看到了错误的括号。我猜if((result = statement(data) != 0 )) return result; 一定是if ( ( result = statement(data) ) != 0 ) return result;= 的优先级低于 !=

标签: c function recursion return-value


【解决方案1】:

你有一个运算符优先级错误,因为你的括号很草率。

if((result = load_token(data)) != 0) return result;

正确:(result = load_token(data)) 表达式与零进行比较。

if((result = statement(data) != 0 )) return result;

错误:外圆括号什么都不做,在result = statement(data) != 0 中,!= 运算符的优先级高于赋值运算符=。所以这个表达式被评估为

result = (statement(data) != 0)

因此,当statement 返回 3 时,表达式 statement(data) != 0 为真,并且 result 设置为布尔值 true 提升为整数,即 1

参考:


如果您实际上是在编写 C++(如最初标记的那样),则可以对返回码使用强类型枚举,然后就不会像这样意外地从 bool 进行提升。

如果您实际上是在编写 C(如当前标记的那样) - 我上面的链接是针对 C++ 文档的,但 C 在这种情况下的行为方式相同。不过,您没有强类型枚举,所以您只需要更加小心。

【讨论】:

  • 非常感谢,不敢相信我忽略了这一点
猜你喜欢
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 2022-07-21
  • 2015-12-16
  • 2015-06-30
  • 2017-10-19
  • 2020-10-11
相关资源
最近更新 更多