C++空心菱形打印代码陷入无限循环,请求排查问题原因
排查C++空心菱形上半部分代码的无限循环问题
你的代码陷入无限循环的核心原因是把比较运算符==写成了赋值运算符=,具体出现在第一个嵌套循环的三元表达式里:
原错误代码片段:
for(j=n; j>=1; j--){ (j=i)?cout<<"* ":cout<<" "; }
问题详细解释
这个内层循环的逻辑是for(j=n; j>=1; j--),正常流程是:判断j>=1成立→执行循环体→执行j--。但你在循环体里写的j=i是赋值操作,不是判断j和i是否相等:
- 每次进入循环体,
j都会被强制设置为当前外层循环的i值(i从1到n,始终≥1)。 - 执行完循环体后
j--,j变成i-1,但下一次循环判断j>=1成立时,又会执行j=i把j重置为≥1的数值。 - 这个过程会无限重复,
j永远无法降到1以下,循环永远不会终止。
修正后的代码
把j=i改成j==i,同时调整第二个内层循环的逻辑,确保只打印边缘的星(实现空心效果):
#include <iostream> using namespace std; int main() { int n; cin >> n; for(int i=1; i<=n; i++){ // 打印左侧空格与行首的星 for(int j=n; j>=1; j--){ (j == i)? cout << "* ": cout << " "; } // 打印行尾的星,中间填充空格 for(int j=1; j<i; j++){ (j == i-1)? cout << "* ": cout << " "; } cout << endl; } return 0; }
修正逻辑说明
- 第一个内层循环:当
j等于当前行号i时打印星(行首位置),其余位置打印空格,实现左侧的缩进和空心的左边缘。 - 第二个内层循环:仅当
j是当前行的最后一个位置(j=i-1)时打印星(行尾位置),其余位置打印空格,实现空心的右边缘。
内容的提问来源于stack exchange,提问作者Harshit
相关产品推荐
相关产品推荐

