“ while” /“ for”循环的替代方案是什么

时间:2019-03-24 09:25:38

标签: c++ loops

我有一个家庭作业,我应该一次又一次地执行一些操作,直到我在控制台中写入“停止”为止,但是我不能使用forwhilegoto,我所有代码中的switch[]typedef。那么我该如何替换循环?

3 个答案:

答案 0 :(得分:8)

可以使用递归。此示例重复您输入的内容,直到您键入“ stop”作为示例:

#include <iostream>
#include <string>

void do_it()
{
  std::string s;
  std::cin >> s;
  if (s == "stop")
    return;
  std::cout << s << '\n';
  do_it();
}

int main()
{
  do_it();
  return 0;
}

在这里可能并非如此,但是递归有其缺点。一方面,它比简单的循环要慢,因为在像C ++这样的语言中,函数调用相对昂贵。如果它重复太多次,则可能导致堆栈溢出。话虽如此,该函数的递归版本有时可以更整洁,更易于阅读/理解。您可以详细了解递归here的优缺点。

答案 1 :(得分:2)

正如Jesper Juhl的评论中所述,他们禁止了goto,却忘记了禁止setjmp / longjmp

与基于递归的解决方案不同,如果迭代太多,setjmp / longjmp可能不会导致堆栈溢出。

#include <csetjmp>
#include <iostream>
#include <string>

int main()
{
    std::string s;

    std::jmp_buf jump_buffer;
    setjmp(jump_buffer);

    std::cin >> s;

    if (s == "stop")
        return 0;

    std::cout << s << '\n';
    std::longjmp(jump_buffer, 0);
}

请注意,longjmp可能很危险,因为它不会调用析构函数。因此,应尽可能避免使用它。

答案 2 :(得分:1)

接受挑战-原始标记的C版本

#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
    if (strcmp(*argv, "stop")) {
        char *in = malloc(99);       // assume it worked
        fgets(in, 99, stdin);        // assume it worked
        *(in+strcspn(in, "\n")) = 0; // remove trailing ENTER
        main(argc + 1, &in);         // memory leak
    } else {
        printf("Stopped after %d entries.\n", argc - 1);
    }
}

查看在ideone上运行的代码:https://ideone.com/Slx4g9