bba*_*ker 1 c coding-style declaration c11
我注意到C11不再允许您在循环结构中声明迭代器变量,例如,以下内容无效:
for (int i = 0; i < 10; ++i)
Run Code Online (Sandbox Code Playgroud)
但这没关系:
int i;
for (i = 0; i < 10; ++i)
Run Code Online (Sandbox Code Playgroud)
鉴于在C99之前甚至不可能在函数开头声明变量(块?C11是否允许函数中任何地方的变量声明?),我很好奇这与安全实践有什么关系.迭代器是应该在它们出现的函数或块的顶部声明,还是在它们被使用的第一个循环之上?我无法看到它在任何方面都有很大的不同,但前一种方法似乎对于移动代码更加健壮.就安全而言,我没有看到任何明显的影响.
另外,首先是C11上述变化的原因是什么?我更喜欢第一个例子中的语法.
编辑:对于我的上一个问题,我想一个问题是,如果多次使用迭代器,for (int i = 0; ...在一个块内移动就不会那么容易重构.
你在哪里得到这个想法?
在C11草案,节6.8.5(1),说:
迭代声明:
而(表达)陈述
做 声明 而(表达);
for(表达式opt ; 表达式opt ; 表达式opt)语句
for(声明 表达式opt ; 表达式opt)语句
最后一种形式清楚地表明声明的第一个子句中仍然允许for声明.
[更新]
请注意,声明是这样的int i = 0 ;.也就是说,它包括分号(见6.7节).所以for (int i = 0 ; i < 10 ; ++i)C11绝对允许.
[更新2]
至于什么时候使用哪个,这是一个意见问题.我的意见是你应该尽可能地嵌入声明,因为它使代码更容易阅读.
如果我正在阅读您的代码,我看到:
for (int i = 0 ; i < 10 ; ++i)
...
Run Code Online (Sandbox Code Playgroud)
...然后我知道你不依赖i循环终止后的值,因为它不再在范围内.
如果我看到:
int i;
for (i = 0 ; i < 10 ; ++i)
...
Run Code Online (Sandbox Code Playgroud)
...然后我希望你能使用以后的价值i; 也许你break很早就想知道i发生了什么事.如果我i以后没有看到你使用,我可能会想知道你在想什么和/或我错过了什么.
像往常一样,可读性是最重要的指标.当然,符合"可读性"的是一个意见问题.
| 归档时间: |
|
| 查看次数: |
422 次 |
| 最近记录: |