在C11中放置迭代器声明(编码风格)

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; ...在一个块内移动就不会那么容易重构.

Nem*_*emo 5

你在哪里得到这个想法?

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以后没有看到你使用,我可能会想知道你在想什么和/或我错过了什么.

像往常一样,可读性是最重要的指标.当然,符合"可读性"的是一个意见问题.

  • @ david.pfx:我不这么认为......*声明*类似于`int i = 0;`...也就是说,它包含了分号.见附录A.2.2. (2认同)