在 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