ANSI C-变量范围

ANSI C-变量范围,c,C,这里的C++程序员最近被邀请做一些C编程。 正在寻找ANSI C兼容代码中变量范围规则的更新 以下代码是否符合ANSI C标准 void foo_func(void) { int i = 0; printf("i = %d\n", i); for (int j = 0; j < 10; ++j) { printf("j = %d\n", j); } } void foo_func(void) { int i=0; printf(“i=%d

这里的C++程序员最近被邀请做一些C编程。 正在寻找ANSI C兼容代码中变量范围规则的更新

以下代码是否符合ANSI C标准

void foo_func(void)
{
    int i = 0;

    printf("i = %d\n", i);

    for (int j = 0; j < 10; ++j) {
       printf("j = %d\n", j);
    }
}
void foo_func(void)
{
int i=0;
printf(“i=%d\n”,i);
对于(int j=0;j<10;++j){
printf(“j=%d\n”,j);
}
}
变量
j
是否需要在函数开始时声明? 我的理解是,
for()
隐式地启动了一个新的作用域。就是,;甚至在开门红之前

这同样适用于
while()
if()
? 那么,
do。。while()

C89和C99或更高版本的范围规则是否有所不同

变量j是否需要在函数的开头声明

是的,如果您使用的是C89。或者,至少您需要使用
{..}
引入一个作用域并声明它

while()和if()是否同样适用?那你呢。。while()

语法不允许在其中声明变量(即,
,而(inti=0)
无效)。但是您可以声明insde,这在所有C标准中都是允许的

C98和C99或更高版本的范围规则是否有所不同

没有C98,但C99和更高版本中的规则发生了更改,允许您在
for
循环中声明变量(正如您在代码中所做的那样)

以下代码是否符合ANSI C标准

void foo_func(void)
{
    int i = 0;

    printf("i = %d\n", i);

    for (int j = 0; j < 10; ++j) {
       printf("j = %d\n", j);
    }
}

这取决于“ANSIC”指的是什么。它在C99及更高版本中有效。

>我的理解是for()隐式地启动了一个新的作用域。就是,;甚至在打开支架之前。

对。 从

迭代语句是一个块,其作用域是其封闭块作用域的严格子集。循环体也是一个块,其范围是迭代语句范围的严格子集

这也适用于其他国家

>while()和if()是否同样适用?那你呢。。while()?


if()
while()
do..while()
循环中,不能像
if(int j=0)
while(int j=0)
那样声明变量,而ANSI C是当前的C。我假定您指的是C89的口语。您的代码是有效的C99和C11。C89无效。请问C98是什么?C89是指当年(可能是提案年)发布的C标准(?)。基本上是C标准的版本。打字错误:C89(已修复)@Lundin-垃圾。你可能有这种看法,我不认为它是正确的。但“你”不是“我们”。这并不是一个你永远不会正式表态的问题。谢谢,我在最初的问题中打错了。它的本意是读“C89”,但我想你也猜到了。另外,在我看来,询问是否同样适用于其他循环/条件情况是一个有点愚蠢的(附带)问题。“ANSI C”有点模棱两可。我从不确定它是指当前的标准(C11)还是指C89(通常人们称之为“ANSIC”)。所以最好还是尽量避免。是的,我理解你的问题,希望我已经回答了!Re:是的。我觉得很愚蠢,我建议同样的方法也适用于
while()
do。。。while()
。甚至是
if()
。@iwarv你不应该这样做。在我看来,如果((Handle h=OpenSomething(…)!=Handle_INVALID){…能够做到这一点将是非常棒的。@我工作过的几乎所有公司都严格禁止在他们的编码标准中使用这种复合语句,也许是出于正确的原因。但这是一个很好的观点。我觉得自己不那么愚蠢了。谢谢。