C语言 do while循环的问题

#include<stdio.h>
main()
int i=20,n=0;
do{
    n++;
    switch(i%4)
    {  case 0: i=i-7; break;
       case 1:
       case 2:
       case 3: i++; break;
    }
}while(i>0);
printf("%d",n);
}

用计算机编译出来是17,我想知道算到了i取值为4的时候,那时候n的取值不是应该是15吗,取值为4的时候进行case0计算为-3,退出循环,直接进入while判断真假 结果为假输出15, 我一直算不懂为什么等于17 n++不是先取值再+1吗

i = 20,n = 1,20%4 = 0,i=i-7=13
i = 13,n = 2,13%4 =1,i++, i=14
i = 14,n = 3,14%4 = 2,i++,i=15
i = 15,n = 4,15%4 = 3,i++,i=16
i = 16,n = 5,16%4 = 0,i=i-7=9
i = 9,n = 6,9%4 =5,i++, i=10
i = 10,n = 7,10%4 = 2,i++,i=11
i = 11,n = 8,11%4 = 3,i++,i=12
i = 12,n = 9,12%4 = 0,i=i-7=5
i = 5,n = 10,5%4 =1,i++, i=6
i = 6,n = 11,6%4 = 2,i++,i=7
i = 7,n = 12,7%4 = 3,i++,i=8
i = 8,n = 13,8%4 = 0,i=i-7=1
i = 1,n = 14,1%4 =1,i++, i=2
i = 2,n = 15,2%4 = 2,i++,i=3
i = 3,n = 16,3%4 = 3,i++,i=4
i = 4,n = 17,4%4 = 0,i=i-7=-3
退出循环

1,2,3都会让i++
n=1,i=20,i%4=0,i=i-7=13
n=2,i=13,i%4=1,i++ ,i=14
n=3,i=14,i%4=2,i++,i=15
n=4,i=15,i%4=3,i++,i=16
n=5,i=16,i%4=0,i=i-7=9
n=6,i=9, 再3次后,i=12
n=9,i=12,i=i-7=5
n=10,i=5,再3次后,i=8
n=13,i=8,i=i-7=1
n=14,i=1,再3次后,i=4
n=17,i=4,i=i-7=-3,由于-3小于0,break结束

循环次数in
1131
2142
3153
4164
595
6106
7117
8128
959
10610
11711
12812
13113
14214
15315
16416
17-317

n做完一次循环自增1,不用管他是先++还是后++
i=4的时候这次循环刚结束下一次循环才-7