2017-12-06 9 views
1

誰かがこのforとifを使い分けるこの構文を説明できますか?forループとif文を並べて使用するC++

int min_dist = huge; 
int v = -1; 

for (int i = 0; i < N; ++i) if (!done[i]) { 
    if (d[i] >= min_dist) continue; 
    min_dist = d[i]; 
    v = i; 
} 
+2

「横並び」とはどういう意味ですか? – NiVeR

+4

これはforループ内のif文です。あなたはどうして得られないのですか? "if"の前に改行を置くと、まったく同じようになりますが、より読みやすくなります。あなたがそれをさらにはっきりさせたいなら、中括弧を加える。 –

+1

あなたが入れた空白(改行を含む)の多くは、次の行になければなりません。 – Borgleader

答えて

2

これはインデントされていない整然としたコードの場合です。 forラインが読みやすくなり、右後

for (int i = 0; i < N; ++i) 
{ 
    if (!done[i]) 
    { 
    if (d[i] >= min_dist) continue; 
    min_dist = d[i]; 
    v = i; 
    } 
} 

がブロック{}を追加する:同等です。

2番目のifステートメントのブロックを追加して、さらに簡単にすることができます。

for (int i = 0; i < N; ++i) 
{ 
    if (!done[i]) 
    { 
    if (d[i] >= min_dist) 
    { 
     continue; 
    } 

    min_dist = d[i]; 
    v = i; 
    } 
} 

あなたはそれを簡略化することができます:2つのif Sはまだそれを簡単にするために組み合わせることができる

for (int i = 0; i < N; ++i) 
{ 
    if (!done[i]) 
    { 
    if (d[i] < min_dist) 
    { 
     min_dist = d[i]; 
     v = i; 
    } 
    } 
} 

for (int i = 0; i < N; ++i) 
{ 
    if (!done[i] && d[i] < min_dist) 
    { 
    min_dist = d[i]; 
    v = i; 
    } 
} 
0

括弧のないループについては、1つの文ブロックを実行するために使用できます。この場合、if文は、他のすべての文を1組の括弧でグループ化して1つのブロックにします。

2

これはまったく同じである:説明として

int min_dist = huge; 
int v = -1; 

for (int i = 0; i < N; ++i){ 
    if (!done[i]) { 
     if (d[i] >= min_dist) continue; 
     min_dist = d[i]; 
     v = i; 
    } 
} 

、あなただけのためか、あなたは括弧を必要としない場合は内部の1文を持っている場合。

+0

あなたはそれらを必要としません。いいえ。しかし、C++構文の詳細に精通していない茶色の人であるかもしれないあなたのコードのカジュアルリーダーに非常に役立つので、あなたはまだそれらを(IMHO)に入れなければなりません。コンパイラではなく、読者のためのコードを書いてください(コンパイラはそれが有効であればコンパイラがそれを独自に理解します)。 –

+0

@JesperJuhl私はあなたに同意しますが、大括弧は本当にスコープを区別しますが、他のコードで遭遇することができるので、必ずしも必要というわけではありません。 –

2

レイアウトがあなたを欺くかもしれません。これは、if文forループの単一でちょうどです:

  • でインデックス付けた各項目について、私はまだ行っていない項目は、その項目で私の場合、ボディ他
  • 次の項目を(プロセスへ場合forループ)
7

これは並んでいません。 forの中にはifです。 forの構文は

for(...) 
    statement 

あり、ちょうどそうifも声明であることを起こります。したがって、コードは次のようになります。

for(...) 
    if() { 
    } 

コンパイルプロセスでは、ほとんど無視されるためです。新しい行があるかどうかは関係ありません。それはまだ声明です。それはワンライナー

if (d[i] >= min_dist) continue; 

のために重要ではありません。そして、我々はそれらの明らかに決定的な中括弧を省略しない場合と同じように:

for(...) { 
    if() { 
    } 
} 

を我々ははるかに少ない可能性に混乱することができるでしょう未来。

+0

そして(私はOPと関連していると思う); 1行でfor(...)if(...)と同じです。 –

1

私はいつものコードを見たとき、私は最善の方法は、この場合には、私が読みやすい見つける形式でそれを書き換えることで理解していない見つける:

for (int i = 0; i < N; ++i) { 
    if (!done[i]) { 
     if (d[i] >= min_dist) { 
      continue; 
     } 
     min_dist = d[i]; 
     v = i; 
    } 
} 

事実をif声明ことループの横にあるということは、それがループボディとして解決される式であることを意味します(これは常にそうであることに注意してください。ブロック{}も使用されます)。このifには本文もあります。省略されたブロックを明示的に入れることで、何が起こっているのかが分かりやすくなります。

0

このコードを書くための正しい方法はこのようなものです:forだけで物事を混乱させるとして

for (int i 0; i < N; ++i) 
    if (!done[i] && d[i] < min_dist) { 
     min_dist = d[i]; 
     v = i; 
    } 

は、同じ行にifを置きます。 2つのステートメントの代わりに2つのステートメントがあります。

+0

明確にするため、 forループの中括弧も追加します。 –

+0

@JesperJuhl - 余分な混乱のために、forループにも中括弧を追加します。 真剣に:これはもっと個人的なスタイルの問題です。私のコードでは、重複する括弧を追加しません。 –

+0

私はそれがスタイルの問題であることに同意します。しかし私の個人的な経験は、あなたが常に中括弧を追加するならば、初心者があまり混乱しないということです。私は自分自身では、あまり知られていないコードを読みやすいようにしています。だから、私は(個人的に)あなたは必ず*必要なものであるかどうか、中括弧を追加するべきであるという意見があります。しかし;それは味の問題です.. –

関連する問題