今天写一个实验代码时,用到了while(exp)循环。发现exp已经为false。但是依然死循环下去。
float T = (float)work[srcNode] / (workAll/6);
int consume = 0;
float flag = 1.5;
while( T > flag ){
consume += (work[srcNode] - work[dictNode]) * node[srcNode][dictNode] / 2;
work[srcNode] = (work[srcNode] + work[dictNode]) / 2;
work[dictNode] = (work[srcNode] + work[dictNode]) / 2 ;
compute(work, &srcNode, &dictNode, &workAll);
float T = (float)work[srcNode] / (workAll / 6);
}
为了排除实验逻辑的影响,更加方便描述问题。我重新写了一个简单的while(exp)代码
int flagWhile1 = 6;
while (flagWhile1 > 1){
flagWhile1--;
printf("%d ",flagWhile1);
}
输出的结果为。并且可以成功退出。
5 4 3 2 1
那么问题就来了,怎么肥事呢?
我仔细看了两个代码,发现一个由于复制粘贴引起的不同:
while循环体内,计算T的语句是复制的
float T = (float)work[srcNode] / (workAll / 6);
这其实是又声明了一个变量。和while(T>flag)中的T不一样。
为了验证我们的想法。再次写一个简单的while(exp)。
int flagWhile2 = 6;
while (flagWhile2 > 1){
int flagWhile2=0;
printf("%d ", flagWhile2);
}
执行发现,陷入了死循环中,并且一直输出0。
这也就表明了,while循环体中的int flagWhile2其实是重新声明了一个新的变量,并不同于条件判断中的flagWhile2。
也借此告诉大家,少用ctrl+c ctrl+v;同样的语句,会造成不一样的结果,可能和你想想的不一样。