| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 827 人关注过本帖
标题:for循环呀,for循环呀,for循环呀
只看楼主 加入收藏
lch23
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-9-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
for循环呀,for循环呀,for循环呀
请教:

for(i=1,sum=0;sum+=i,i<=100;i++);
for(i=1,sum=0;i<=100,sum+=i;i++);
执行结果分别为:
2009-09-08 21:41
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
自己写程序,自己看结果。
2009-09-08 21:57
chenaiyuxue
Rank: 5Rank: 5
来 自:山东滨州
等 级:职业侠客
帖 子:334
专家分:370
注 册:2008-5-20
收藏
得分:0 
回复 楼主 lch23
上机试一下就知道了
第一个for循环的结果是sum = 5151,第二个for循环的结果是sum = 0
从结果来看,在第二个for循环中一旦执行了i <= 100这个条件判断,后面的sum += i就不会执行了。
不知道这是不是C语言的规定,还请高手指点。


你是雪,我是尘埃,相遇是意外;你坠落,在我胸怀,流进我血脉。
2009-09-08 21:59
jackface
Rank: 2
等 级:论坛游民
帖 子:63
专家分:17
注 册:2009-4-15
收藏
得分:0 
奇怪了,我运行了一下,上面sum=5050;
下面根本没结果.
2009-09-09 00:38
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:20 
以下叙述以32位int来说明。
1. 第一个结果是5151没错。  
                                                                 .  
2. 对于第二个,我们这里首先假设i和sum均为int类型。
第一要说的是,这里的逗号表达式还是起作用的。中间条件先检验i是否小于等于100,但无论i是否小于等于100,都要给sum累加i,所以逗号表达式的结果就是sum,但因为是for循环,所以这里会把sum的结果(也就是逗号表达式的结果了)和0(假)做比较,以决定循环条件是否满足,如果sum不为0,则i++,然后又继续给sum累加。也就是说,只要sum != 0,这个for将一直循环下去。
注意:因为这里逗号表达式的结果与i<=100没有任何关系,所以,编译器可能会优化掉它,而仅仅计算sum += i和i++,并测试sum是否为0。
                                                                 .
但sum最终还会是0,不过将会耗费大量的时间才能运行到这个结果。过程如下:
<1> i从1开始增加,一直增加到int类型的最大正整数0x7FFFFFFF。这个过程i给sum的贡献是一直在增加sum的值,当i=0x7FFFFFFF时,能给sum增加的值(考虑正负号)将达到最大;
<2> 随后,i++,将会导致i突变为最小的负数:0x80000000。从这里开始,因为i的值是负的,所以导致sum又开始递减,最终sum又把i起初给它增加的那些数量慢慢的给吐了出来。并且,直到sum 等于1,而i等于-1。sum + i = 1 + -1 = 0,循环退出。
                                                                 .
如果i是32位的int,循环将会耗费很长时间(但一定会结束)。我们这里用一个简单的测试方法就是分别令i和sum为char类型和short类型并使用如下代码进行测试(VC6 + Debug方式):
程序代码:
 
#include <stdio.h>  
#include <stdlib.h>  
  
int foo(void)  
{  
    char sum, i;    // 第二次测试时把char换位short 
  
    for(i=1,sum=0; i<=100, printf("%d %d\n", sum, i), sum+=i; i++);  
    printf("%d\n", sum);  
  
    return 0;  
}  
  
int main(void)  
{  
      
    foo();  
    return 0;  
} 

编译后,在命令行下依据char和short分别输入:
>test.exe > result_char.txt
>test.exe > result_short.txt
然后打开这两个文本文件,观察sum和i的变化过程,即可发现sum最终为0的原因。
                                                                 .
最后,我们把char和short分别改为unsigned char和unsigned short,尽管期间sum和i的对应关系很怪异,但sum最终还是0。

[ 本帖最后由 prankmoon 于 2009-9-9 01:24 编辑 ]
2009-09-09 01:22
迷途流浪
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:20
专家分:139
注 册:2009-9-6
收藏
得分:0 
楼上,可谓是 博得云开见明月 哈哈

受教受教!!
2009-09-09 02:28
hackzbst
Rank: 2
等 级:论坛游民
帖 子:27
专家分:54
注 册:2009-6-10
收藏
得分:0 
回复 6楼 迷途流浪
受教了记得给分额~~~

别迷恋哥,哥只是一个传说......
2009-09-09 08:09
ic06123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:57
注 册:2009-9-2
收藏
得分:0 
最好别这么着写for语句。。。
2009-09-09 09:05
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1686
专家分:4252
注 册:2007-12-27
收藏
得分:0 
不妨写成for(i=1,sum=0;i<=100&&sum+=i;i++);

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2009-09-09 11:29
快速回复:for循环呀,for循环呀,for循环呀
数据加载中...
 
   



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

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