为什么输出中缺少字母'D'?

Why is the letter 'D' missing in the output?

本文关键字:输出 为什么      更新时间:2023-10-16
#include <iostream>
using namespace std;
int main() {
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'n';
cout << ch1 << 't' << ch2 << ch3;
cout << 'C' << 't' << 'D' << 'b' << ch1 << ch3;
//return 0;
system("pause");
}

输出为:

A        B
C        A

为什么最后一个字母是A而不是D?

cout得到的所有输出。只是终端将把'b'解释为"go back one character"。尝试将输出重定向到一个文件,并使用(十六进制)编辑器对其进行检查,以查看所有字符(包括'b')都在那里。

乍一看,可能会认为终端按原样打印输出。不过,这是不正确的。每当终端遇到特殊的终端控制序列或字符时,它们就会改变行为方式。'b'(=0x08=退格)字符就是其中之一。更多信息,请访问http://ascii-table.com/ansi-escape-sequences.php。您可以尝试将其中的一些打印到终端,然后看到它更改颜色、重写当前行等等。事实上,您可以使用这些特殊的序列和字符在命令行中制作完整的类似GUI的应用程序。

但是,请注意,并不是所有程序都可以使用"redirect to a file"技巧来查看它们向stdout写入的终端控制序列。许多程序检测它们是否在向终端写入,并相应地调整它们对终端控制序列的使用(或缺乏)。

b是一个退格,因此将光标向左移动一个位置,然后用包含Ach1覆盖D

cout << ch1 << 't' << ch2 << ch3;

打印A、选项卡、B,然后打印换行符。

cout << 'C' << 't' << 'D' << 'b' << ch1 << ch3;

打印C,一个选项卡D,然后将光标移动到D后面,打印A(这会覆盖字符D),然后打印换行符。

CCD_ 19是表示退格的转义序列。它将光标向后移动一步。

其他人解释了DA覆盖的原因,因为b是退格的转义序列。

我想补充一点,不同机器的输出可能不同。CCD_ 23的实际显示方式取决于终端的实现。

为什么最后一个字母是A而不是D?

因为您输出的最后一个可见字符是A:

cout << 'C' << 't' << 'D' << 'b' << ch1 << ch3;

ch1Ach3是一条新线路。D没有显示,因为您用'b'擦除了它

此行cout << 'C' << 't' << 'D' << 'b' << ch1 << ch3;的作用是:

打印C,

腾出空间(制表符\t)

打印D

返回(退格b)

打印D所在的A(D现在已擦除)

新行(\n)

因为\b跳回并覆盖D

由于代码//'D'<lt;'\b'<lt;ch1<lt,"D"将打印D'\b'是退格,所以D被擦除ch1打印值