而循环排除条件
while loop excluding a condition
我在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
(至少对我来说,把和比较的内容放在右边更自然)。
现在是有点棘手。要么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))
希望这能有所帮助!
怎么样:
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;
}
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有太多条件句的情况下,我如何避免被零除
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 将按位if条件转换为普通if条件
- 条件断点在不应该触发时触发
- 为什么简单的算术减法在"if"条件下不起作用?
- 如何在for循环中包含两个索引值的测试条件
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 我提出什么条件才能再加5%的折扣
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 是否可以通过模板参数上的条件排除模板成员变量
- 而循环排除条件
- 条件正则表达式,用于排除某些目录
- 编译时基于模板参数的条件包含/排除代码