【问题标题】:C++ - back to start of loop without checking the conditionC ++ - 返回循环开始而不检查条件
【发布时间】:2015-09-03 11:08:15
【问题描述】:

在 perl 上编程,我们可以使用一个名为“redo”的智能函数——我们可以回到循环的开头,而无需查看条件。例如,当我们创建一个必须在其中设置预期值/字符(例如“a-b-c”,仅此而已)的表时,它很有用。 我想问一下这样的C++函数中是否存在。非常感谢您的帮助。

【问题讨论】:

  • 我无法想象一个用例无法使用通常的构造(ifwhile 等)提供服务。请提供一个最小的例子
  • 例如:我们有一个要填充特定字符的数组(只有“a”或“b”)。如果我们在写入不正确的值后不使用“goto”,则将重新检查条件(或者......我不知道更好的选择)。结果 - 我们的计数器会增加(而不是再次写 tab[i],之前写得很糟糕,我们会写 tab[i+1])
  • while 循环有什么问题?如char x=0; while(is_wrong(x=obtain())); table[i]=x;
  • 我们也可以这样做,但是在这种情况下使用'goto'不是更直观吗? (知道这个命令通常不推荐)
  • goto从不直观的,因为标签和goto 语句通常在结构上不相关。对于do,总是有一个while,一个关联的执行块和一个条件。

标签: c++ perl loops redo


【解决方案1】:

没有用于返回循环开头的重做关键字,但没有理由不能使用goto 执行此操作。 (哦,我觉得很脏推荐goto...)

int tries = 0;
for(int i=0; i<10; ++i) {
  loop_start:
  bool ok = ((i+tries)%3==0);
  if(ok) {
     ++tries;
     goto loop_start;
  }
}

【讨论】:

  • 我之前使用了相同的操作:)。效果很好。所以,我们不能很快做到吗?
【解决方案2】:

我认为更合理的解决方案是

int trie=0;
for(int i=0; i<10; i++) {
    while((i+tries)%3==0 {
         ++tries;
    }
}

【讨论】:

    【解决方案3】:

    如果你想不惜一切代价避开goto

    int tries = 0;
    for (int i=0; i<10; ++i) {do{
    
      bool redo = ((i+tries)%3 == 0);
    
      if (redo) { ++tries; }
      else      { break; }
    
    } while(1); }
    

    【讨论】:

      【解决方案4】:

      为什么不能使用简单的while 循环?

      auto is_okay = [](char x) { return x=='a' || x=='b'; };
      container C;
      for(std::size_t i=0; i!=C.size(); ++i) {
        char x;
        while(!is_okay(x=obtain_new_character()));  // get new x until it's okay
        C[i]=x;
      }
      

      或者,等效地,do while 循环

      container C;
      for(std::size_t i=0; i!=C.size(); ++i) {
        char x;
        do {
          x=obtain_new_character();
        } while(x!='a' && x!='b');
        C[i]=x;
      }
      

      甚至是for 循环

      container C;
      for(std::size_t i=0; i!=C.size(); ++i) {
        char x=0;
        for(; x!='a' && a!='b'; x=obtain_new_character());
        C[i]=x;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 2021-06-05
        • 2018-08-22
        • 2019-11-23
        相关资源
        最近更新 更多