而循环排除条件

while loop excluding a condition

本文关键字:条件 排除 循环      更新时间:2023-10-16

我在while循环中增加一个指针并减少一个计数器。当计数器达到零或指针等于最大点(如果存在)时,我想退出循环。如果部分给了我问题。

考虑以下内容:

char * pIt = utf8str;
char ** pEnd = 0;
size_t nVal = 10;
while ( 0 < nVal && (pEnd && pIt < *pEnd || true) )
{
    --nVal;
    ++pIt;
}

如果pEnd为null,我希望它从比较中排除,这样pIt就没有上限了。显然,上面的代码不起作用,因为当pIt >= pEnd时,"或"开始发挥作用,并且将始终为真。

一个人会怎么做?

好的,让我们稍微解构一下你的条件。因此,在顶层,我们有两个部分——计数器和迭代器,必须满足这两个条件才能继续,因此我们有:

A && B

现在A是最简单的,那就是:nVal > 0(至少对我来说,把比较的内容放在右边更自然)。

现在是有点棘手。要么pEndnullpIt没有上界,要么pEnd存在。意思是B == C || D。所以,让我们潜水

A && (C || D)

现在,如果pEnd为空,我们希望它为真,对吗?null是false,所以当false时我们想要true,那么我们该怎么办?!pEnd。这给了我们C.

最后我们得到了D。这就是pIt有上界的情况。pIt < *pEnd

让我们把这些放在一起,我们有:

nVal > 0 && (!pEnd || (pIt < *pEnd))

希望这能有所帮助!

怎么样:

while ( 0 < nVal && (!pEnd || pIt < *pEnd) )

如果你习惯于读取三元运算符,这是非常清楚的:

while (0 < nVal && (pEnd ? pIt < *pEnd : true))

只是:

((pEnd == NULL) || (pIt < *pEnd))

这不是一个答案,而是一个带有代码的注释对SO糟糕的评论代码选项挥拳

当你遇到一个令人费解的逻辑问题,并且无法解决时,可以用for(;)循环进行解构。

for (;;) {
    if (nVal <= 0)
        break;
    if (pEnd == nullptr) {
        // logic test you want here
    }
    --nVal;
    ++pIt;
}