2016-10-10 5 views
-4

誰かが私を導くことができますか?そうでなければこれを3者演算子形式に変換できますか?私は、コード内の角かっこをチェックするテキストエディタを作成するスタックを使用していますが、私はこのコードを短絡するには三項演算子を使用する必要があります。この特定の "if/else"ブロックを三項演算子に変換する方法は?

  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; 
       } 
     } 
+5

私があなただったら、それだけで理解することが、すべてが難しくだろうと、私は、条件演算子でこのコードを短縮避けると思います。クリアコード>>>>>>>>短いコード。 – TartanLlama

+4

なぜそれをしたいですか? 1.何も得られません2.コードをかなり読めるようにします。 –

+0

私は本当にポイントを見ていない、とSOは無料のコードサービスではありません/ pls私の宿題サイトを行う。 – George

答えて

2

あなたのコードは読み、ここ三事業のいずれかの導入は、より良い、それはあまり明確ではないになるだろう、それはどちらかのパフォーマンスを改善しません明確にする必要があります。

一般に、3進演算子は副作用がなく、使用する値を選択する必要があります。 min()は三項演算子をよく使用しています。すなわち、(a<b)?a:b

3つの演算子でよりよく表現されるブロックはありません。私は一般的には()と同じブロックではなく()で複数回同じではないでしょう。ですから、s.at(i)を一度計算し、それを意味のある変数に入れて使用してください。

3

3進演算子は、の値をから選択します。操作ではありません。

同じ変数にのみ割り当てられる条件がある場合は、書き直すのが理にかなっています。例えば、

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

は、あなたのコード内の演算子を使用すると、それは任意の短い、唯一のより複雑と読めないことはないだろう

int x = something ? 12 : 34; 

として優れている

結果がどうなるかも不明です。
唯一のもっともらしい候補は、vに割り当てられた値ですが、すべてのブランチでvに割り当てていないので、それは外です。

あなたの3つの条件をちょうど||に参加させることが明らかになりましたが、より良い方法はテストを完全に抽象化することです。

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; 
    }    
} 
// ...