Chinaunix

标题: c语言中关于for循环的问题 [打印本页]

作者: 坐在地平线    时间: 2011-11-03 16:08
标题: c语言中关于for循环的问题
今天学习c语言中的循环,对于书中的几句话很是纠结,不知道什么意思,在晚上查查也查不到。所以在这里只有求助于各位大哥了。我在这里先谢谢了。下面是两段代码:
第一段:
#include <stdio.h>
int main(void)
{
        int count =0;
        for(count = 1;count <= 10; ++count)
                printf("%d\t",count);
            printf("we have finished\n");
                printf("%d",count);
        return 0;
}
第二段:
#include <stdio.h>
int main(void)
{
        for(int count = 1;count <= 10; ++count)
                printf("%d\t",count);
            printf("we have finished\n");
                printf("%d",count);
        return 0;
}
书上说:通常情况下,除非控制循环的变量非常靠近循环语句,否则最好在第一个控制表达式中初始化它。这样可以避免潜在的错误也可以在第一个控制表达式中声明循环变量,此时,该变量是循环的本地变量。循环结束后他就不存在了。所以不能在循环结束后输出它的值。如果需要在循环的外部访问循环控制变量,就应该在循环前面的一个语句中声明它。
蓝色的句子我明白,但是红色的我就弄不懂了。照这样说,上面两段代码输出结果应该有所不同,但是实际的运行结果却是一样的,求解!
作者: onezee    时间: 2011-11-03 16:17
意思是建议在for语句中声明变量 像这样 int count = 1
作者: 坐在地平线    时间: 2011-11-03 16:39
该变量是循环的本地变量。循环结束后他就不存在了。所以不能在循环结束后输出它的值。这句话是什么意思?
作者: zcheung    时间: 2011-11-03 16:50
不知道你看的什麼書,能出來本地變量,我就已經看到很開心了。哈哈哈哈 笑死我了


對你想說的只有,孩子先學基礎吧,有了基礎再繼續學
作者: 坐在地平线    时间: 2011-11-03 16:56
本帖最后由 坐在地平线 于 2011-11-03 16:58 编辑

回复 4# zcheung
我看的是c语言入门经典(第四版),我现在就是学的基础,书上也不能面面俱到吧,所以就上网看看了。不知道这位大哥有什么建议?小弟洗耳恭听!
我说说我不明白的问题,不知道有什么好笑的,请指教!
作者: zcheung    时间: 2011-11-03 17:04
回复 5# 坐在地平线


    我笑的不是你, 而是此書的翻譯(如原是外國的)。  呵呵
  

    別的 沒什麼想對你說的, 自己看著來吧。
作者: 坐在地平线    时间: 2011-11-03 17:09
回复 6# zcheung
哦,那还是得谢谢了,我以后得注意点翻译方面的问题。我的英语水平现在不好,要不我直接看原版了
作者: hokuhouhi    时间: 2011-11-03 17:13
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.         for(int count = 1;count <= 10; ++count)
  5.         {
  6.                 printf("%d\t",count);
  7.                printf("we have finished\n");
  8.          }
  9.          printf("%d",count);
  10.         return 0;
  11. }
复制代码
第二段和这个等价,加个大括号就可以了~~~
作者: MMMIX    时间: 2011-11-03 17:21
蓝色的句子我明白,但是红色的我就弄不懂了。照这样说,上面两段代码输出结果应该有所不同,但是实际的运行结果却是一样的,求解!
坐在地平线 发表于 2011-11-03 16:08



    你用的啥编译器?第二段代码 gcc 根本就编译不过去。
作者: lz_fine    时间: 2011-11-03 17:22
我不知道你是在什么环境下用什么编译器编译的,总之我在linux下用gcc编译器编译第二个程序时出错
[root@Fedora14New for]# gcc -c for.c -o for -std=gnu99
for.c: 在函数‘main’中:
for.c:7:29: 错误:‘count’未声明(在此函数内第一次使用)
for.c:7:29: 附注:每个未声明的标识符在其出现的函数内只报告一次

