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

Cha*_*ugh 5 c++

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

输出是:

A        B
C        A
Run Code Online (Sandbox Code Playgroud)

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

PSk*_*cik 14

cout输出的一切.这只是一个终端将解释'\b'"go back one character".尝试将输出重定向到文件并使用(十六进制)编辑器检查它以查看所有字符(包括'\b')是否存在.

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

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


Ale*_*ler 11

\b是一个退格键,所以你将光标向左移动一个位置然后覆盖D包含ch1它的with A.


Spi*_*rix 6

cout << ch1 << '\t' << ch2 << ch3;
Run Code Online (Sandbox Code Playgroud)

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

cout << 'C' << '\t' << 'D' << '\b' << ch1 << ch3;
Run Code Online (Sandbox Code Playgroud)

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

\b一个表示退格的转义序列.它将光标向后移动一步.