C 为什么printf输出显示在命令提示符中?

C 为什么printf输出显示在命令提示符中?,c,windows,terminal,C,Windows,Terminal,我们都知道基本的Hello World计划: #include <stdio.h> int main() { printf("Hello World!"); return 0; } #包括 int main(){ printf(“你好,世界!”); 返回0; } 这将打开一个命令提示符,并向我们显示“Hello,World”消息。 我的问题是:为什么?例如,为什么消息显示在命令提示符中而不是记事本中?为什么不作为Windows通知?为什么它是命令提

我们都知道基本的Hello World计划:

#include <stdio.h>
int main() {
   printf("Hello World!");
   return 0;
}
#包括
int main(){
printf(“你好,世界!”);
返回0;
}
这将打开一个命令提示符,并向我们显示“Hello,World”消息。

我的问题是:为什么?例如,为什么消息显示在命令提示符中而不是记事本中?为什么不作为Windows通知?为什么它是命令提示符而不是其他东西?

在当今世界,我认为这是一个很好的问题。原因是多方面的

  • 历史上,终端(在今天的术语中是命令行的另一个名称),曾经是键盘,用于在纸/穿孔卡、一系列灯或一些旧电视上输入和输出(如果您有幸在您的计算机上安装了GPU)。显示了PDP-7(开发C的计算机)是如何运行的

  • 您必须了解,要加载GUI的漂亮外观,必须执行更多操作来操作像素。如果只有终端,则只能操作文本行。简单!!!!因此,为了不使标准输入输出变得简单

  • 从上面看,您有以下工作:

    KB->内核->标准输入->处理代码->标准输出->内核->(GUI->)屏幕

    如果你这样做:

    知识库->内核->图形用户界面->处理代码->图形用户界面->内核->图形用户界面->屏幕

    如何处理GUI中的键盘快捷键?例如
    音量增大
    增大和
    音量减小

    KB->kernel->GUI->kernel(处理卷)->GUI->kernel(在屏幕上显示新框架)->GUI->屏幕

    通过简化IO:

  • 我可能弄错了,但在类似快捷方式的情况下,Linux内核甚至不调用其他程序,而是在内部处理它们。不过Windows是不同的,我不熟悉它是如何处理IO的,我所知道的是,在Windows上,你可以像普通用户一样每次按键


    像往常一样,我希望这会有所帮助,如果我错了,请告诉我

    当您通过Windows的文件资源管理器“打开”文件时,系统(不一定是直接操作系统;涉及到各种子组件)会检查该文件。如果它是本机Windows应用程序,系统将直接执行它。如果它是另一种文件,系统将为它查找适当的应用程序。例如,如果它是Microsoft Word文件,系统将启动Microsoft Word并请求它打开该文件

    如果文件是“命令行”程序,系统将启动Windows终端(或各种版本的Microsoft Windows中的类似程序),并请求运行该程序。更具体地说,它可能会启动Windows终端,请求运行特定的命令行shell并让该shell运行您的程序

    C语言是在类似Unix的环境中发展起来的,在这种环境中,命令shell从物理键盘读取输入,并将输出写入物理显示器。在现代系统中,它们通常被在软件中执行相同功能的伪设备所取代。当shell启动命令行程序时,它将创建一个新进程,该进程的标准输入和标准输出流连接到提供键盘/显示功能的伪设备。(这是默认设置。您还可以请求shell启动程序,使输入和输出从/重定向到文件和其他设备。)


    然后,当您的程序写入标准输出时,它将进入伪设备,伪设备将数据中继到系统的适当部分,使文本显示在终端窗口中。

    因为历史上C在终端之前就存在,那么终端是放置
    stdout
    文本的默认位置?把它放在其他地方需要就放在哪里达成一致,而在放在哪里的问题上没有明显的共识。
    stdout
    指向终端,因此它将输出到终端。您可以使用类似的文件处理函数来输出到文件,但是
    printf
    将输出到终端(或任何输出屏幕)。您错了。程序不会打开命令窗口。如果在运行程序时打开这样一个窗口,那是因为操作系统打开它是为了为程序的标准流提供一个终点。
    KB -> kernel (store the volume level) +-> Speaker
                                          |
                                          +-> GUI -> screen