这个程序为啥输出是2 3 4,那个%2d是啥意思?


#include <stdio.h>
void main()
{
  int k=2;
  switch(k)
  {
    case 1: printf("%2d",k++);
    case 2: printf("%2d",k++);
    case 3: printf("%2d",k++);
    case 4: printf("%2d",k++);break;
    default: printf("Full!\n");
  }
}

% 2dC程序语言书上不是写过嘛?当k的值为2时,程序从case 2开始执行,没有break停止,就一直到4输出k的值。k++和++k的基本知识你得好好去了解下,
%2d是一个格式化输出的占位符打印整数,至少占据2个字符的宽度。

case 2 和 case 3 后面都没有break,所以匹配到它们,执行完都是会继续执行下面的case,直到遇到有break并退出switch
%2d 打印两位数字, 对齐方式是 右对齐,不足的两位前面补空格

%2d是数字以2位宽度显示,如果不足2位前面补空格,超过2位输出原数。

测试如下:

参考链接:


 
 
#include <stdio.h>
int main()
{
  int k=2;
  switch(k)  // 因为初始k为2,这里匹配case 2,所以switch里面先进入case 2 执行 
  {
 
    case 1: printf("%2d",k++); 
    // 这里因为k初始为2,所以打印: 22前面有个空格, 以保持2位数字宽度 和%2d对应 
     //然后++, k变为3 
     // https://blog.csdn.net/qq_41348629/article/details/109683026
    case 2: printf("%2d",k++);
     // 因为前面的case没有break,所以继续执行这个case
    // 前面k变为了3 , 所以这里打印: 33前面也有个空格, 同样是保持2位数字宽度 
    // 然后++, k变为4 
    case 3: printf("%2d",k++);
    // 同上,k为4 ,打印:44前面也有个空格,保持2位数字宽度,与%2d相对应
    // 然后++变为5,但是后面没有打印语句,并且这里有break就退出了switch-case语句
    // 所以总共打印出来的就是: 2 3 4, 每个数字前面一个空格 
    case 4: printf("%2d",k++);break;
    default: printf("Full!\n");
  }
}


img

1.case里没有break会贯穿标签,执行后续标签里的代码
2.%2d的意思是输出占2个字符宽度,不足2字符在左侧补空格
如果直接写%d,那么输出会是234,中间没有空格