系统( "暂停"); - 为什么这是错的?

Fak*_*ken 123 c++

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

该命令system("pause");被教给新程序员,作为暂停程序并等待键盘输入继续的方法.然而,许多资深程序员似乎不赞成这种不应该在不同程度上做的事情.

有人说使用起来很好.有人说这只是在你被锁在你的房间而没有人在看的时候使用.有人说,如果你使用它们,他们会亲自到你家里杀了你.

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

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

rav*_*uya 77

它不受欢迎,因为它是一个特定于平台的黑客,与实际学习编程无关,而是绕过IDE/OS的一个功能 - 从Visual Studio启动的控制台窗口在程序执行完毕后关闭,等等新用户无法看到他的新程序的输出.

系统中的阻止("暂停")运行Windows命令行"暂停"程序,并在继续执行程序之前等待终止程序 - 控制台窗口保持打开状态,以便您可以读取输出.

更好的想法是在最后放置一个断点并对其进行调试,但这又有问题.

  • Visual Studio可以以两种模式运行程序:有或没有调试.在调试模式下运行时,它将在第一个断点处停止.如果您没有定义一个,它将运行该程序并关闭控制台.因此,如果您希望控制台程序停止,只需设置一个断点,或者更好的是,无需调试即可运行它!这将执行程序并停止控制台. (6认同)
  • ** - 1**重新"当程序完成执行时,从Visual Studio启动的控制台窗口关闭",不,仅适用于在调试器中运行程序的情况.重新"运行Windows命令行"暂停"程序",没有这样的(`pause`是`cmd.exe`中的内部命令).更好的想法清单也严重缺乏. (2认同)

小智 37

这很慢.它取决于平台.这是不安全的.

第一:它的作用.调用"system"就像在Windows命令提示符下键入命令一样.你的应用程序有大量的设置和拆解来进行这样的调用 - 而且开销很简单.

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

只需编写自己的"Pause()"函数即可使用_getch.好吧,确定,_getch也是平台相关的(注意:它在"conio.h"中定义) - 但它比system()在Windows上开发时更好,它具有相同的效果(尽管你有责任提供文本与cout左右).

基本上:当你可以简单地添加两行代码和一个包含并获得更灵活的机制时,为什么会引入这么多潜在的问题?

  • 对于抱怨平台依赖性的人来说,当标准C++提供`getchar`时,建议`_getch`,_ special. (57认同)
  • 我在计算与人类互动的开销时感到有些讽刺 (31认同)
  • ** - 1**"如果将一个名为"暂停"的程序放入用户的PATH中会怎样?"这是一个极具误导性的问题.它基于对事物如何运作的幻想.作者没有试过*这个,但是没有检查他自己的错误观念. (2认同)
  • @Cheersandhth.-Alf - 嗯?八年前,当我写这篇文章时,我刚刚调试完一个由“system(“pause”)”引起的问题,因为项目的可执行文件名称称为“pause”,它会进入无限循环。我的观点仍然成立,我不确定你为什么说我错了。 (2认同)
  • @nlaq:您可以使用限定文件名运行名为`pause`的程序,例如`pause.bat`.大概是8年前你误解的那个.你的回答是垃圾:你应该在断言幻想事实之前尝试**事情,特别是在后续记录中告诉你你没有提前做到这一点.对于Stack Overflow读者来说,你的行为,只是断言事物和推测幻想,是很常见的.我不知道如何教育你.我总是因为SO而失败.对不起. (2认同)
  • @paxdiablo getchar 需要输入然后按 Enter 键。_getch 只需要一个按键,无论它是什么键。要在 Linux 上模拟 _getch,您需要 5-6 行代码来更改控制台模式,然后将其更改回默认值。它不一样,它做不同的事情。getchar 不是 _getch 的替代品。 (2认同)

Gav*_*n H 25

  • 慢:它必须跳过许多不必要的Windows代码和一个单独的程序来进行简单的操作
  • 不可移动:取决于暂停程序
  • 不好的风格:只有在真正需要的时候才能进行系统调用
  • 更多输入:系统("暂停")比getchar()更长

一个简单的getchar()应该做得很好.


Che*_*Alf 21

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

  • 这完全没必要.
    为了保持程序的控制台窗口打开,在结束的时候,你从Visual Studio中,使用运行Ctrl+ F5无需调试运行,否则放置一个断点在最后一个右括号}main.所以,在Visual Studio中没问题.当然,从命令行运行它时完全没问题.


  • 从命令行运行程序时会出现问题并且很烦人.对于交互式执行,您必须在最后按一个键无任何目的.并且用于某些pause非常不受欢迎的任务的自动化!

  • 它不便携.
    Unix-land没有标准pause命令.

pause命令是一个内部cmd.exe命令,不能被覆盖,至少在另一个答案中被错误地声明.即,这不是一个安全风险,并且AV程序诊断它的声明与覆盖命令的声明一样可疑(毕竟,C++程序调用system能够完成命令解释器可以执行的任何操作,并且更多).此外,虽然这种暂停方式在C++编程的通常标准下效率极低,但在新手程序结束时根本不重要.

所以,在此之前答案的大部分声明是不正确的,你不应该使用的主要原因system("pause") 或者你最后的任何其他等待命令main,是上面的第一点:它完全没必要,它绝对没有用处,这真是太傻了.

  • 有时快速测试需要 Ungood Practice™...我们称之为“快速而肮脏” (2认同)

Joh*_*n T 20

总之,当你使用像cin.get()这样简单的东西时,它必须暂停程序执行并进行系统调用并分配不必要的资源.人们使用系统("PAUSE"),因为他们希望程序等到输入后才能看到输出.如果您希望程序等待输入,那么内置的功能也是跨平台且要求较低的功能.

在进一步的解释文章.


Gav*_*ria 15

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

此外,system('pause')速度很慢,包括一个你可能不需要的文件:stdlib.h.它依赖于平台,实际上调用了一个"虚拟"操作系统.

  • 我被教导在第一年的编程课程中使用`System("pause")`,但我希望能够在我的Mac上运行我的程序,所以我必须学习`cin.get()`. (3认同)

a_m*_*m0d 10

因为它不便携.

pause
Run Code Online (Sandbox Code Playgroud)

是一个仅限Windows/DOS的程序,因此您的代码将无法在Linux上运行.此外,system通常不被认为是一种非常好的方式来调用另一个程序 - 通常更好地使用CreateProcessfork类似的东西.