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