这是我遇到的一个普遍问题,我还没有找到解决方案,感觉不是很“hack-y”。假设我有一些元素数组xs = {a_1, a_2, ..., a_n}
,我知道一些元素x
在数组中。我希望遍历数组,并对每个元素做一些事情,直到并包括element x
。这是一个几乎可以做到这一点的版本,只是它省略了最后一个元素。请注意,在此示例中,数组恰好是一个排序的整数列表,但在一般情况下,这可能不一定是真的。
int xs[] = {1,2,3,4,5};
for (int i = 0; xs[i] != 4; i++) {
foo(xs[i]);
}
到目前为止,我看到的唯一解决方案是:
只需foo(xs[i]);
在 for 循环后添加最后一条语句即可。这首先是丑陋和重复的,尤其是在foo
不仅是函数调用而是语句列表的情况下。其次,它需要i
在 for 循环范围之外定义。
手动中断循环,在无限循环中使用 if 语句。这对我来说再次看起来很丑陋,因为我们并没有真正充分利用 for 和 while 结构。这个问题几乎是你使用 for 循环的原型,唯一的区别是我们只是希望它再循环一次。
有谁知道解决这个问题的好方法?
在 C 中,for
循环是一个“在正文之前检查”操作,您需要“在正文之后检查”变体,一个do while
循环,例如:
int xs[] = {1,2,3,4,5};
{
int i = 0;
do {
foo(xs[i]);
} while (xs[i++] != 4);
}
您会注意到我将整个块包含在它自己的范围内(最外面的{}
大括号)。这只是为了限制 的存在,i
使其更符合for
循环行为。
就显示此内容的完整程序而言,以下代码:
#include <stdio.h>
void foo(int x) {
printf("%d\n", x);
}
int main(void) {
int xs[] = {1,2,3,4,5};
{
int i = 0;
do {
foo(xs[i]);
} while (xs[i++] != 4);
}
return 0;
}
输出:
1
2
3
4
顺便说一句,像你一样,我也没有那么热衷于其他两种解决方案,你见过。
对于第一种方案,因为寿命在这种情况下,不会真正的工作i
仅限于for
环本身(int
在for
声明中初始化节,该如此)。
这意味着i
在循环后不会有您期望的值。无论是将有是没有i
(编译时错误),或有将是i
这是隐藏在内部for
循环,因此不可能有你所期望的价值,导致隐伏缺陷。
对于第二个,我有时会在正文中中断循环,但通常只在正文的开头,以便控制逻辑在单个区域中仍然可见。如果for
情况会很长,我倾向于这样做,但还有其他方法可以做到这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句