我注意到C11不再允许你在循环结构中声明迭代器变量,例如,以下内容无效:
for (int i = 0; i < 10; ++i)
但这没关系:
int i;
for (i = 0; i < 10; ++i)
鉴于在C99之前除了在函数的开头(块?Does C11 allow variable declarations at any place in a function?)之外甚至不可能声明变量,我很好奇这与安全实践有什么关系。迭代器是应该在它们出现的函数或块的顶部声明,还是在它们被使用的第一个循环之上?我无法看到它在任何方面都有很大的不同,但前一种方法对于移动代码似乎更加健壮。就安全而言,我没有看到任何明显的影响。
另外,首先是C11上述变化的原因是什么?我更喜欢第一个例子中的语法。
编辑:对于我的上一个问题,我想有一个问题是如果多次使用迭代器,那么在一个块内移动for (int i = 0; ...
就不那么容易重构了。
答案 0 :(得分:5)
你从哪里得到这个想法?
C11 draft,第6.8.5(1)节说:
迭代语句:
while (表达式)声明
执行 声明 ,(表达);
(表达式 opt ; 表达式 opt ; 表达式 opt )声明
(声明 表达式 opt ; 表达式 opt )声明
最后一个表格清楚地表明在for
语句的第一个子句中仍然允许声明。
[更新]
请注意,声明类似于int i = 0 ;
。也就是说,它包括分号(见6.7节)。所以C11肯定允许for (int i = 0 ; i < 10 ; ++i)
。
[更新2]
至于何时使用哪个,这是一个意见问题。我的意见是你应该尽可能地嵌入声明,因为它使代码更容易阅读。
如果我正在阅读您的代码,我会看到:
for (int i = 0 ; i < 10 ; ++i)
...
...然后我知道在循环终止后你并不依赖于i
的值,因为它不再在范围内。
如果我看到:
int i;
for (i = 0 ; i < 10 ; ++i)
...
...然后我希望您稍后使用i
的值;例如也许你早点break
并且想知道发生这种情况时i
是什么。如果我以后没有看到你使用i
,我可能会想知道你在想什么和/或我错过了什么。
与往常一样,可读性是最重要的指标。当然,什么是合格的&#34;可读&#34;是一个意见问题。
答案 1 :(得分:2)
根据你链接的问题,C11应该仍然允许你在for循环中声明变量(为什么它们会像往常一样破坏向后兼容性?)。
在任何情况下,如果您正在编译C89(Microsoft编译器支持的C标准),那么您只能在块的开头声明新变量(即:在大括号之后)。好消息是你可以放置一个新的块,而不仅仅是在函数的顶部,这样你就可以通过将它包装在一组额外的花括号内来模拟C99 for-loop范围:
/* ... */
{int i; for(i=0; i<10; i++){
/* ... */
}}
/* ... */