c++ 如何在循环中只运行一次代码而不使用外部标志?

pobjuy32  于 2022-12-24  发布在  其他
关注(0)|答案(6)|浏览(140)

我想检查一个循环中的一个条件,并在第一次遇到它时执行一个代码块。之后,循环可能会重复,但代码块应该被忽略。有没有这样的模式?当然,在循环外声明一个标志很容易。但是我对一种完全存在于循环内的方法很感兴趣。
这个例子不是我想要的,有没有办法把定义去掉在循环之外?

bool flag = true;
for (;;) {
    if (someCondition() && flag) {
        // code that runs only once
        flag = false;
    }        
    // code that runs every time
}
dwthyt8l

dwthyt8l1#

这是一个相当复杂的过程,但是正如您所说的,这是应用程序主循环,我假设它位于一个调用一次的函数中,所以下面的代码应该可以工作:

struct RunOnce {
  template <typename T>
  RunOnce(T &&f) { f(); }
};

:::

while(true)
{
  :::

  static RunOnce a([]() { your_code });

  :::

  static RunOnce b([]() { more_once_only_code });

  :::
}
sauutmhj

sauutmhj2#

莫比乌斯的答案有一个不那么复杂的版本:

while(true)
{
  // some code that executes every time
  for(static bool first = true;first;first=false)
  {
    // some code that executes only once
  }
  // some more code that executes every time.
}

你也可以用++写一个bool,但显然是deprecated

jm81lzqq

jm81lzqq3#

一种可能更简洁的编写方法(尽管仍然使用变量)如下所示

while(true){
   static uint64_t c;
   // some code that executes every time
   if(c++ == 0){
      // some code that executes only once
   }
   // some more code that executes every time.
 }

static允许你在循环中声明变量,IMHO看起来更简洁,如果你的代码每次执行时都做了一些可测试的改变,你可以去掉变量,写成这样:

while(true){
   // some code that executes every time
   if(STATE_YOUR_LOOP_CHANGES == INITIAL_STATE){
      // some code that executes only once
   }
   // some more code that executes every time.
 }
jmp7cifd

jmp7cifd4#

#include <iostream>
using namespace std;

int main()
{
    int fav_num = 0;

    while (true)
    {
    if ( fav_num == 0)
    {
        cout <<"This will only run if variable fav_number is = 0!"<<endl;
    }
    cout <<"Please give me your favorite number."<<endl;
    cout <<"Enter Here: ";
    cin >>fav_num;
    cout <<"Now the value of variable fav_num is equal to "<<fav_num<<" and not 0 so, the if statement above won't run again."<<endl;
    }
    
    return 0;
}

输出

This will only run if variable fav_number is = 0!

Please give me your favorite number.

Enter Here: 1

Now the value of variable fav_num is equal to 1 and not 0 so, the "if statement" above won't run again.
p8ekf7hl

p8ekf7hl5#

如果您知道只想运行这个循环一次,为什么不使用break作为循环中的最后一条语句。

b09cbbtk

b09cbbtk6#

如果您希望代码没有任何外部标志,那么您需要在条件的最后一条语句中更改条件的值。(代码片段第7行)

相关问题