为什么我们不能打印从 0 到 31 的 ASCII 值?

Why can't we print ASCII values from 0 to 31?

#include<stdio.h>
int main()
{
    for(int i=0;i<=31;i++)
        printf("%c",i);
}

当我们尝试 运行 这段代码时,什么也没有打印出来 这是什么原因?

可以,只是大部分都是non-printable control characters that most shells ignore。如果您将 stdout 传送到一个文件,该文件将包含这些字符,只是 shell 不知道如何处理它们。其中一些由 shell 处理(例如换行和返回 space 字符),但其他一些只是无意义的(例如传输结束,数据 link 转义)并被忽略,或者替换为不同的显示字符(通常是 space 或问号等)。

C 正在打印它们,但也许您的终端没有显示它们。这种区别很重要,因为终端负责解释程序的输出、打印字母、移动光标、改变颜色等。

根据历史惯例,ASCII table 的前 32 个字符被认为是 "control characters",其中一些是可打印的,一些像移动光标的退格键,其他像 BEL 可以让你的终端发出哔哔声.

不同的终端可能显示不同,或者根本不显示。

值得注意的是,ASCII 早于现代 "glass" 终端,并且这些代码用于在页面上四处移动打印头。早期的机器在打字机上使用 teletypes to communicate with them and a line-feed would crank down the paper one line, a carriage return move the cursor back to the start of the line, much like the physical carriage return,这会将 "carriage" 移回第一列。

这些是非常精密的机电装置,其中没有任何现代电路,但它们仍然可以处理 ASCII 数据,至少对于那些使用 ASCII 的人来说是这样,因为还有其他字符集,例如 EBCDIC与 ASCII 共存。

由于这些字符从未打算打印出来,因此它们在 ASCII 中没有标准的视觉表示。

与"extended ASCII"一样,在DOS中使用时,为它们定义了symbols,否则看起来很浪费。这些没有控制代码含义,通常您将它们直接写入控制台字符缓冲区以便查看它们。