考虑一下C程序的片段:
for(int i = 0; i < 5; i++)
{
int i = 10; // <- Note the local variable
printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)
它编译没有任何错误,并在执行时,它提供以下输出:
1010101010
Run Code Online (Sandbox Code Playgroud)
但是如果我在C++中编写类似的循环:
for(int i = 0; i < 5; i++)
{
int i = 10;
std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)
编译失败,出现此错误:
prog.cc:7:13: error: redeclaration of 'int i'
int i = 10;
^
prog.cc:5:13: note: 'int i' previously declared here
for(int i = 0; i < 5; i++)
^
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
在C语言中,如果我们写这个:
for(int i = 0; i < 7; i++)
{
// for loop Body
}
Run Code Online (Sandbox Code Playgroud)
变量的范围i在for循环体内.没关系.
但是,如果我这样写:
for(int i = 0; i < 7; i++)
{
long int i = 1; // Redeclaration of i
}
Run Code Online (Sandbox Code Playgroud)
这里,变量i在循环体内再次声明,但它成功编译并在C中运行.
但是,在C++中,编译器会"重新声明'long int i'"错误.
那么,为什么C编译器没有给出重新声明错误?这是编译器错误吗?
我gcc prog.c -Wall -Wextra -std=gnu11 -pedantic在GCC编译器上使用命令编译了以下程序 .我想知道,它没有任何警告或错误,工作正常.
#include <stdio.h>
int main(void)
{
for (int i = 0; i == 0; i++)
{
printf("%d\n", i);
long int i = 1; // Why doesn't redeclaration error?
printf("%ld\n", i);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器不会生成重新声明变量i错误?