Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 循环上的简化条件_C_Loops_Refactoring - Fatal编程技术网

C 循环上的简化条件

C 循环上的简化条件,c,loops,refactoring,C,Loops,Refactoring,有这个循环语句吗 for (i = 0; i < 10; i++) { if ((i == 4) || (i == 5) || (i == 7) || (i == 9)) continue; /*some code */ } 我不知道这里优雅的确切含义,但一种更干净、更易于维护的方法是使用一个直通式开关盒,如 for (i = 0; i < 10; i++) { switch(i) { case 4:

有这个循环语句吗

for (i = 0; i < 10; i++) {
    if ((i == 4) || (i == 5) || (i == 7) || (i == 9))
        continue;
    /*some code */
}

我不知道这里优雅的确切含义,但一种更干净、更易于维护的方法是使用一个直通式开关盒,如

for (i = 0; i < 10; i++) {
    switch(i)
    {
        case 4:
        case 5:
        case 7:
        case 9:
              continue;
      default:
               //otherewise
    }
}
(i=0;i<10;i++)的
{
开关(一)
{
案例4:
案例5:
案例7:
案例9:
继续;
违约:
//其他
}
}
如果以后需要修改,则更容易理解和维护

编辑:


如果您使用的编码标准不允许出错,那么当前代码就可以了。如果需要,您最多可以创建一个附加函数来检查
i
的有效性,并根据真/假(0/1)返回值做出决定。附加函数将有
if
检查。

嗯,也许有点神奇

#define MAGIC_NUMBER 0x2B0 // binary  001010110000 with bits 4,5,7,9 set

...

if ( (MAGIC_NUMBER >> i) & 0x1)
    continue;
更新:原始代码很好。如果确实需要,这只是一个备选方案。

//请评论这些数字的原因!!!
// comment on WHY these numbers!!!
int values[] = { 0, 1, 2, 3, 6, 8 };

for (i = 0; i < sizeof(values)/sizeof(values[0]); i++ )
{
    int value = values[i];
    ...
}
int值[]={0,1,2,3,6,8}; 对于(i=0;i
您可以迭代您想要的索引,这有点麻烦,但至少是可能的,并且使其更加明确:

const int indices[] = { 0, 1, 2, 3, 6, 8 };

for(size_t j = 0; j < sizeof indices / sizeof *indices; ++j)
{
  const int i = indices[j];
  // Rest of your loop body here, i iterates over desired values.
}
const int index[]={0,1,2,3,6,8};
对于(大小j=0;j

这也会删除条件。当然,在这一点上很难说有什么表现。这些测试也不是免费的。

我认为您的代码看起来很好,但如果您想在“如果”条件中找到更美观的东西,您可以:

for(i=0;i<10;i++){
  if(foo(i)){
        continue;
       /*some code */
  }
}

int foo(int i){
    return ((i == 4) || (i == 5) || (i == 7) || (i == 9));
}

for(i=0;i有点惊讶,还没有人提出明显的解决方案

无论如何,在你的情况下,我会做的是替换你的循环:

if ((i == 4) || (i == 5) || (i == 7) || (i == 9))
    continue;
/*some code */



现在它的编写方式似乎非常明确地说明了它在做什么。你为什么要改变它?在循环中放置一个开关盒,但是你的模型是可读的,并且解释它本身足够优雅。^^^^^^^^正如Kevin和Olaf所说。如果清楚,不要改变它。你可以消除
| ^(i==9)
将循环限制切换为
<9
的术语。您应该将if语句替换为if(i==(4 | 5 | 7 | 9)),优雅但难以理解,无需注释。不。请不要。除非绝对需要魔法,否则不要魔法。我个人会坚持原始代码。但我刚刚想出了这个技巧,并想与大家分享:)一些编码标准不允许漏检。问题中的代码对我来说很好。@Olaf对我来说也很好,但如果我们需要检查更多值,切换是更好的方法。标准对此没有限制。:)问题没有提到这一点。有时候一个人不应该想得太远。即使如此,也可能有更好的方法,这取决于问题(例如,测试位图)。@Olaf追加了答案。:)美好的但是您应该使用
sizeof(values)/sizeof(values[0])
来获取非字符数组中的元素数。打字太快,你可以,也应该编辑你的答案来纠正它(或者考虑自己删除它)。否则,它将被否决,并可能被强制删除。@EugeneSh。我会和我的一起去。更多
const
,正确循环。@这就是“正确循环”所指的风向标。但是谢谢你知道逻辑运算符可以返回真/假,对吗?如果需要检查,则无明确的
。我在这里没有看到任何改进。
public boolean
不是C,这个解决方案基本上与OP的解决方案相同,只是
if(foo(I))
不是很容易理解。如果这个答案没有消失或者不会得到改进,我会投反对票。问题似乎是编程美学的问题。因此,你是否认为我的回答是一种进步是主观的。我个人认为OP编写代码的方式没有问题,只是提供了一种替代方法。至于我的错误,我道歉。我没有注意到这个问题是针对C语言的。此外,“foo”只是一个占位符。OP可以将函数重命名为他/她的内心所希望的描述性函数。这并不是你所认为的那样。4位、1位、2位和8位在一起时都会设置好,将比较结果保留为15。。。不是预期的结果。
if ((i == 4) || (i == 5) || (i == 7) || (i == 9))
    continue;
/*some code */
if (i == (4|5|7|9)) {
    continue;
/* some code */
}