在C11中放置迭代器声明(编码样式)
我注意到C11不再允许您在循环构造中声明迭代器变量,例如,以下内容无效:在C11中放置迭代器声明(编码样式),c,coding-style,declaration,c11,C,Coding Style,Declaration,C11,我注意到C11不再允许您在循环构造中声明迭代器变量,例如,以下内容无效: for (int i = 0; i < 10; ++i) for(int i=0;i
for (int i = 0; i < 10; ++i)
for(int i=0;i<10;++i)
但这没关系:
int i;
for (i = 0; i < 10; ++i)
inti;
对于(i=0;i<10;++i)
考虑到C99之前,除了在函数开头(block?)之外,甚至不可能声明变量,我很好奇这与安全实践有什么关系。迭代器应该在其所在的函数或块的顶部声明,还是在使用迭代器的第一个循环的正上方声明?我看不出这两种方法有多大区别,但前一种方法似乎对移动代码更具鲁棒性。就安全而言,我看不到任何明显的影响
此外,C11的上述变化的原因是什么?我相当喜欢第一个示例中的语法
编辑:对于我的最后一个问题,我想一个问题是,如果迭代器被多次使用,在块中移动
for(int I=0;…
将不那么容易重构。根据您链接的问题,C11应该仍然允许您在for循环中声明变量(他们为什么要这样破坏向后兼容性?)
在任何情况下,如果您是根据C89(Microsoft编译器支持的C标准)进行编译,那么您只能在块的开头声明新变量(即:大括号后面)。好消息是,您可以在任意位置放置新的块,而不仅仅是在函数的顶部,这样您就可以通过将C99 for循环作用域包装在一组额外的花括号中来模拟它:
/* ... */
{int i; for(i=0; i<10; i++){
/* ... */
}}
/* ... */
/**/
{int i;for(i=0;i根据您链接的问题,C11应该仍然允许您在for循环中声明变量(为什么它们会像那样破坏向后兼容性?)
在任何情况下,如果您是根据C89(Microsoft编译器支持的C标准)进行编译,那么您只能在块的开头声明新变量(即:大括号后面)。好消息是,您可以在任意位置放置新的块,而不仅仅是在函数的顶部,这样您就可以通过将C99 for循环作用域包装在一组额外的花括号中来模拟它:
/* ... */
{int i; for(i=0; i<10; i++){
/* ... */
}}
/* ... */
/**/
{inti;for(i=0;i你从哪里得到这个主意的
第6.8.5(1)节规定:
迭代语句:
while(表达式)语句
do语句while(表达式)
用于(expressionopt;expressionopt;expressionopt)语句
对于(声明表达部分;表达部分)声明
最后一种形式非常清楚地表明,在for
语句的第一个子句中仍然允许声明
[更新]
请注意,声明类似于inti=0;
。也就是说,它包括分号(参见第6.7节)。因此,C11肯定允许for(inti=0;i<10;++i)
[更新2]
至于何时使用哪个,这是一个意见问题。我的意见是,您应该尽可能嵌入声明,因为它使代码更易于阅读
如果我正在阅读您的代码,并且我看到:
for (int i = 0 ; i < 10 ; ++i)
...
…然后我希望您稍后使用I
的值;例如,可能您很早就中断了
,想知道发生这种情况时I
是什么。如果我没有看到您稍后使用I
,我可能会想知道您在想什么和/或我遗漏了什么
像往常一样,可读性是最重要的指标。当然,什么是“可读性”是一个意见问题。你从哪里得到这个想法的
第6.8.5(1)节规定:
迭代语句:
while(表达式)语句
do语句while(表达式)
用于(expressionopt;expressionopt;expressionopt)语句
对于(声明表达部分;表达部分)声明
最后一种形式非常清楚地表明,在for
语句的第一个子句中仍然允许声明
[更新]
请注意,声明类似于inti=0;
。也就是说,它包括分号(参见第6.7节)。因此,C11肯定允许for(inti=0;i<10;++i)
[更新2]
至于何时使用哪个,这是一个意见问题。我的意见是,您应该尽可能嵌入声明,因为它使代码更易于阅读
如果我正在阅读您的代码,并且我看到:
for (int i = 0 ; i < 10 ; ++i)
...
…然后我希望您稍后使用I
的值;例如,可能您很早就中断了
,想知道发生这种情况时I
是什么。如果我没有看到您稍后使用I
,我可能会想知道您在想什么和/或我遗漏了什么
像往常一样,可读性是最重要的指标。当然,“可读性”是一个意见问题。整天都在工作,每天都在GCC和MSVC中。不过有一个需要注意的问题。i的范围在for{}仅循环。一如既往,在何处使用哪种形式需要一些判断。@bbarker:始终告诉gcc您要编译的C方言。请参阅注意:允许声明表达式的形式也不允许表达式-3
@david.pfx:我不这样认为……声明类似于int I=0;
…也就是说,它包括分号。请参见附录A.2.2。@bbarker:该警告已过时。它应该是“C99或C11模式”。请尝试gcc-std=C11…
全天工作,每天都在gcc和MSVC中。不过,需要注意一点。i的范围仅在for{}循环中。一如既往,在哪里使用它