1

生成されたコードの場合、スコープで変数を格納するためにのみ使用される中括弧でインデントするかどうかを選択できます。現在、このレベルではインデントされていません。インデントしてネストされた構造を暗示するのではないかと思います。一般的な方法は何ですか?

/* loop through the total number of letter a rules  */
for (a = 0; a < (number_a_rules - 1); a++) 
{
        /* loop through secondary position rules */           
        {
        int a2end = arulestableend[2];
        for (int a2 = arulestablestart[2]; a2 < a2end; a2++) 
        {
                  /* stuff */
        }
        }
} /* end for a 0 to numberarules -1 */

/* loop through the total number of letter a rules  */
for (a = 0; a < (number_a_rules - 1); a++) 
{
        /* loop through secondary position rules */
        {
                 int a2end = arulestableend[2];
                 for (int a2 = arulestablestart[2]; a2 < a2end; a2++) 
                 {
                     /* stuff */
                 }
        }
} /* end for a 0 to numberarules -1 */

明確化:デバッガーを使用すると、余分なインデントは、読みにくいコードでの別のレベルのループを意味します...

4

6 に答える 6

5

私の目には、インデントなしの方が誤解を招くようです。インデントされていないバージョンを見て、「ここで何が問題なのか」と思いますか?

余分なブレースが本当に必要ですか?

アップデート

ojblass のコメントに回答したいのですが、コメントよりも多くのスペースが必要になると思います。

中かっこなしで c で変数を宣言することはできないと思いました...少なくとも一部の惨めなコンパイラでは。

C は C++ ほど自由ではありません。あなたがしなければならないことは、実行可能コードの前に新しい宣言を入れることです。したがって、このフラグメントでは

for (a = 0; a < (number_a_rules - 1); a++) 
{
        /* loop through secondary position rules */
        {
                 int a2end = arulestableend[2];
                 for (int a2 = arulestablestart[2]; a2 < a2end; a2++) 

あなたはそれを書くことができます

for (a = 0; a < (number_a_rules - 1); a++) 
{
     int a2end = arulestableend[2];
     for (int a2 = arulestablestart[2]; a2 < a2end; a2++) 

そしてそれは完全にうまくいくでしょう。一方、for ループ内の宣言もストレートな C ではありません。

さて、可能なこと、例には示されていませんが、質問者が中かっこを使用してスコープを制限しているため、名前空間の管理がより簡単になっている場合です。つまり、

{
     int a2 = some_good_thing();
     // do stuff
}
{
     int a2 = something_else();  // Now a different a2, 
                                 // and it's the compiler's problem
     // do other stuff
}

(注: 申し訳ありませんが、OJ、あなた質問者であることに気付きませんでした。目が痛いです。読みながら文法に必要な修正を行ってください。)

于 2009-04-19T01:10:51.490 に答える
3

変数のスコープに中かっこを使用するときは、必ずコードをインデントします。

生成された C (および C++) コードに使用した手法の 1 つは、コードを生成するときに書式設定についてまったく気にしないことです。間隔、インデント、行末などを考慮せずにコードを放り出してください。生成後、 GNUindentを介して実行し、デバッグ目的でコードを読み取り可能にします。これは、すべての書式設定を自分で作成しようとするよりもはるかに簡単です。

于 2009-04-19T01:10:20.150 に答える
2

インデントしない正当な理由が思いつきません。中かっこは、ループまたはその他の条件ステートメント用であるかどうかに関係なく、意味を持つブロックを示します。最終的には、より読みやすいと思うものに帰着するので、直感に従いますが、一貫性を保つようにしてください。

于 2009-04-19T01:12:17.900 に答える
1

forステートメントの最初の部分でコンマ演算子を使用するのはどうですか?

for (int a2 = arulestablestart[2], int a2end = arulestableend[2]; a2 < a2end; a2++) 
{
    // do something
}
于 2009-04-19T15:22:09.057 に答える
1

人に読んでもらいたい場合は、インデントしてください。中括弧は、インデントなしでは機能しません。壊れていないことを確認するために、一番上の例をし​​ばらく見つめる必要がありました。

インデントはループを意味しません。それを使用する他の多くの構造があります。中括弧が他のコンテンツなしでネストされていた場合、私は混乱したかもしれません:

for (...)
{
    {
        /* huh? */
    }
}

しかし、2 番目の例ではコメントの直後に波括弧を使用しているため、何が起こっているのかがすぐにわかりました。

インデントが多すぎて '80 文字制限' に達してしまうのではないかと心配していますか? その場合は、制限を増やすか、インデント サイズを減らします (8 スペースは実際には少し大きいです)。

(人間に読まれるつもりがなければ、誰が気にしますか? )

于 2009-04-19T01:52:48.427 に答える
0

真の顧客であるコンパイラーのために、自動生成されたコードを吐き出します。通常、改行を少し入れるだけで、多くの短い行に最適化されているコンパイラーに役立ちますが、それ以外は誰が気にしますか? 手で正確さをチェックしたいときに見栄えを良くすることができるきれいなプリンターがたくさんあります。

于 2009-04-19T01:15:34.427 に答える