哪个是为嵌套循环声明虚拟变量的更好方法?

  1. 方法1的优点是文件大小略小,因为源代码中的文本字符较少:

    int i, j; for (i = 0; i < numRows; i++) for (j = 0; j < numCols; j++) // 
  2. 方法2的优点是局部变量的范围较小。

     int i; for (i = 0; i < numRows; i++) { int j; for (j = 0; j < numCols; j++) // } 

即使在今天的现代计算机中优化的差异可以忽略不计,哪种方法被认为是“更好”的代码?


编辑以澄清此问题不重复:

这个问题基于当前的C11标准,它不允许这样的语法:

 for (int i = 0; i < numRows; i++) 

在C ++和C99中,这种语法是完全可以接受的,而C11不允许在for语句中使用变量声明。


编辑以纠正错误信息:

我以为我使用的是C11,因为我最近从CodeBlocks下载了编译器,这就是为什么我说C11不允许在for语句中使用变量声明。 但事实certificate我实际上使用的是C90,这是我问题的根源。

为了完全紧凑和限制范围,我会使用:

 for (size_t i = 0; i < numRows; i++) { for (size_t j = 0; j < numCols; j++) { // } } 

注意使用size_t来表示数组索引。 size_t类型是unsigned整数类型,保证能够保存任何数组索引。 只是风格问题,但我还建议在所有循环体周围使用大括号。 这使您不太可能通过不可避免的更新和更改来破坏代码。

通过习惯用这样的块作用域声明循环变量,你强迫自己选择使用存储在代码中其他地方的循环变量中的值。

这似乎是一个品味的问题,而不是有任何明确的答案,但我会给你我的意见:

鉴于当前的计算机,保存几个字符的源代码是太微不足道甚至无法思考。 事实上,我想我会说,即使我在1976年在VAX 11/780上学习C语言。

我赞成第二个例子,因为当前的偏好是将变量声明为尽可能接近第一次使用。 在C ++中,您甚至可以将循环变量的声明放在for语句中:

 for (int i = 0; i < numRows; i++) { for (int j = 0; j < numCols; j++) { ... } } 

但这仍然只是一个品味问题:如果变量的声明接近其使用,则认为该程序将更具可读性。

这两种方法都不是首选。

两种常见的编码指南是(1)确保变量不存在超过其需要的时间和(2)不要将变量用于多个事物。 遵循这些指导方针可以减少(通常但不总是消除)变量的意外使用方式,因此有助于避免细微的编程错误。

在第一种情况下, ij继续存在,直到封闭范围结束 – 这意味着它们在循环完成后存在。 这最大化了后续代码(在该封闭范围内)意外地将ij用于其他目的(例如,当意图使用另一个变量时)的机会。 这些错误通常很难找到。

第二种情况有同样的问题,除了i只有。 即使是有这样一个问题的变量也是坏消息。

我可能会使用类似的结构

 // unintentionally using i or j here will cause a compilation error for (int i = 0; i < numRows; i++) { // unintentionally using j here will cause a compilation error for (int j = 0; j < numCols; j++) { // } // unintentionally using j here will cause a compilation error } // unintentionally using i or j here will cause a compilation error 

(我插入的评论使得这一点更加难以理解,但在实践中通常不需要这样的评论)。

这确保了i不会在外循环之外存在。 这也意味着j不能在外循环中意外使用。 实际上,当打算使用j时很容易输入i (反之亦然) – 例如,它们在QWERTY键盘上靠得很近。 ij视觉上看起来非常相似,因此可视代码检查经常会错过这些错误。 但是,使用这样的方法,COMPILER将检测到这样的拼写错误。 如果有选择,最好让编译器选择错误,而不是让人类找不到它们。

当然,这并不能防止在内循环中误导或交换ij – 但这是导致经常鼓励使用比ij更多信息名称的一个原因 – 滥用视觉上不同的名称对于凡人来说更容易检测。

第二种方法是最好的方法

  1. 它可以使用低内存
  2. 如果在任何其他循环中需要,允许再次使用相同的变量