以下叙述以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 编辑 ]