以下是引用yuccn在2013-4-12 20:49:05的发言:
主要是变量的作用域不同引起的吧。
跟编译器有关,别太纠结他
呵呵,主要是他解释错了...
的确是作用域不同,但原因不是因为什么编译器默认定义过...
干脆来科普一下吧...
在C语言创立的最初阶段是没有for循环的,只有while循环...
至于为什么没有for循环,这牵扯到C的其中一个设计哲学,就是精炼...
既然已经有了一种循环,就不必创造另一个...
关于C的另一个设计哲学就是"这是为编程人员开发的语言"
不深谈,自己去科普...
最后C还是创造了for循环,原因不可考,反正我不知道原因...
但是早期的C语言实现For循环的方法很奇特...
在编译期间会把for循环变成while循环进行编译...
也就是说,表面上C支持for循环,但是其实C耍了一点滑头,编译器欺骗了你幼小的心灵...
所以以下代码就成了这样...
你看着你写的
for(int index = 0; index < N; ++index)
其实在你点编译的时候
C编译器默默的把这个循环变成了
int index = 0
while(index < N)
{
++index
}
这随之而来带来一个问题...就是index本来定义在for里面的,被编译器默认提到了循环外面去执行...
在九十年代末...
这个问题引起了广大的编程大牛的热烈讨论
一半的人认为,for实际上是一种没必要的东西...while已经很够用了...你看,引入for反而引起不必要的歧义,也就是二义性...主张重新废除for
另一半则认为for实际上是另一种循环控制语句...是有存在的必要的...和while各司其责...
早期的编译器默认将for改成while的编译行为就引起了楼主所谓的j重复定义...因为其实变成while循环以后...两个j都定义在同一个作用域里面
这种编译效果直到vs2003,微软一直都是这么编译的(GCC重写for的编译行为比微软的编译器要早,具体哪个版本不可考...)
直到VS2005,微软才重新定义了for的编译行为,可能是因为GCC重写了for以后,C++的代码平台移植不方便吧...
也可能是大牛们的讨论终于以一方的胜利而告终...
具体原因我也不知道...反正微软妥协了,重写了for的编译行为
至此,for里面定义的变量才真正的将变量作用域局限在了循环体内...
[
本帖最后由 peach5460 于 2013-4-12 21:09 编辑 ]