如何理解C++嵌套循环运行逻辑?关于三重循环条件的疑问
这段C++打印子数组代码的嵌套循环逻辑解析
先搞清楚这段代码的核心意图:它在遍历所有可能的起始索引i和结束边界j,输出从i到j-1的连续元素(也就是子数组),连空子数组也包含在内。
你纠结的i=0、j=0时第三重循环不执行的情况,其实对应长度为0的空子数组——此时起始索引i=0,结束边界j=0,没有元素需要遍历,所以循环直接跳过,打印空行。
三层循环的具体逻辑拆解:
- 外层循环
i:控制子数组的起始索引,从0到n-1遍历每个可能的起始位置。 - 中层循环
j:控制子数组的结束边界(不是结束索引,是边界),从0到n-1遍历每个可能的结束位置。 - 内层循环
k:从起始索引i开始,遍历到j-1(因为条件是k<j),把这段连续元素打印出来。
当j > i时,k的范围是[i, j-1],刚好是一段非空的连续子数组。比如i=0、j=2时,k取0和1,打印arr[0], arr[1],对应子数组[arr[0], arr[1]];
当j <= i时,k<j的条件不成立,循环不执行,直接打印空行,对应的就是空子数组。
为什么要这么设计?
这种写法是为了覆盖所有i和j的组合,哪怕是空子数组。但如果只需要打印非空的子数组,这段代码可以优化:把中层循环改成for(int j = i+1; j <= n; j++),这样j一定大于i,内层循环必然执行,不会出现空行,同时j<=n时,k能遍历到数组最后一个元素(索引n-1),更符合常规的子数组打印需求。
优化后的代码示例:
void printing_subarrays(int *arr,int n){ for(int i=0; i<n; i++){ for(int j=i+1; j<=n; j++){ for(int k=i; k<j; k++){ cout<<arr[k]<<", "; }cout<<endl; }cout<<endl; } }
内容的提问来源于stack exchange,提问作者Lucky Rajput
相关产品推荐
相关产品推荐

