这里的C ++程序员,最近被用来做一些C编程。 寻找有关ANSI C兼容代码中变量范围规则的复习。
以下代码符合ANSI C吗?
j
变量for()
是否需要在函数开头声明?
我的理解是while()
隐含地开始了新的范围。那是;甚至在开幕式之前。
这同样适用于if()
和do.. while()
吗?
那么{{1}}呢?
范围规则在C89和C99之间是否有所不同?
答案 0 :(得分:5)
变量j是否需要在函数的开头声明?
是的,如果您使用的是C89。或者,至少你需要引入一个{ ..}
的范围并声明它。
同样适用于while()和if()吗?那怎么办..而()?
语法不允许声明变量(即while (int i = 0)
无效)。但是你可以声明 insde 它们在所有C标准中都是允许的。
C98和C99之间的范围规则是否有所不同?
没有C98,但是C99及更高版本中的规则发生了变化,并允许您在for
循环中声明变量(就像在代码中一样)。
以下代码符合ANSI C吗?
这取决于“ANSI C”所指的内容。它在C99及更高版本中有效。
答案 1 :(得分:1)
>> My understanding is that for() implicitly starts a new scope. That is; even before the opening brace.
正确。 来自C11 standards#6.8.5p5 Iteration statements
迭代语句是一个块,其范围是其封闭块范围的严格子集。循环体也是一个块,其范围是迭代语句范围的严格子集。
这同样适用于C99。
>> Does the same apply for while() and if()? And what about do.. while() ?
在if()
,while()
和do..while()
循环中,您无法声明变量,如if (int j = 0)
或while(int j = 0)
。