制表符(Tab) 一般处于键盘切换大小写(Caps Lock)上方,学习编程的时候总说一个 Tab 代表4个空格或者8个空格,然而今天在做 K&R《C Program Language》的练习题1-20的时候,我发现事情没这么简单。看以下情况:

    1. #include <stdio.h>
    2. int main(void){
    3. printf("01234567890123456789\n");
    4. printf("...\t....\t\n");
    5. printf("\t....\t\n");
    6. printf("........\t...\n");
    7. return 0;
    8. }

    这段代码的输出如下:
    image.png

    我们发现, tab 放在字符串 123 并没有空出8个空格!而是…5个!看到这里,有的小伙伴恍然大悟,可能觉得是不是制表符会保证前面的字符串和自己共占8位??但是实际上可能比我们想象中的还要恐怖!

    tab 是按照 字符位置 来决定如何补足的!

    拿上面第二行的例子说明(第一行是下标标识一下):

    1. 0123456789
    2. ...|||||x

    一开始的三个点点已经占用了下标0、1、2的位置,此时键入一个TAB键(默认8个空格),那么TAB键会补足后续的字符(这里为了直观用 | 代替空)一直到下标为7的地方(也就是代码里打x前的地方),x所在的位置被称为 制表符终止位制表符终止位 决定了制表符持续到何处再结束,而 制表符终止位 固定在4或8的倍数处(是4还是8取决于设定)。

    所以如果 制表符起始位 正好是8的n倍处,那么 制表符终止位 将会是在8的n+1倍处,故而能空出8个空格字符。(看第三行、第四行示例)

    如果制表符放在字符串中间,那么首先判断 制表符终止位 在哪里,然后空格空到 制表符终止位 之前(看第一行示例),切记 制表符终止位 只会出现在下标为8、16、24、32等8的倍数处(在 tab = 8空格情况下)。