两个看似相同的代码的不同行为

问题描述 投票:0回答:1

我正在编写代码来检查表达式的括号,该表达式存储为字符串。

字符串的每个字符都存储在 tokens[i].type 中。

例如:如果 exp 是 (1+2) 返回 true,如果是 (1+2)*(3+4) 返回 false

代码是这样的。

bool check_parentheses(int p, int q)
{
  int cnt = 0;
  int i = p;
  for(; i <= q; ++i)
  {
    if(tokens[i].type == '(') {++cnt;}
    else if(tokens[i].type == ')') {--cnt;}
    if(cnt == 0 && tokens[p].type == '(' && tokens[q].type == ')') {break;}
  }
  if(i == q)  return true; else return false;
  return false;
 
  // int i = p;
  // for(; i <= q; ++i)
  // {
  //   if(tokens[i].type == '(') {++cnt;}
  //   else if(tokens[i].type == ')') {--cnt;}
  //   if(cnt == 0 && tokens[p].type == '(' && tokens[q].type == ')' && i == q) return true; else return false;
  // }
  // return false;
}

未注释的代码运行良好,而带注释的代码则运行不佳。使用 gdb,我发现每次它在 for 循环中运行时,带注释的只是跳过循环并返回 false,而其他步骤进入循环并正常执行代码。

我认为两者是相同的,但想知道为什么它们的行为不同。

c
1个回答
0
投票

替代方案并不等效:

  • if(cnt == 0 && tokens[p].type == '(' && tokens[q].type == ')') {break;}
    将在第一个左括号处中断,这是不正确的。

另请注意以下备注:

  • p
    q
    i
    可能应该具有类型
    size_t
    而不是
    int
  • q
    应该是切片末尾 after 第一个条目的索引,以便您可以调用
    check_parentheses(0, number_of_tokens)

这是根据这些建议的修改版本:

bool check_parentheses(size_t p, size_t q)
{
    int count = 0;
    for (size_t i = p; i < q; ++i) {
        if (tokens[i].type == '(') {
            ++count;
        } else
        if (tokens[i].type == ')') {
            if (count == 0)
                return false;
            --count;
        }
    }
    return count == 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.