其实不需要像其他答主说的那么多。题主只是想知道,为何printf会在终端窗口打印信息,那应该看的只是操作系统的内容,比如源码。windows源码不好弄,但linux还是挺简单的。
除了操作系统源码外,还有编程语言本身内建函数的实现。题主可以尝试下载gcc或者mingw(windows版gcc)源代码,在里面可以看到对c语言内建函数printf的实现
——————————————————————————
printf的实现
我没看过源代码,但就我的了解大致实现应该是这样的:
解析输入内容,拼接用户自定义参数(%d)这些,生成完整的用于输出的字符串调用操作系统函数接口,获取stdout标准输出流接口将信息输出到stdout这一段是将printf的输入内容解析,并告诉操作系统输出到标准输出接口。这个接口默认就是程序运行显示的终端,但也可以用户自己手动定义,比如输出到一个日志文件。
——————————————————————————
程序终端
然后下一个问题就是,程序运行显示的终端从哪儿来的呢?
……这个就麻烦了,是操作系统内部实现的东西,得查操作系统原理,包括可执行文件结构。
比如说windows,windows系统下的exe文件和dll文件,本身结构上是一样的,只不过exe文件有一个程序入口,操作系统从这个入口开始执行程序。
比如说,用c/c++编写的程序(其他语言我不清楚),程序的入口是main。所以,如果你是用c/c++写的程序,并且程序里没有执行窗口相关的操作,那么运行程序时,操作系统会开启一个命令行窗口(也就是cmd.exe),然后在那个命令行窗口里面运行你的程序,那么程序里printf的标准输出接口就是那个窗口
——————————————————————————
窗口/文字显示
至于,输入到终端窗口的输出接口的信息,如何在终端窗口显示呢?
那又是一串又长又臭的代码了。简而言之,就是计算字符串在屏幕上的排版,然后生成相应的视频流,输出到显示器,由显示器显示出来,就是这么个窗口。
当然,上面短短一句话,里面封装了无数代码,比如:
显示cmd.exe窗口——这个是操作系统内部预设好的窗口组件,调用后就能显示。窗口组件的运作原理,和上面那句简单的描述相同;再要详细点么,就是调用驱动程序的接口函数,向显卡发送相关绘图指令,比如绘一个方框,哪里哪里填充什么颜色,哪里哪里填充什么颜色,然后显卡再把这些处理成视频流交给显示器,然后一个窗口就出来了显示文字——此处答主不是很熟,详见评论区 @张浩洋与 @智狐的讨论。——————————————————————————
其他内容
1、编译原理
这个在这题里真没必要看。编译器是负责把你的程序翻译成机器代码,给机器看的。但编译后的程序实际上是给操作系统看的,所以只要知道操作系统怎么处理就行了。
2、计算机组成原理/微机原理
这两个讲的太底层,是从硬件架构开始来讲一台计算机是怎么搭建起来的。如果想知道操作系统怎么和显卡、显示器合作,CPU是怎么运作并处理机器指令,那可以看一下,如果不求甚解的话,不用着急,看看“计算机操作系统”的书籍就够了
3、数字电路
这个更底层,讲的是硬件底层的实现,比如CPU、显示器、显卡的内部硬件结构是怎么做的,但完全没有意义。
用造汽车做类比吧:
数字电路——如何冶炼钢铁,如何制造钉子、齿轮、铁板等
计算机组成原理/微机原理——如何用各种零件组装出一辆车子
操作系统——如何设计汽车结构,包括传动系统、发动机结构、车载电脑等,让驾驶者的一举一动可以反映到实际汽车零件的运动中
——————————————————
补充
关于显示系统,我了解的确很少,因为没读过相关的书籍,也没专门学习过,所了解的一鳞半角都是道听途说的,所以难免有一些错误,多谢评论区里各位大神的斧正
如果这盘牌已经差不多已经过了一半的进程了博彩问答,这个时候上家开始落风子博彩问答,你需要做的就是不要去碰。