c中循环和外部循环中的变量重新声明?
Variable redeclaration in c in loop and outside loop?
当 int i;
语句在程序中声明 2 次时它会显示错误,但是当 int i;
写在运行两次的 for 循环中时,它不会显示任何错误。
#include<stdio.h>//code 1 showing error
int main()
{
int i;
int i;
return 0;
}
#include<stdio.h>//code 2 no error
int main()
{
for(int j=1;j<=2;j++)
int i;
return 0;
}
这是因为声明变量的作用域只在你声明她的代码块内。在那个街区外面是看不到的。
我已经看到你的代码 now.It 很清楚,在 1. 代码中你声明了两个具有相同名称的整数,这是不允许的,在 2. 代码中你声明了两个具有不同名称的 int 所以它是不错。
为了理解您的问题,也称为变量的作用域,让我们看下面的示例程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
int I = -1;
for (int I = 0; I < 3; I++) {
printf("%d\n", I);
}
printf("%d\n", I);
{
int I = 200;
printf("%d\n", I);
}
return 0;
}
如您所见,我将变量 I 声明了三次。
当在循环中声明时,结果将打印以下值:
0
1
2
在 for 循环之后,当我再次打印 I 变量时,我指的是在 for 循环外声明的变量,我声明的第一个变量,因此结果将是:
-1
现在,如果我用花括号打开一个新范围,并声明一个具有相同名称但具有不同值的新变量,我将得到:
200
我希望我对变量范围的描述现在清楚了
第一个 main
尝试定义两个具有相同标识符的变量。这显然是被禁止的,会导致编译错误。
第二个 main
包含一个 for
循环。 for
循环 引入了一个新的作用域 ,如果没有添加花括号,它只包含下一个语句或定义(即 int i;
)。
i
分配 释放 每次迭代 ,所以它真的一次只存在一次。曾经定义的所有 i
都在 不同的范围 中。因此没有命名冲突。
如果您在外部作用域中有一个变量(即main
的函数作用域)并且在内部作用域[=41=中有一个变量](即 for
-循环的范围),来自内部范围的变量 隐藏 来自外部范围的变量,从而使外部范围变量不可访问。
C11 标准说,§6.2.1.4:
Within the inner scope, the identifier designates the entity declared
in the inner scope; the entity declared in the outer scope is hidden
(and not visible) within the inner scope.
当 int i;
语句在程序中声明 2 次时它会显示错误,但是当 int i;
写在运行两次的 for 循环中时,它不会显示任何错误。
#include<stdio.h>//code 1 showing error
int main()
{
int i;
int i;
return 0;
}
#include<stdio.h>//code 2 no error
int main()
{
for(int j=1;j<=2;j++)
int i;
return 0;
}
这是因为声明变量的作用域只在你声明她的代码块内。在那个街区外面是看不到的。
我已经看到你的代码 now.It 很清楚,在 1. 代码中你声明了两个具有相同名称的整数,这是不允许的,在 2. 代码中你声明了两个具有不同名称的 int 所以它是不错。
为了理解您的问题,也称为变量的作用域,让我们看下面的示例程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
int I = -1;
for (int I = 0; I < 3; I++) {
printf("%d\n", I);
}
printf("%d\n", I);
{
int I = 200;
printf("%d\n", I);
}
return 0;
}
如您所见,我将变量 I 声明了三次。
当在循环中声明时,结果将打印以下值:
0
1
2
在 for 循环之后,当我再次打印 I 变量时,我指的是在 for 循环外声明的变量,我声明的第一个变量,因此结果将是:
-1
现在,如果我用花括号打开一个新范围,并声明一个具有相同名称但具有不同值的新变量,我将得到:
200
我希望我对变量范围的描述现在清楚了
第一个 main
尝试定义两个具有相同标识符的变量。这显然是被禁止的,会导致编译错误。
第二个 main
包含一个 for
循环。 for
循环 引入了一个新的作用域 ,如果没有添加花括号,它只包含下一个语句或定义(即 int i;
)。
i
分配 释放 每次迭代 ,所以它真的一次只存在一次。曾经定义的所有 i
都在 不同的范围 中。因此没有命名冲突。
如果您在外部作用域中有一个变量(即main
的函数作用域)并且在内部作用域[=41=中有一个变量](即 for
-循环的范围),来自内部范围的变量 隐藏 来自外部范围的变量,从而使外部范围变量不可访问。
C11 标准说,§6.2.1.4:
Within the inner scope, the identifier designates the entity declared in the inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope.