C / C ++に慣れている場合、このコードはそれほど読みにくいものではありませんが、かなり簡潔で、それほど優れたコードではありません。それでは、何よりもCismである部分について説明しましょう。まず、Cforループの一般的な構文は次のようになります。
for (<initialization> ; <condition>; <increment>)
{
<code...>
}
初期化コードは1回実行されます。次に、条件はすべてのループの前にテストされ、最後に増分がすべてのループの後に呼び出されます。したがって、あなたの例では、条件は次のようになります。u--
u--
C#ではなくCで条件として機能するのはなぜですか?Cは暗黙のうちに多くのことを変換しすぎて、問題を引き起こす可能性があるためです。数値の場合、ゼロ以外のものはすべて真であり、ゼロは偽です。したがって、b.size()-1から0までカウントダウンします。条件に副作用があるのは少し面倒で、forループのインクリメント部分に配置することをお勧めしますが、Cはたくさんあります。コードはこれを行います。私がそれを書いているなら、私はそれをもっとこのようにするでしょう:
for (u = b.size() - 1, v = b.back(); u>=0; --u)
{
b[u] = v;
v = p[v]
}
この理由は、少なくとも私にとっては、より明確だからです。forループの各部分は、それが仕事であり、他には何もしません。元のコードでは、条件は変数を変更していました。インクリメント部分は、コードブロックなどにあるべきことを実行していました。
コンマ演算子もループをスローしている可能性があります。Cx=1,y=2
では、コンパイラに関する限り、次のようなものが1つのステートメントのように見え、初期化コードに適合します。各パーツを評価し、最後のパーツの値を返すだけです。したがって、たとえば:
std::cout << "(1,2)=" << (1,2) << std::endl;
2を印刷します。