誰かがこの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;
}
誰かがこの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;
}
これはインデントされていない整然としたコードの場合です。 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;
}
}
括弧のないループについては、1つの文ブロックを実行するために使用できます。この場合、if
文は、他のすべての文を1組の括弧でグループ化して1つのブロックにします。
これはまったく同じである:説明として
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文を持っている場合。
あなたはそれらを必要としません。いいえ。しかし、C++構文の詳細に精通していない茶色の人であるかもしれないあなたのコードのカジュアルリーダーに非常に役立つので、あなたはまだそれらを(IMHO)に入れなければなりません。コンパイラではなく、読者のためのコードを書いてください(コンパイラはそれが有効であればコンパイラがそれを独自に理解します)。 –
@JesperJuhl私はあなたに同意しますが、大括弧は本当にスコープを区別しますが、他のコードで遭遇することができるので、必ずしも必要というわけではありません。 –
レイアウトがあなたを欺くかもしれません。これは、if文forループの単一でちょうどです:
これは並んでいません。 for
の中にはif
です。 for
の構文は
for(...)
statement
あり、ちょうどそうif
も声明であることを起こります。したがって、コードは次のようになります。
for(...)
if() {
}
コンパイルプロセスでは、ほとんど無視されるためです。新しい行があるかどうかは関係ありません。それはまだ声明です。それはワンライナー
if (d[i] >= min_dist) continue;
のために重要ではありません。そして、我々はそれらの明らかに決定的な中括弧を省略しない場合と同じように:
for(...) {
if() {
}
}
を我々ははるかに少ない可能性に混乱することができるでしょう未来。
そして(私はOPと関連していると思う); 1行でfor(...)if(...)と同じです。 –
私はいつものコードを見たとき、私は最善の方法は、この場合には、私が読みやすい見つける形式でそれを書き換えることで理解していない見つける:
for (int i = 0; i < N; ++i) {
if (!done[i]) {
if (d[i] >= min_dist) {
continue;
}
min_dist = d[i];
v = i;
}
}
事実をif
声明ことループの横にあるということは、それがループボディとして解決される式であることを意味します(これは常にそうであることに注意してください。ブロック{}
も使用されます)。このif
には本文もあります。省略されたブロックを明示的に入れることで、何が起こっているのかが分かりやすくなります。
このコードを書くための正しい方法はこのようなものです:for
だけで物事を混乱させるとして
for (int i 0; i < N; ++i)
if (!done[i] && d[i] < min_dist) {
min_dist = d[i];
v = i;
}
は、同じ行にif
を置きます。 2つのステートメントの代わりに2つのステートメントがあります。
明確にするため、 forループの中括弧も追加します。 –
@JesperJuhl - 余分な混乱のために、forループにも中括弧を追加します。
私はそれがスタイルの問題であることに同意します。しかし私の個人的な経験は、あなたが常に中括弧を追加するならば、初心者があまり混乱しないということです。私は自分自身では、あまり知られていないコードを読みやすいようにしています。だから、私は(個人的に)あなたは必ず*必要なものであるかどうか、中括弧を追加するべきであるという意見があります。しかし;それは味の問題です.. –
「横並び」とはどういう意味ですか? – NiVeR
これはforループ内のif文です。あなたはどうして得られないのですか? "if"の前に改行を置くと、まったく同じようになりますが、より読みやすくなります。あなたがそれをさらにはっきりさせたいなら、中括弧を加える。 –
あなたが入れた空白(改行を含む)の多くは、次の行になければなりません。 – Borgleader