为什么输出中缺少字母'D'?
Why is the letter 'D' missing in the output?
#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
是一个退格,因此将光标向左移动一个位置,然后用包含A
的ch1
覆盖D
。
cout << ch1 << 't' << ch2 << ch3;
打印A
、选项卡、B
,然后打印换行符。
cout << 'C' << 't' << 'D' << 'b' << ch1 << ch3;
打印C
,一个选项卡D
,然后将光标移动到D
后面,打印A
(这会覆盖字符D
),然后打印换行符。
CCD_ 19是表示退格的转义序列。它将光标向后移动一步。
其他人解释了D
被A
覆盖的原因,因为b
是退格的转义序列。
我想补充一点,不同机器的输出可能不同。CCD_ 23的实际显示方式取决于终端的实现。
为什么最后一个字母是A而不是D?
因为您输出的最后一个可见字符是A
:
cout << 'C' << 't' << 'D' << 'b' << ch1 << ch3;
ch1
是A
,ch3
是一条新线路。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打印值
- 为什么我的代码在输出中增加了93天
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么rk4.do_step不输出C++中的初始条件
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我在输出端得到 nan?
- 为什么递归函数的最终输出是 5?
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 为什么输出精度没有正确舍入?
- 为什么这个程序的输出不如预期
- 有人可以向我解释为什么控制台输出 0 吗?
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 执行此代码时,它不显示任何输出.为什么?
- 使用相同消息重新引发新异常会导致垃圾输出.为什么?
- 我的程序产生错误的输出.为什么
- 怪异的输出:为什么这段代码会给出任何有意义的输出,更不用说这个了
- %n格式说明符程序,在不同的编译器上提供不同的输出.为什么?
- 我的简单类函数中出现意外输出.为什么
- 如果语句不求值为false?程序给出奇怪的输出.为什么