For的死循环(逗号表达式)
实例一
for(i=0 ,printf(“First=%d \n”,i );
i<10 ,printf(“Second=%d \n”,i );
i++ ,printf(“Third=%d\n”,i ))
{
printf(“Fourth=%d \n”,i);
}
在学习逗号表达式的时候,我看到了上面的一个例子,拿到编译环境进行调试的时候,发现竟然是一个死循环。我就纳闷了,这个不就是一个普通的死循环加上了输出语句,为何就变成了死循环呢?
运行结果如下:
为了避免错误,我把for循环中的输出语句全部删除,变成了下面的样子:
实例二:
for(i=0 ;
i<10 ;
i++ )
{
printf(“Fourth=%d \n”,i);
}
咦?这样就可以正常输出,为什么会这样呢?
我单步调试了实例一,发现当i>10之后,还是继续循环,这是为什么呢?
我仔细分析了for循环的结构,如下:
for(<初始化>;<条件表达式>;<增量>)
感觉 问题应该出现在条件表达式这块儿,因为只有在这个地方,才会判断有没有继续循环的必要。于是,我只是咋条件表达式的地方加上输出语句,如下:
实例三:
for(i=0 ;
i<10 ,printf(“First=%d \n”,i );
i++ )
{
printf(“Fourth=%d \n”,i);
}
发现这样就成了死循环,我突然意识到了上面的条件表达式是一个逗号表达式,而逗号表达式的最终结果是最后一个表达式的值,这也就是说是printf的返回值,暂且先不说printf的返回值,我先把输出语句放到了(i<10)前面,如下:
实例四:
for(i=0 ;
printf(“First=%d \n”,i ),i<10 ;
i++ )
{
printf(“Fourth=%d \n”,i);
}
发现输出结果正常。这么说的话,应该是printf的返回值的问题,我上网搜了一下,发现printf的返回值是输出的字符的个数,这样,问题也就清楚了,每次输出的时候,只要可以输出正常的话,printf的返回值都是>0的数,而大于0的数都是作为正的,所以,条件成立,这样,循环会继续进行,所以,就出现了上面的死循环了。
这么说的话,程序改成下面的样子就是对的了:
实例五:
for(i=0 ,printf("First=%d ",i );
printf("Second=%d ",i ),i<10 ;
i++ ,printf(“Third=%d\n”,i ))
{
printf("Fourth=%d ",i);
}
//output
运行结果