对于生成的代码,我可以选择缩进或不缩进大括号,仅用于容纳范围内的变量。目前它没有在这个级别缩进,我想知道我是否要通过缩进来暗示嵌套结构?通常的做法是什么?
/* 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 */
Versus
/* 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 */
澄清: 使用调试器时,额外的缩进意味着难以读取代码的另一级循环...
答案 0 :(得分: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,没有意识到你是提问者。我的眼睛受伤了,请对语法进行必要的更正。)
答案 1 :(得分:3)
在使用大括号进行变量范围设计时,我肯定会缩进代码。
我用于生成C(和C ++)代码的一种技术是在生成代码时不必担心关于格式的。只需将代码抛出,不考虑间距,缩进,行结尾或任何东西。生成后,通过GNU indent
运行它以使代码可读以进行调试。这比尝试自己创建所有格式要容易得多。
答案 2 :(得分:2)
我想不出一个不缩进的好理由。大括号表示一个块,无论它是用于循环还是其他条件语句都具有重要性。最后,它归结为你认为更具可读性的东西,所以与你的直觉一致,但要保持一致。
答案 3 :(得分:1)
如果您打算让人们阅读,请缩进。没有缩进,大括号不起作用。我不得不盯着最好的例子一段时间来说服自己它没有被打破。
缩进并不意味着循环;还有许多其他构造使用它。如果括号嵌套而没有任何其他内容,我可能会感到困惑:
for (...)
{
{
/* huh? */
}
}
但是在第二个例子中使用注释后立即使用括号使得它很快就显而易见了。
您是否担心使用过多的缩进并达到'80字符限制'?如果是这样,增加限制和/或减少缩进大小(8个空格确实有点大)。
(如果不希望人类阅读,那么谁在乎呢?)
答案 4 :(得分:1)
如何在for
语句的第一部分中使用逗号运算符?
for (int a2 = arulestablestart[2], int a2end = arulestableend[2]; a2 < a2end; a2++)
{
// do something
}
答案 5 :(得分:0)
为其真正的客户:编译器吐出自动生成的代码。一些新行通常会帮助编译器,这些编译器仍然针对很多短线进行了优化,但除此之外,谁在乎呢?有很多漂亮的打印机可以让你看起来很漂亮,当你想手动检查它是否正确。