while循环排除条件

时间:2013-07-13 01:42:13

标签: c++ c

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

请考虑以下事项:

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

如果pEnd为空,我希望将其从比较中排除,以便pIt没有上限。显然上面的代码不起作用,因为当pIt >= pEnd'或'开始发挥时,它将始终为真。

如何做到这一点?

5 个答案:

答案 0 :(得分:7)

好吧让我们稍微解构你的状况。所以在顶层我们有两个部分计数器和迭代器,并且必须满足这两个条件才能继续,所以我们有:

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))

希望这有帮助!

答案 1 :(得分:2)

怎么样:

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

答案 2 :(得分:1)

如果你习惯于阅读三元运算符,这很清楚:

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

答案 3 :(得分:0)

只需:

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

答案 4 :(得分:0)

这不是一个答案,而是作为代码注释。 在SO糟糕的评论代码选项

中握拳

当你遇到脑弯曲的逻辑问题并且在它上面睡觉不是一个选项时,用for(;;)循环解构。

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

    --nVal;
    ++pIt;
}