1

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

考虑以下:

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

如果pEnd为空,我希望将其排除在比较之外,因此pIt没有上限。显然,上面的代码不起作用,因为当pIt >= pEnd“或”开始发挥作用时,它将永远为真。

如何做到这一点?

4

5 回答 5

7

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

A && B

现在A,是最简单的,那就是:(至少对我来说,在右侧nVal > 0拥有我要比较的东西更自然) 。

现在 be 有点棘手。要么pEndnull并且pIt没有上限,要么pEnd存在。这意味着B == C || D。所以让我们分。

A && (C || D)

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

最后我们有 D。这是pIt有上限的情况。pIt < *pEnd.

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

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

希望这可以帮助!

于 2013-07-13T01:48:54.603 回答
2

怎么样:

while ( 0 < nVal && (!pEnd || pIt < *pEnd) )
于 2013-07-13T01:46:38.100 回答
1

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

while (0 < nVal && (pEnd ? pIt < *pEnd : true))
于 2013-07-13T01:51:02.993 回答
0

这不是作为答案,而是作为代码注释。对 SO 糟糕的注释代码选项挥舞拳头

当您遇到一个令人费解的逻辑问题并且无法选择睡觉时,请使用 for(;;) 循环解构。

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

    --nVal;
    ++pIt;
}
于 2013-07-13T05:39:05.927 回答
0

只是:

((pEnd == NULL) || (pIt < *pEnd))
于 2013-07-13T01:46:13.317 回答