标题:请教一个循环程序在vc++6.0编译不过但visual 2008通过
只看楼主
ringlord
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2009-5-30
结帖率:80%
已结贴  问题点数:20 回复次数:8 
请教一个循环程序在vc++6.0编译不过但visual 2008通过
int main()
{
    const int N = 4;
    for (int i = 1; i <= N; i++)
   {
       for (int j = 1; j <= 30; j++)
          cout << " ";
       for (int j = 1; j <= 8-2*i; j++)
          cout << " ";
       for (int j = 1; j <= 2 * i - 1; j++)
         cout << "*";
      cout <<endl;
   }
}

这小段程序是打印一个图案的。程序本身我看着是对的,但是在VC++6.0编译出错,指出变量j重复定义了,但是变量j的作用域只存在于循环体中啊,怎么会重复定义呢?
这个程序在visual studio 2005上没有显示编译出错,正常运行了。

请教各位,这是什么原因?怎么解释?非常感谢大家
搜索更多相关主题的帖子: visual 
2013-04-12 16:11
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:7 
抛弃6.0吧

顺便说一句
即使是VS2003也会报错的
这个跟编译器有关,不需要详细解释吧?

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-12 16:23
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2391
专家分:13384
注 册:2013-3-3
得分:7 
vc6.0的编译器问题,虽然属于局部变量,但是系统默认已经定义过了,
这样写就会报错
#include <iostream.h>
 int main()
 {
     for(int i=0;i<3;i++)
         cout<<i<<' '<<endl;
     for(int i=0;i<3;i++);
     cout<<i<<' '<<endl;
     return 0;
 }
这样就不会报错。
#include <iostream.h>
 int main()
 {
     for(int i=0;i<3;i++)
         cout<<i<<' '<<endl;
     for(i=0;i<3;i++);
     cout<<i<<' '<<endl;
     return 0;
 }
 

Maybe
2013-04-12 19:01
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
以下是引用邓士林在2013-4-12 19:01:17的发言:

vc6.0的编译器问题,虽然属于局部变量,但是系统默认已经定义过了,
这样写就会报错
#include
 int main()
 {
     for(int i=0;i<3;i++)
         cout<
 int main()
 {
     for(int i=0;i<3;i++)
         cout<



我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-12 19:22
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:7 
主要是变量的作用域不同引起的吧。
跟编译器有关,别太纠结他

我行我乐
我的博客:
http://blog.yuccn. net
2013-04-12 20:49
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
以下是引用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 编辑 ]

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-12 21:06
ringlord
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2009-5-30
得分:0 
回复 6楼 peach5460
真是非常感谢,你写的让我学到了很多
2013-04-13 11:36
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2391
专家分:13384
注 册:2013-3-3
得分:0 
回复 4楼 peach5460
不就是作用域引起的么?表述有问题么

Maybe
2013-04-15 23:22
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
以下是引用邓士林在2013-4-15 23:22:19的发言:

不就是作用域引起的么?表述有问题么

行吧,我说错了

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-16 08:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-403996-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.559492 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved