为何C语言星号图案打印的替代代码输出不符合预期?
问题原因分析
你的第二段代码存在两个关键错误,导致输出与预期不符:
1. 循环条件写法不符合C语言语法规则
C语言不支持2 * n - i >= j > n - i这种连续范围比较的写法。关系运算符是左结合的,这个表达式会被编译器解析为:
(2 * n - i >= j) > (n - i)
也就是先判断2*n -i >=j,得到布尔值0或1,再用这个结果和n-i比较。比如当n=3、i=1时:
- 第一步:
5 >=3结果为1(真) - 第二步:
1 > 2结果为0(假)
循环条件直接不成立,这一行不会打印任何星号。
正确的范围判断应该用逻辑与&&拆分:
j > n - i && j <= 2 * n - i
2. 缺失空格打印逻辑
你的第一段代码是先打印空格,再打印星号,而第二段代码只处理了星号的打印,完全跳过了前面需要输出空格的部分。即使修正了循环条件,代码也只会直接打印星号,不会在前面输出空格,自然和第一段代码的输出不一致。
比如n=3、i=1时,第一段代码先打印3-1+1=3个空格,再打印3个星号;而第二段代码的循环只处理星号位置,j=1到2的位置没有输出空格,这部分不会显示任何字符。
如果想用单个循环实现第一段代码的效果,需要在循环中判断当前位置是打印空格还是星号,示例代码如下:
#include <stdio.h> int main() { int n, i, j; printf("Enter no. of rows: "); scanf("%d", &n); for (int i = 1; i <= n; i++) { // 遍历每行的所有字符位置 for (int j = 1; j <= (n - i + 1) + n; j++) { // 前n-i+1个位置打印空格,其余打印星号 if (j <= n - i + 1) printf(" "); else printf("*"); } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Nirbhay
相关产品推荐
相关产品推荐

