【问题标题】:Is there a way in C++ to only return the the last instance of a for loop?C++ 中有没有办法只返回 for 循环的最后一个实例?
【发布时间】:2015-05-08 00:34:33
【问题描述】:

例如:

#include <iostream>
using namespace std;
int main()
{
    for (int n=10; n>0; n--){
        cout<< n <<", ";}
}

这将输出数字 10,9,8,7,6,5,4,3,2,1 那么有没有一种新方法,所以我只得到循环的最后一个实例,1? 我是新手,谷歌没有给我任何答案。

【问题讨论】:

  • 所以你得到了 1 还是没有得到它?如果你想要最后一个实例,你可以在循环中放一个 if 语句...
  • 你的意思是要输出1而不是10,9,8,7,6,5,4,3,2,1
  • 是的。但是,我只是像其他海报建议的那样使用了 if 语句。如果有其他方法,它可能对未来有用。

标签: c++ loops for-loop


【解决方案1】:

没有直接的方法来检测for 循环的当前迭代是否是最后一个。但如果循环的行为是可预测的,您通常可以编写可以检测您何时处于最后一次迭代的代码。

在这种情况下,您可以执行以下操作:

if (n == 1) {
    cout << n << "\n";
}

在循环体中。 (当然,在这种情况下,用cout &lt;&lt; "1\n"; 替换整个循环会更简单,但我认为这是一个更复杂的例子。)

在更复杂的情况下,您可以将所需的任何信息保存在循环体中:

int value_to_print:
for ( ... ) {
    value_to_print = i;
}
std::cout << value_to_print << "\n";

在每次迭代中,value_to_printi 的当前值替换。最终值是上次迭代时i 的值。

【讨论】:

    【解决方案2】:

    您可以创建一个变量(在循环外)来保存n 的“当前”值;无论循环发生什么(达到退出条件,break,抛出异常......)该值都将保留在那里:

    int last_n;
    for (int n=10; n>0; n--) {
        last_n = n;
        cout<< n <<", ";
    
        if (something) {
            break;                   // works in this case
        } else if (something else) {
            throw some_random_error; // works in this case too
        }
    }
    
    cout << "The last value of 'n' was " << last_n << endl;
    

    【讨论】:

    • ... 但要非常确定,在这种情况下,循环 确实 至少执行了一次。如果没有,last_n 中的值将无法预测。 (read: "garbage") 这个解决方案非常棒:它只有一个“陷阱”。 (在这种情况下,我有时会将last_n 初始化为“非常明显错误,但已定义,我知道会像拇指酸痛一样突出的值:例如,@987654326 @. 或者,如果我觉得异想天开,0xDEADBEEF。显然,它是一个虚拟值,应该立即被替换。但是,如果循环永远不会执行,“它会脱颖而出!”
    • @MikeRobinson:是的。另一方面,将last_n 初始化为某些东西(如n 的初始值,在这种情况下为10)仍然很危险:它不会是随机垃圾,但如果不执行循环它仍然是错误的。也许更危险,因为它更难被发现。我认为唯一可以确定的方法是使用bool loop_run_at_least_once = false;,在设置last_n 时,它在循环内设置为true。但也许这有点矫枉过正......
    • 绝对如此。如果存在循环可能根本不执行的任何“合法”情况,您必须准备好检测到这一点。 (正如您所暗示的,一个好方法是在循环开始之前将 bool 设置为 False,然后在循环内将其设置为 True。) 如果在循环结束时,该标志仍然是 False,那么last_n 的值就毫无价值。 (但我,也许是冲动地,也许是固执地(?),仍然“将所有变量初始化为 something, 无论如何。”)
    【解决方案3】:

    您可以为此使用简单的 if 语句。

    int main()
    {
        for (int n=10; n>0; n--) {
            cout << n << ", ";
            if( n == 1 ) {
                return n;
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      最简单的方法是:-

      #include <iostream>
      using namespace std;
      int main()
      {
          int x;
          for (int n = 10; n > 0; n--){
              x = n;
          }
          cout << x;
          return 0;
      }
      

      【讨论】:

        【解决方案5】:

        我也是编程新手,我正在尝试找出一些东西来让我将循环的最后一个实例作为输出。 我尝试了一些东西并得到了输出,看看它是否可以帮助你(如果有错误,请告诉我)。 这里用户输入字符串被 "*" 替换,而不是给出我所做的每个实例的输出,所以只给出最后一个实例作为输出。

        #include <iostream>
        #include <string>
        using namespace std;
        
        int main()
        {
                string str;
                int string_length;//string length
                cout<<"Enter your Email-ID: ";
                cin>>str;
        
                string_length = str.length(); //to give the length of input string and use it for the loop
                cout<<"lentgh of the string: "<<string_length <<endl;
                for(int x = 0; x <= string_length; x++){
                        str[x] = '*';
                    while(x==string_length) //string_length is the last instance of the loop
                        {
                            cout<<"Here's your Encrypted Email-ID: " <<str<<endl;
                            break;
                        }
                }
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-01
          • 1970-01-01
          相关资源
          最近更新 更多