【问题标题】:How to convert this specific "if/else" blocks to the ternary operator? [closed]如何将此特定的“if/else”块转换为三元运算符? [关闭]
【发布时间】:2017-02-18 19:01:05
【问题描述】:

有人可以指导我或将其转换为三元运算符形式吗?我正在使用堆栈制作一个文本编辑器,它将在其中检查代码中的括号,但我只需要帮助使用三元运算符来缩短此代码。

            if(s.at(i)==x.at(j))
            {
                list.push_back(s.at(i));
            }

            if(s.at(i)==y.at(j))
            {
                if(!list.empty())
                {

                    if(list.back()=='('  && s.at(i)==')')
                    {
                        v=1;
                        list.pop_back();
                    }
                    else if(list.back()=='{'  && s.at(i)=='}')
                    {
                        v=1;
                        list.pop_back();
                    }
                    else if(list.back()=='['  && s.at(i)==']')
                    {
                        v=1;
                        list.pop_back();
                    }

                    else
                    {
                        error_position=i+1;
                    }
                }
                else
                {
                    error_position=i+1;
                    v=0;
                }
        }

【问题讨论】:

  • 如果我是你,我会避免使用条件运算符缩短这段代码,因为它只会让一切变得更难理解。清除代码>>>>>>>>短代码。
  • 您为什么要这样做? 1. 没有任何收获 2. 会使代码相当不可读。
  • 我真的不明白这一点,SO不是免费的代码服务/请做我的家庭作业网站。
  • 如果您需要在 2 个选项之间进行选择,请仅使用三元组。用于其他任何事情,它会让你的代码变得混乱。
  • 另外,从不使用三元运算符来执行副作用(正如您在此处要求的那样)。这完全违背了三元运算符的目的。

标签: c++ parsing ternary-operator code-readability


【解决方案1】:

三元运算符用于在值之间进行选择,而不是操作。

如果你有一个只分配给同一个变量的条件,那么重写是有意义的。
例如,

int x = 0;
if (something)
{
    x = 12;
}
else
{
    x = 34;
}

不如

int x = something ? 12 : 34;

在您的代码中使用运算符不会使其更短,只会更复杂且不可读。
也不清楚它的结果是什么。
唯一合理的候选者是分配给v 的值,但您并没有在每个分支中都分配给v,所以它被淘汰了。

明显的简化是将您的三个条件与|| 结合起来,但更好的方法可能是完全抽象出测试,例如

bool matching_brackets(char p1, char p2)
{
    return (p1 == '(' && p2 == ')')
        || (p1 == '{' && p2 == '}')
        || (p1 == '[' && p2 == ']');
}

// ...
if(s.at(i)==y.at(j))
{
    if (list.empty())
    {
        v = 0;
        error_position = i + 1;
    }
    else if (matching_brackets(list.back(), s.at(i)))
    {
        v = 1;
        list.pop_back();
    }
    else
    {
        error_position = i + 1;
    }            
}
// ...

【讨论】:

    【解决方案2】:

    您的代码应该清晰易读,此处任何三元运算的引入都会使其不那么清晰,而不是更好,并且也不会提高性能。

    三元运算符通常不应有副作用,应简单地选择要使用的值。 min() 很好地使用了三进制,即(a<b)?a:b

    我在您的代码中没有看到可以通过三元运算符更好地表达的块。我通常不会在同一个块中多次使用 at() 并且肯定不会使用相同的 at() 。所以计算 s.at(i) 一次,放入有意义的变量中使用。

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2012-07-11
      • 1970-01-01
      • 2018-10-25
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多