我正在增加一个指针并减少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
'或'开始发挥时,它将始终为真。
如何做到这一点?
答案 0 :(得分:7)
好吧让我们稍微解构你的状况。所以在顶层我们有两个部分计数器和迭代器,并且必须满足这两个条件才能继续,所以我们有:
A && B
现在A
,是最简单的,那就是:nVal > 0
(至少对我而言,在右侧比较到更为自然)。
现在有点棘手。 pEnd
为null
且pIt
没有上限,或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;
}