系统(“暂停”); – 为什么错了?

这是一个我不太明白的问题:

命令, system("pause"); 被教给新程序员作为暂停程序并等待键盘input继续的一种方式。 然而,许多资深程序员似乎对此不以为然,这是不应该做的。

有人说使用起来很好。 有人说,只有当你被锁在房间里,没有人在看,才能使用它。 有人说如果你使用它,他们会亲自到你家杀死你。

我自己是一个没有正式编程培训的新程序员。 我使用它,因为我被教导使用它。 我不明白的是,如果不是要使用的东西,那我为什么要教它使用它? 或者,另一方面,它究竟真的不是那么糟糕吗?

你对这个问题有什么想法?

由于这是一个特定于平台的黑客攻击,与实际学习编程无关,而是为了解决IDE / OS的一个特性 – 从Visual Studio启动的控制台窗口在程序执行完毕后closures新用户不会看到他的新程序的输出。

在系统中停顿(“暂停”)将运行Windows命令行“暂停”程序,并在程序继续执行之前等待终止 – 控制台窗口保持打开状态,以便读取输出。

最好的办法是在最后加上一个断点并对其进行debugging,但这又有问题。

这很慢。 这是平台的依赖。 这是不安全的。

首先:它做什么。 调用“系统”就像在Windows命令提示符中input命令一样。 对于你的应用程序来说,有很多的设置和拆卸来完成这样的调用 – 而且开销简直是荒谬的。

如果一个名为“暂停”的程序被放入用户的PATH中怎么办? 只是调用系统(“暂停”)只能保证一个叫做“暂停”的程序被执行(希望你没有名为“暂停”的可执行文件!)

只需编写您自己的使用_getch的“Pause()”函数即可。 好的,当然,_getch也是平台依赖的(注意:它是在“conio.h”中定义的) – 但是如果你在Windows上开发并且它具有相同的效果,它比system()好得多(尽pipe这是你的责任提供文字与cout左右)。

基本上:为什么会引入这么多潜在的问题,只需添加两行代码,一个包含并获得更灵活的机制?

  • 慢:它必须跳过大量不必要的Windows代码和一个单独的程序进行简单的操作
  • 不便携式:取决于暂停程序
  • 不好的风格:只有在真正需要的时候才能进行系统调用
  • 更多的input:系统(“暂停”)比getchar()

一个简单的getchar()应该没问题。

总之,当你可以使用像cin.get()这样简单的东西时,它必须暂停程序执行并进行系统调用并分配不必要的资源。 人们使用系统(“暂停”),因为他们希望程序等待,直到他们进入到他们可以看到他们的输出。 如果你想要一个程序来等待input,那么这个function就是跨平台的,而且要求不高。

在这篇文章中进一步解释。

你可以使用iostream std::cin.get()

 #include <iostream> // std::cout, std::cin using namespace std; int main() { do { cout << '\n' << "Press the Enter key to continue."; } while (cin.get() != '\n'); return 0; } 

此外, system('pause')很慢,并包含一个你可能不需要的文件: stdlib.h 。 这是平台相关的,实际上调用了一个“虚拟”操作系统。

因为它不是便携式的。

 pause 

是一个Windows / DOS的唯一程序,所以这个代码不会在Linux上运行。 而且, system通常不被认为是调用另一个程序的好方法 – 通常使用CreateProcess或者fork或类似的方法会更好。

使用system("pause"); Ungood Practice™是因为

  • 这是完全没有必要的
    在Visual Studio中运行它时,为了保持程序的控制台窗口处于打开状态,请使用Ctrl + F5运行它,而不进行debugging,否则在main的最后一个右括号处放置一个断点。 所以,在Visual Studio中没有问题。 从命令行运行它当然没有问题。

  • 这是有问题的,烦人的
    当你从命令行运行程序时。 对于交互式执行,您必须最后按下任意键。 而用于自动化的一些任务pause是非常不希望的!

  • 这不是便携式的。
    Unix-land没有标准的pause命令。

pause命令是一个内部cmd.exe命令,不能被覆盖,至less有一个其他答案错误地声明。 也就是说这不是一个安全风险,声称AV程序诊断它就像声称重写命令一样可疑(毕竟,一个C ++程序调用system能够自行完成命令解释程序所能做的所有事情,和更多)。 另外,虽然这种暂停方式在C ++编程的通常标准中是非常低效的,但在新手程序结束时根本就不重要。

所以,在这之前的答案部分的索赔是不正确的,你不应该使用system("pause") 或任何其他等待命令main结束的main是上面的第一点:它是完全不必要的,它绝对没有任何目的,这是非常愚蠢的。

正如其他答案中列出的,有很多原因可以避免这种情况。 这一切归结为一个原因,使剩下的事情。 System()函数本质上是不安全/不可信的,除非必要,否则不应该引入到程序中。

对于一个学生任务,这个条件从来没有满足,因此,如果调用这个方法,即使没有运行该程序,我也将失败一个任务。 (这是从一开始就明确的)

对我来说,在没有理由退出之前一般没有任何意义。 一个已经完成其工作的程序应该结束并将其资源交还给其创build者。

一个工作日过后,也不会静静地在黑暗的angular落等待,等待有人倾倒一个肩膀。

下面是你不应该使用它的一个原因:如果你将程序传递到另一台机器上,这会导致大多数在Windows上运行的防病毒程序,因为这是一个安全威胁。 即使你的程序只包含一个简单的cout << "hello world\n"; system("pause"); cout << "hello world\n"; system("pause"); 它的资源很大,程序可以访问cmd命令,反病毒被视为一种威胁。

亲的使用系统(“暂停”); 而创build程序的一小部分是为了自己debugging它。 如果您在每个正在使用的过程中和之后使用它来获取variables的结果,以确保它们正常工作。

经过testing并将其与解决scheme的其余部分全面对接后,您应该删除这些行。 testing用户定义的algorithm并确保您按正确的顺序执行所需的结果时,效果非常好。

在testing之后,你绝对不想在应用程序中使用它,并确保它正常工作。 但是,它确实可以让你跟踪正在发生的一切事情。 请不要将其用于最终用户应用程序。

这都是风格问题。 这对debugging很有用,否则不应该在程序的最终版本中使用。 在内存问题上真的没什么关系,因为我确信那些发明系统的人(“暂停”)预计会经常使用它。 从另一个angular度来看,电脑无论如何都被我们在计算机上使用的其他东西扼杀在内存上,并且不会像dynamic内存分配那样造成直接的威胁,所以我会推荐它用于debugging代码,但是没有别的。