今天有人问了我一个问题,发现了一个一直以来的错误的认知,后来去实践了一下
原问题是关于for循环的,他认为经过for循环的3条语句,tmp应该此时的值应该是第二个结点,但实际输出是第一个节点的值,所以他很不解
原单链表遍历时的代码
// 遍历
void listForEach(node * head)
{
if(isEmpty(head))
return;
for(node * tmp=head->next; tmp!=NULL; tmp=tmp->next)
{
printf("%d->", tmp->data);
}
printf("\n");
}
其实根本原因就在于for循环执行顺序认知错误,就打算总结一下:
for循环在执行的过程中:
for(条件①;条件②;条件③){
循环体④}
执行顺序 1->2->4->3
首次执行时,先执行表达式1,然后判断表达式2是否成立,不成立则停止执行。表达式2成立的话,再执行表达式4,最后执行表达式3。
之后的循环,先执行表达式2,判断表达式2是否成立,不成立则停止执行;成立的话,继续执行表达式4,再执行表达式3,直到不满足表达式2,退出循环。