大多数终端程序将在每 8 列有一个制表位 - 所以我希望输出是这样确定的(我知道你的输出有点不同 - 下面讨论):
. column
. 1 2
input 12345678901234567890
"%d",printf("hello%d\t" hello2__7
"%d",printf("hello\t%d" hello___27
"%d",printf("\thello%d" ________hello27
要理解这一点,您必须了解(不必要的复杂)代码的评估顺序。检查第一printf
行...
printf("%d",printf("hello%d\t",scanf("%d%d",&a,&b)));
上面,左边的参数必须在它自己打印任何东西之前准备好,这些参数包括调用右边的结果。右侧输出,从标准输入读取的参数数量,如果您键入两个,则为 2,然后是选项卡,然后右侧已完成输出并返回“7”以指示它打印了多少个字符,即打印靠左手。我希望一个选项卡将您带到屏幕上的第 9 列,这表明 7 之前有两个空格,正如您的问题所说,您正在观察 1。显然,您的终端的工作方式有点不同,可能考虑到第 8、16 列,第 24 列等为制表位。 printf
printf
printf
hello
scanf
printf
printf
更多关于标签
TAB 字符没有通用的解释\t
...它的渲染方式取决于您使用的终端软件或渲染设备(例如 xterm、vt220、vt100 终端、MS-DOS 命令窗口、打印机、IDE、文本编辑器等.)。
一些显示/打印/格式化程序会考虑每 N 个字符有一个制表位,其中 N 通常是 8,这样如果您从第一列到第 8 列发出制表符,您将被带到第 9 列,a从第 9 列到第 16 列的选项卡将您带到第 17 列等等。但是,许多程序将有办法为选项卡放置设置任意列。像 MS Word 这样的一些程序可以使用可变宽度字体,其中制表位之间的字符数会有所不同:如果您的 C++ 程序打印一些您导入 Word 的文本,您可能会发现实际上不可能计算出需要多少个制表符才能获得所需的输出对齐方式 - 通常更容易在值之间放置一个制表符并在 Word 中更改制表位,这样看起来一切正常,或者坚持使用固定宽度的字体,例如 Courier。
C++ IDE 通常允许您为每个制表位的列设置值(上面的“N”) - 4 和 8 都是常见设置,8 通常意味着您的源代码缩进是制表符和空格的混合,以达到所需的左侧-column:使用幼稚的光标移动实现进行导航有点混乱。许多人更喜欢设置“按下制表符时插入空格”选项,以便文件始终与实际空格一起保存,并且使用各种显示/打印软件更可预测地显示。