猎人火皮 2025-10-21 23:50 采纳率: 100%
浏览 16
已结题

关于对if else 语句的研究!C语言程序问题,求师兄师姐们看一下

img


各位师兄师姐,我最近对if语句进行研究,发现了一共有四种情况是我还想不通的。其中前3种可以显示我需要的内容,最后1种不行,我想请教一下,这3种有效的显示哪些最标准,哪些尽量避免使用。另外,针对上面图片的第四种情况,个人心想的逻辑应该是这样的:先竖打印123456789,然后竖打印-1-2-3-4-5-6-7-8-9,然后打印很长的一竖,到了这个时候,j是等于2的,所以接下来应该是打印(i - 2) * (j - 2)即(3-2)*(2-2)等于0,其中i会自增,而j一直是2,也就是说,j-2一直是0,所以应该会出现很长的一竖000000000才对,不知为何不是这样显示。

以上两个问题这个是我目前的疑问,望不吝指教!


#include <stdio.h>
int main()
{
    int i, j;
    for (i = 1; i <= 11; i++) {
        if (i == 1) {
            for (j = 1; j <= 11; j++) {
                if (j == 1)
                    putchar(' ');
                else if (j == 2)
                    putchar('|');
                else if (j > 2)
                    printf("%3d", i * (j - 2));
            }putchar('\n');
        }

        if (i == 2) {
            for (j = 1; j <= 11; j++){
                printf("---");
            }putchar('\n');
        }

        if (i > 2) {
            for (j = 1; j <= 11; j++) {
                if (j == 1)
                    printf("%d", i - 2);
                if (j == 2)
                    putchar('|');
                else 
                    printf("%3d", (i - 2) * (j - 2));
            }putchar('\n');
        }
    }

    return 0;
}
  • 写回答

1条回答 默认 最新

  • 武子康 优质创作者: 后端开发技术领域 2025-10-23 16:12
    关注

    为啥不是一列 0?

    悬挂的 else 绑定规则:else 总是和最近、尚未匹配的 if 绑定。上面代码里,else 跟的是 if (j == 2),不是前面的 if (j == 1)。
    ⇒ 当 j == 2 时,if (j == 2) 为真,执行 putchar('|'),else 不会执行,因此不会打印 (i-2)*(j-2) 的 0。

    循环变量会自增:就算你让 j==2 分支里也去打印 0,每一行也只会在这一列打一个 0(形成竖着的一列 0),不是一整行很多个 0。因为 for (j=1; j<=11; j++) 每次循环后 j 会变成 3、4、…,不可能“j 一直等于 2”。

    你的语法尽量是规范的按照,大括号的形式来,不用大括号的话不规范也不利于后续维护,比如语法如下:

    for (j = 1; j <= 11; j++) {
        if (j == 1) {
            printf("%2d", i - 2);
        } else if (j == 2) {
            putchar('|');
            // 如果你真的想在竖线这一列下面显示 0,再加一条:
            // printf("%3d", 0);
        } else {
            printf("%3d", (i - 2) * (j - 2));
        }
    }
    
    #include <stdio.h>
    int main(void)
    {
        int i, j;
        for (i = 1; i <= 11; i++) {
            if (i == 1) {
                for (j = 1; j <= 11; j++) {
                    if (j == 1) {
                        putchar(' ');
                    } else if (j == 2) {
                        putchar('|');
                    } else { // j > 2
                        printf("%3d", i * (j - 2));
                    }
                }
                putchar('\n');
            }
    
            if (i == 2) {
                for (j = 1; j <= 11; j++) {
                    printf("---");
                }
                putchar('\n');
            }
    
            if (i > 2) {
                for (j = 1; j <= 11; j++) {
                    if (j == 1) {
                        printf("%d", i - 2);
                    } else if (j == 2) {
                        putchar('|');
                    } else {
                        printf("%3d", (i - 2) * (j - 2));
                    }
                }
                putchar('\n');
            }
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月1日
  • 已采纳回答 10月24日
  • 创建了问题 10月21日