意思就是count这个变量没有声明,也就是说count这个变量只能在for循环里面使用,出了for循环之后就不能再使用了,就算你的编译器没有检查这个,出了for循环再使用count也是很危险的,要避免这么做
之所以c99标准可以这么做,应该就是为了方便程序的编写,但是新手的话不要在这些问题上纠结,知道有这么回事就可以了,就算现在不明白也没事,可以先用比较安全,不容易引起歧义和误会的方式实现就好
作者: 坐在地平线    时间: 2011-11-03 17:23
回复 8# hokuhouhi [谢谢了,不过还得打扰一下,该变量是循环的本地变量。循环结束后他就不存在了。所以不能在循环结束后输出它的值
,这一句话是什么意思?
作者: MMMIX    时间: 2011-11-03 17:27
回复  hokuhouhi [谢谢了,不过还得打扰一下,该变量是循环的本地变量。循环结束后他就不存在了。所以不能在 ...
坐在地平线 发表于 2011-11-03 17:23



    这句话里面也没有什么生僻字/词/语法呀,你什么地方不理解?
作者: 1l2h3z    时间: 2011-11-03 17:27
“本地变量”意思是说第二段中的count在for中定义,生存期为for语句,for结束后此变量就不存在了;第一段中的count在for之前定义,因此生存期为main函数,for语句结束后依然存在。
作者: lz_fine    时间: 2011-11-03 17:29
回复  hokuhouhi [谢谢了,不过还得打扰一下,该变量是循环的本地变量。循环结束后他就不存在了。所以不能在 ...
坐在地平线 发表于 2011-11-03 17:23


就是出了for循环这个count变量就不能再使用了
如果要想详细解释,就是一个变量都是有作用范围的,比如说一个函数内的局部变量,就只能在这个函数内使用,出了这个函数就不能使用了,不同的函数可以声明相同的变量名,但是他们之间都是独立的,互不干扰,而在for循环中定义的变量,就只能在for循环中使用,出了for循环就不能使用了,这个变量的作用范围你可以去查相关的资料,应该有更详细的解释。
作者: 坐在地平线    时间: 2011-11-03 17:29
回复 10# lz_fine
我的是在windows xp下visual C++6.0环境,谢谢了,我不会在纠结这个问题了。
作者: lz_fine    时间: 2011-11-03 17:30
“本地变量”意思是说第二段中的count在for中定义,生存期为for语句,for结束后此变量就不存在了;第一段中 ...
1l2h3z 发表于 2011-11-03 17:27


这个是处女贴啊
作者: 坐在地平线    时间: 2011-11-03 17:32
都谢谢大家了,我现在明白了,
作者: MMMIX    时间: 2011-11-03 18:15
回复  lz_fine
我的是在windows xp下visual C++6.0环境,谢谢了,我不会在纠结这个问题了。
坐在地平线 发表于 2011-11-03 17:29



    学 C 就不要用 C++ 的环境了。
作者: dcx2k3    时间: 2011-11-04 09:54
第二段的count在循环以后就消失了,等于没有定义,没定义又想打印,就出错了。
作者: dcx2k3    时间: 2011-11-04 09:57
就是说第二段的结果随系统而定,使用方式是错误的
作者: siseniao    时间: 2011-11-04 10:13
本地变量的翻译没错误,相对于外部变量,这个问题就是变量的生存周期问题
作者: 坐在地平线    时间: 2011-11-04 10:22
回复 18# MMMIX
谢谢,受我们教材的影响了,看来我的换个软件了
作者: huangzhenfan    时间: 2011-11-04 16:40
回复 5# 坐在地平线


    推荐看 C Primer Plus 第五版
作者: SharpLinux    时间: 2011-11-04 18:38
for里面声明的变量是局部变量,只在for循环里有效
作者: yuxuangh    时间: 2011-11-06 10:12
他所说的本地变量, 应该就是那个变量在循环体中声明, 在循环体中有效, 循环结束, 这个本地变量生命周期也随之结束。

但是在纯C 的编译器里, 貌似这样没办法编译。
作者: fender0107401    时间: 2011-11-06 10:54
本地变量
作者: chinesedragon    时间: 2011-11-06 11:33
这个应该和编译器有关系,有的编译就会报错,有的不会。
比如VC6的就不会报错,但VC2010的应当会报错。
作者: MMMIX    时间: 2011-11-06 11:44
这个应该和编译器有关系,有的编译就会报错,有的不会。
比如VC6的就不会报错,但VC2010的应当会报错。
chinesedragon 发表于 2011-11-06 11:33



    第二個程序不報錯只能是編譯器做的有問題。話說 VC6 有這麼爛麼?不應該呀。
作者: lhy0416    时间: 2011-11-06 12:02
vc6对第二个程序
C:\Documents and Settings\Administrator\桌面\mmm\tttt.c(4) : error C2143: syntax error : missing ';' before 'type'
作者: pmerofc    时间: 2011-11-06 12:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: MMMIX    时间: 2011-11-06 14:53
回复 28# MMMIX


    查了一下,第二個程序 VC6 不報錯不是由於太爛,而是由於太老。
作者: X-Hawk    时间: 2011-11-06 14:57
VC6不错,咱还在经常用它
作者: MMMIX    时间: 2011-11-06 14:58
把编译C++代码误认为是在编译C代码,当然不报错
pmerofc 发表于 2011-11-06 12:15



    for (int i = 0, ...) 這裡 i 的作用域新的 C++ 標準已經改了,VC6 使用的是老的規則。
作者: MMMIX    时间: 2011-11-06 15:02
VC6不错,咱还在经常用它
X-Hawk 发表于 2011-11-06 14:57



    DOS 也挺不錯的,而且現在也有許多人在用它。可要是誰現在初次接觸計算機還用它做日常使用的 OS,那就是犯傻了。
作者: pmerofc    时间: 2011-11-06 16:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: X-Hawk    时间: 2011-11-06 16:32
VC6加
#define for if(0){}else for
作者: MMMIX    时间: 2011-11-06 16:51
老规则也不应该那样在for以外有效吧?
pmerofc 发表于 2011-11-06 16:04



    可它就是那樣的。
作者: ecloud    时间: 2011-11-07 10:34
dev-c++ with gcc3.4.2测试
.c的话循环变量必须提前声明
.cpp允许在for里面声明变量,但是循环外有的话也会报编译错误

-----------------------

感觉,不针对某一特定版本的编译器的话,C语言这玩意儿没法说清楚,而且C和C++还混乱。这真是一锅粥
作者: drangon    时间: 2011-11-07 10:46
老老实实把 i 定义到for外面就得了,何必跟编译器过不去呢,写代码的重点应该在模块划分、业务逻辑设计,而不是这种语法的细微末节上
作者: lhy0416    时间: 2011-11-07 10:56
标准的存在有其重要的意义。
但在标准的实现中却经常是实现的是部分标准。
同时标准外还有一些潜规则。
作者: chinesedragon    时间: 2011-11-07 14:40
第二個程序不報錯只能是編譯器做的有問題。話說 VC6 有這麼爛麼?不應該呀。
MMMIX 发表于 2011-11-06 11:44



    VC6本来就不是很支持标准C嘛
作者: 幻の上帝    时间: 2011-11-07 15:01
学 C 就不要用 C++ 的环境了。
MMMIX 发表于 2011-11-03 18:15


VC++6比起C来更不适合学C++。
当然,学C99也很不适用。
作者: ecloud    时间: 2011-11-07 15:13
标准的存在有其重要的意义。
但在标准的实现中却经常是实现的是部分标准。
同时标准外还有一些潜规则。
lhy0416 发表于 2011-11-07 10:56



    潜规则?

比如 0==a ?
作者: ecloud    时间: 2011-11-07 15:15
老老实实把 i 定义到for外面就得了,何必跟编译器过不去呢,写代码的重点应该在模块划分、业务逻辑设计,而 ...
drangon 发表于 2011-11-07 10:46



    你没发现很多人(包括本版一些著名人物)正是乐于此道么,比如那个经典的i+=i--=……
作者: motalelf    时间: 2011-11-07 15:15
潜规则?

比如 0==a ?
ecloud 发表于 2011-11-07 15:13



    苹果装B大神V5
作者: lexken    时间: 2011-11-07 17:57
回复 1# 坐在地平线


    在for 後的範圍加上花括號就清楚怎麼回事了.
作者: insmile    时间: 2011-11-08 01:07
建议看《C程序设计语言》,或者c99,变量的作用域问题
作者: crazyleen    时间: 2011-11-08 08:52
很明显的错误,for循环中定义的局部变量,在for{}之内有效,for外面是无效的。这个是变量作用域的问题。

但是在函数外引用,能读取到正确值的话,是因为那个变量的空间还未被重新使用,保存有原来的值。其实你引用的是垃圾内存,它是不可靠的。
作者: sharkww    时间: 2011-11-08 09:29
回复 1# 坐在地平线


    当初我也有同样地疑惑,感慨一下,其实这个问题就是变量的生命周期问题,有C中就有全局变量和局部变量的区别嘛。第一个代码中count是在main函数中声明的,所以它的生命周期是整个main函数,当main函数执行完了,它也就被释放了。第二个函数在for的初始化语句中声明,它的生命周期就是整个for循环,当for循环结束了,它也就被释放了。就是这么个意思。
作者: free4537    时间: 2011-11-15 14:44
用 Code::Blocks 吧,免费、开源且比 VC++ 小巧,装完后再找个本地语言包汉化下就好了

回复  lz_fine
我的是在windows xp下visual C++6.0环境,谢谢了,我不会在纠结这个问题了。
坐在地平线 发表于 2011-11-03 17:29

作者: 狗蛋    时间: 2011-11-15 14:58
DOS 也挺不錯的,而且現在也有許多人在用它。可要是誰現在初次接觸計算機還用它做日常使用的 OS, ...
MMMIX 发表于 2011-11-06 15:02



    曾见过某省级人民医院购置一批奔腾4计算机,然后……卸载预装的windows,全部改用DOS……

据说是因为他们上学时只学了DOS,不会用windows……

偶大惊:这可真是买辆劳斯莱斯,套头驴拖着……
作者: caiyijun1987    时间: 2011-11-18 09:22
也可以在第一个控制表达式中声明循环变量,此时,该变量是循环的本地变量。

这句话的用法是c99标准规定的,也就是说他可以在第一个控制表达式中声明循环变量,但是他的作用域是这个循环块内部,在外部不能被引用。
你可以用这样编译代码:gcc main.c -std=c89
main.c: In function ‘main’:
main.c:4: error: ‘for’ loop initial declarations are only allowed in C99 mode
main.c:4: note: use option -std=c99 or -std=gnu99 to compile your code

main.c

#include <stdio.h>
int main(void)
{
    for (int count = 1; count <= 10; ++count)
    printf("%d\t", count);
    printf("we have finished\n");
    return 0;
}
作者: keytounix    时间: 2011-11-18 10:42
回复 9# MMMIX


    g++啊
不是GCC
作者: keytounix    时间: 2011-11-18 10:45
本帖最后由 keytounix 于 2011-11-18 10:57 编辑
本地变量
fender0107401 发表于 2011-11-06 10:54


i.local
作者: keytounix    时间: 2011-11-18 10:52
回复  hokuhouhi [谢谢了,不过还得打扰一下,该变量是循环的本地变量。循环结束后他就不存在了。所以不能在 ...
坐在地平线 发表于 2011-11-03 17:23



给个简单的eg
//t.c
#include <unistd.h>
int main(int n ,char *v[])

    {
    int count=100;
   for(int count=10;count<11;count ++)
        printf("in for,count=%d\n");

   printf("out of for count=%d",count);


return 0;


}

这个输出结果是
in for,count=10
out for ,count =100

注意
编译的时候是使用g++的
g++ -S t.c
后发现

。。。。
count .local
          xxxxx

count.1087
     do 循环
end count.1087

打印 count.local

end count.local

大约是这个结构
作者: MMMIX    时间: 2011-11-18 13:56
回复  MMMIX


    g++啊
不是GCC
keytounix 发表于 2011-11-18 10:42



    C 的代码干嘛用 g++ 编译?当然,这么做也不是不可以,但前提是你得知道自己在做什么。
作者: keytounix    时间: 2011-11-18 14:02
回复 56# MMMIX


    for(int i=0;i<10;i++);
就这个东西
在wintc下不能通过
在vc下能通过
在gcc下不能通过
在g++下能通过




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2