简化循环条件

时间:2016-02-11 15:31:24

标签: c loops refactoring

有这个循环语句

Ext.define('Admin.overrides.Date', {
  override :'Ext.form.field.Date',
  dateFormat: 'Y-m-d H:i:s',
  dateReadFormat:'Y-m-d H:i:s',
  dateWriteFormat : 'Y-m-d H:i:s'
});

我希望这种语法更优雅:

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

6 个答案:

答案 0 :(得分:4)

你可以迭代你想要的索引,有点麻烦,但至少可能使它更明确:

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.
}

这也删除了条件。当然,在这一点上很难说出表现。那些测试也不是免费的。

答案 1 :(得分:3)

我不知道优雅的确切含义,但更简洁,更易于维护的方法是使用 fall-through switch-case,例如< / p>

for (i = 0; i < 10; i++) {
    switch(i)
    {
        case 4:
        case 5:
        case 7:
        case 9:
              continue;
      default:
               //otherewise
    }
}

如果以后要修改,则更容易理解和维护。

编辑:

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

答案 2 :(得分:1)

好吧,也许有点魔术?

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

...

if ( (MAGIC_NUMBER >> i) & 0x1)
    continue;

更新:原始代码很好。如果真的需要,这只是一个替代方案。

答案 3 :(得分:0)

// 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];
    ...
}

答案 4 :(得分:0)

我认为您的代码看起来很好,但是如果您正在寻找更美观的内容,那么&#39; if&#39;有条件的你可以这样做:

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));
}

答案 5 :(得分:-1)

有点惊讶,没有人说过明显的解决方案......

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

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

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