先分析第一个外层A循环
a=1; a<=3; a++,可以判断出循环时
A={1, 2, 3}
再看内部的B循环
b=1;b<=6 - 2*a; b++
这里可能比较令人难解的是a和b的对应关系,但这没关系,代数试一下
对于集合A每次执行时的6-2*a 返回的结果都是什么姑且定义为A'
则A' = 6-2*A = {6-2*1, 6-2*2, 6-2*3} = {4, 2, 0}
由于b的范围是动态的,b的自增规律是从1到A'对吧,
第一次A循环,B循环执行了4次,从1到4
第二次A循环,B循环执行了2次,从1到2
第三次A循环,B循环执行了0次,没问题吧?
所以三次A循环下来,B分别输出了4个空格,2个空格,和没有空格(用s代替空格) 如:
ssssxxxx,ssxxxx,xxxx
后边x表示另一个循环输出的结果
所以B的循环次数就是
B={4, 2, 0}
最后看C循环
从1到a对吧,那么对照一下C的循环和A的循环结果
A={1,2,3}
C={1,2,3,4.....}
可以看出如果A循环1次,则C也循环1次,因为1<=1。
如果A循环2次,C循环2次,因为2<=2,以此类推,
直到a的三次循环结束。
所以C的循环结果为
C={1, 2, 3}
看C输出什么?
printf("%c" 输出一个char,
输出的是 'A' + a - 1
已知 char 类型此时是可以作为数字进行运算的,
那么大写的A根据ASCII码表可知,
'A'+1 = 'B'
'B'+1='C'
以此类推
所以我们后边加的是什么呢?
'A' + a - 1
加a之后减一,那根据循环结果A来看
A-1 = {0,1,2} 对吧
所以分别输出的是 A,B,C
根据我们上述所有的结论来看,输出结果是
1.先输出 {4, 2, 0} 个空格
2.再输出 { {1个'A'}, {2个'B'}, {3个'C'} }
于是最终结果用s代替空格就是:
ssssA
ssBB
CCC