在 c 的 if 语句中声明变量是个坏习惯吗?
Is declaring a variable inside an if statement in c a bad habit?
我的假设是这会扰乱西洋跳棋和堆栈分析。
我无法证明我的假设,我认为 C99 不会抱怨。可能 c89 都不会,因为定义紧跟在大括号开头之后:
if(true == condition){
int i = 0;
/* do stuff with i */
}else{
foo():
}
两条路径会导致不同的堆栈使用。
在 if/else 语句之外声明 i 将导致更明确的堆栈使用(好吧,我正在分支到 foo,所以堆栈在这两种情况下不会完全相同)。
但是 Misra 建议限制最接近其用途的变量范围。
我是想多了还是我的假设有合理性?
Is declaring a variable inside an if statement in c a bad habit?
没有
现代方法是尽量减少所用变量的范围,从而避免逻辑(难以修复)和句法(易于修复)错误。
当然,有些人仍然喜欢看到所有变量都定义在代码的最上面,因为这是过去的惯例,正如@Clifford 评论的那样。
顺便说一句,您的代码应该可以正常编译,无论是使用 C89 还是 C99。
这种堆栈使用思想是想多了的结果,我建议你遵循古希腊短语:Métron áriston。
该代码在任何版本的C中都可以(除了C90不支持true
)。
The two paths will lead to different stack usage.
这基本上是一个神话。如果现代编译器可以确定需要一个变量,则无论您将声明放在何处,都会将其堆叠起来。
如果变量是在寄存器中分配的,那么它只会在程序采用您的示例声明变量的路径时分配。这不是因为声明放在哪里,而是因为那条路径将被执行。因此,再次强调,为了性能起见,声明变量的位置并不重要,只要它在本地范围内而不是文件范围内即可。
最好尽可能限制变量的范围。但这是为了避免无意的错误和名称空间冲突。
But Misra advises to limit the scope of a variable closest to its usage.
不,它不是,但一些静态分析器要求您在 MISRA 要求之上这样做。 MISRA-C:2004 8.7 和 MISRA-C:2012 8.9 都只要求您将一个变量放在块范围内,如果它只被一个函数使用的话。就是这样。
但是 MISRA 确实说:
Within a function, whether objects are defined at the outermost or innermost block is largely a matter of style
我的假设是这会扰乱西洋跳棋和堆栈分析。 我无法证明我的假设,我认为 C99 不会抱怨。可能 c89 都不会,因为定义紧跟在大括号开头之后:
if(true == condition){
int i = 0;
/* do stuff with i */
}else{
foo():
}
两条路径会导致不同的堆栈使用。 在 if/else 语句之外声明 i 将导致更明确的堆栈使用(好吧,我正在分支到 foo,所以堆栈在这两种情况下不会完全相同)。 但是 Misra 建议限制最接近其用途的变量范围。
我是想多了还是我的假设有合理性?
Is declaring a variable inside an if statement in c a bad habit?
没有
现代方法是尽量减少所用变量的范围,从而避免逻辑(难以修复)和句法(易于修复)错误。
当然,有些人仍然喜欢看到所有变量都定义在代码的最上面,因为这是过去的惯例,正如@Clifford 评论的那样。
顺便说一句,您的代码应该可以正常编译,无论是使用 C89 还是 C99。
这种堆栈使用思想是想多了的结果,我建议你遵循古希腊短语:Métron áriston。
该代码在任何版本的C中都可以(除了C90不支持true
)。
The two paths will lead to different stack usage.
这基本上是一个神话。如果现代编译器可以确定需要一个变量,则无论您将声明放在何处,都会将其堆叠起来。
如果变量是在寄存器中分配的,那么它只会在程序采用您的示例声明变量的路径时分配。这不是因为声明放在哪里,而是因为那条路径将被执行。因此,再次强调,为了性能起见,声明变量的位置并不重要,只要它在本地范围内而不是文件范围内即可。
最好尽可能限制变量的范围。但这是为了避免无意的错误和名称空间冲突。
But Misra advises to limit the scope of a variable closest to its usage.
不,它不是,但一些静态分析器要求您在 MISRA 要求之上这样做。 MISRA-C:2004 8.7 和 MISRA-C:2012 8.9 都只要求您将一个变量放在块范围内,如果它只被一个函数使用的话。就是这样。
但是 MISRA 确实说:
Within a function, whether objects are defined at the outermost or innermost block is largely a matter of style