for(;p<=temp->list+length-1&&*p!=value;p++) ;//不满足循环条件,退出
if(p<=temp->list+length-1) //是*p==value的情况
{
ret = *(p-1);
return true;
}
return false; //是p>temp->list+length-1的情况
分析:
当p>temp->list+length-1 或者 *p==value时,退出for循环,
//此时只需排除上述两者可能的一种,就一定是另一种可能。
理解方法1:有件事,是A或者B做的,已知不是A,那么肯定就是B了。
理解方法2:理解成电路并联:已知开关1和开关2并联,开关1或开关2 闭合都会使电路导通,其中就开关1,2理解成退出for循环的条件。
现在发现电路导通,但是开关1并没有闭合,则一定是上表中的第二种情况,即开关2闭合了。
开关1(p>temp->list+length-1) | 开关2(*p==value) | 电路 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
理解方法3:理解成电路串联,开关1且开关2闭合,电路导通,其中就开关1,2理解成for循环中的条件,如下所示:
开关1(p<=temp->list+length-1) | 开关2(*p!=value) | 电路 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
1 | 1 | 1 |
上表中,每一行的的两个开关之间的关系是 且 的关系,如第一行中,开关1闭合且开关2断开则电路不通,如下3行一样。
再回到文章开头for循环示例:
for(;p<=temp->list+length-1&&*p!=value;p++) ;//不满足循环条件,退出
if(p<=temp->list+length-1) //这条的含义是:p<=temp->list+length-1且*p==value的情况
{
ret = *(p-1);
return true;
}
return false; //是p>temp->list+length-1且*p!=value 和 p>temp->list+length-1且*p==value两种情况都不合理。
总结:理解思路3更好一些,
两个循环条件且的关系->循环条件不满足,跳出循环->有3种条件情况,只取符合要求的那一种,即p<=temp->list+length-1且*p==value的情况