#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?
答案 0 :(得分:14)
你cout
输出的所有内容。只是终端会将'\b'
解释为"go back one character"
。尝试将输出重定向到文件并使用(十六进制)编辑器检查它以查看所有字符(包括'\b'
)是否存在。
乍一看,人们可能会认为终端按原样打印输出。但这是不正确的。终端在遇到特殊终端控制序列或字符时会改变它们的行为方式。 '\b'
(= 0x08
=退格)字符就是其中之一。更多信息可以在http://ascii-table.com/ansi-escape-sequences.php找到。您可以尝试将其中的一些打印到终端并看到它改变颜色,重写当前行等等。实际上,您可以使用这些特殊的序列和字符在命令行中制作完整的类似GUI的应用程序。
但请注意,并非所有程序都可以依赖"redirect to a file"
技巧来查看他们写入stdout的终端控制序列。许多程序检测它们是否正在写入终端并相应地调整它们对终端控制序列的使用(或缺少)。
答案 1 :(得分:11)
\b
是一个退格键,因此您将光标向左移动一个位置,然后用D
覆盖ch1
,其中A
包含X,Y,Z
0,0,0
1,0,0
0,1,0
1,1,0
0,0,1
1,0,1
0,1,1
1,1,1
。
答案 2 :(得分:6)
A
打印B
,标签cout << 'C' << '\t' << 'D' << '\b' << ch1 << ch3;
,然后打印换行符。
C
打印D
,一个标签D
,然后将光标移到A
后面,打印D
(这会覆盖字符\b
)然后,打印换行符。
{{1}}是an escape sequence,代表backspace。它将光标向后移动一步。
答案 3 :(得分:2)
其他人解释了onDown()
被D
覆盖的原因,因为A
是退格的转义序列。
我想补充说不同机器上的输出可能不同。实际显示\b
的方式取决于终端的实现。
答案 4 :(得分:1)
为什么最后一个字母A而不是D?
因为您输出的最后一个可见字符是A
:
cout << 'C' << '\t' << 'D' << '\b' << ch1 << ch3;
ch1
是A
,ch3
是新行。并且D
未显示,因为您使用'\b'
答案 5 :(得分:1)
cout << 'C' << '\t' << 'D' << '\b' << ch1 << ch3;
行的作用是:
打印C,
制作空格(tab \ t)
打印D
返回(退格\b
)
打印A D所在的位置(D现在已被删除)
新行(\ n)
答案 6 :(得分:0)
因为\ b跳回并覆盖D
答案 7 :(得分:0)
由于代码中的这一行//&#39; D&#39; &LT;&LT; &#39; \ B&#39; &LT;&LT; ch1&lt;&lt; , &#39; d&#39;将打印D. &#39; \ B&#39;是退格,所以D被删除 ch1打印值为A