C语言连续单行非嵌套for循环执行异常排查
最终编辑
调试代码时,我发现第一个循环执行了n次,但后续循环仅执行一次。后来才发现预期的数值修改其实已完成,只是循环语句像是一次性走完所有迭代。从第二个循环开始,在VSCode中按F10会直接跳转到下一个循环而非下一次迭代,这是MinGW64编译器的表现。
将循环格式改为如下形式后:
for( ; x<n; x++) { p[y][x] = h; } x--; for( ; y<n; y++) { p[y][x] = h; } y--; etc...
每次迭代都会被单独识别:现在从第二个循环开始,按F10会跳转到下一次迭代而非下一个循环。
结论:两种代码风格执行效果一致,但调试表现不同。
以下是仍不够规范但运行符合预期的版本:
#include <stdio.h> int main(){ int n,size,sqrs,start=0,h,y,x; scanf("%i",&n); int p[n][n]; size = n; if(n%2==0) sqrs = n/2; else sqrs = n/2+1; h = 1; y = start; x = start; for(int t=0; t<sqrs; t++){ for( ; x<n; x++) p[y][x] = h; x--; for( ; y<n; y++) p[y][x] = h; y--; for( ; x>=start; x--) p[y][x] = h; x++; for( ; y>=start; y--) p[y][x] = h; y++; y++; x++; h++; start++; n--; } for(int i=0; i<size; i++){ for(int j=0; j<size; j++){ printf("%i ",p[i][j]); } printf("\n"); } }
编辑内容
我尝试构建一个数值向中心递增的金字塔形矩阵。此前使用单行单语句for循环从未出现问题,但将它们连续放置时,除第一个循环外,后续循环均被跳过。
我理解的逻辑是:每个for循环后接单语句,以分号结尾,之后应执行下一个for循环。但实际第一个循环正常运行,后续循环因已满足终止条件而被跳过。
我强调“非嵌套”是因为:
- 搜索相关问题时,找到的都是嵌套循环和if语句使用大括号的相关内容;
- 每个for循环/语句都以分号结尾。
我尝试给单语句添加大括号,但未解决问题。而同时添加大括号和换行,如下所示时,问题得以解决:
for( ; y<n; y++) { p[y][x] = h; }
但我仍不清楚为何在这种情况下C语言需要这样的格式。例如调试时发现第二个循环被跳过是因为y的值从0变为4,这本身就令人费解。
抱歉之前表述模糊!
原始提问
以下是我的代码:
#include <stdio.h> int main(){ int n,sqrs,start=0,h,y,x; scanf("%i",&n); int p[n][n]; if(n%2==0) sqrs = n/2; else sqrs = n/2+1; h = 1; y = start; x = start; for(int t=0; t<sqrs; t++){ for( ; x<n; x++) p[y][x] = h; // 这些循环 for( ; y<n; y++) p[y][x] = h; // 此处y从0变为4 for( ; x>=start; x--) p[y][x] = h; for( ; y>=start; y--) p[y][x] = h; y++; x++; h++; start++; n-=2; } for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ printf("%i",p[i][j]); } printf("\n"); } }
如你所见,这些循环并非嵌套结构。它们本可能嵌套,但循环间有其他语句。
第一个循环正常迭代,但后续循环均被跳过。
我设法解决了问题,但奇怪的是只有同时添加大括号和换行(即除第一个循环外,所有循环改为如下形式)时才有效:
for( ; y<n; y++) { p[y][x] = h; }
这对我来说仍是个谜。若此问题重复,我深表歉意,只是我找不到相关的具体内容。
编辑补充:感谢大家注意到我要打印金字塔形矩阵。之前未提及是因为我以为问题仅与语法相关,功能无关紧要。
内容的提问来源于stack exchange,提问作者101is5

