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++)代码的一种技术是在生成代码时完全不用担心格式。只需将代码扔在那里,而不考虑间距、缩进、行尾或任何东西。生成后,通过GNUindent运行它以使代码可读以用于调试目的。这比尝试自己创建所有格式要容易得多。

于 2009-04-19T01:10:20.150 回答
2

我想不出不缩进的好理由。大括号表示一个块,无论它是用于循环还是其他条件语句,都具有重要意义。最后,它归结为您认为更具可读性的内容,因此请按照您的直觉行事,但要保持一致。

于 2009-04-19T01:12:17.900 回答
1

如果您打算让人们阅读它,请缩进。没有缩进,大括号不起作用。我不得不盯着上面的例子看了一会儿,以说服自己它没有坏掉。

缩进并不意味着循环;还有许多其他结构使用它。如果大括号嵌套没有任何其他内容,我可能会感到困惑:

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

但是在第二个例子中使用了紧跟大括号的注释,很快就可以看出发生了什么。

您是否担心使用太多缩进并达到“80 个字符限制”?如果是这样,请增加限制和/或减少缩进大小(8 个空格确实有点大)。

(如果你打算让它被人类阅读,那么谁在乎呢?)

于 2009-04-19T01:52:48.427 回答
1

for在语句的第一部分使用逗号运算符怎么样?

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

为其真正的客户吐出自动生成的代码:编译器。几块换行符通常会帮助编译器,它们仍然针对许多短行进行了优化,但除此之外,谁在乎呢?当你想手动检查它的正确性时,有很多漂亮的打印机可以让它看起来很漂亮。

于 2009-04-19T01:15:34.427 回答