鱼C论坛

 找回密码
 立即注册
查看: 1021|回复: 6

[已解决]S1E21:指针的动动手请教

[复制链接]
发表于 2021-2-13 18:17:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 1999杨小小 于 2021-2-13 18:17 编辑

两层循 环的意思我大概能理解,但里面的if(j-i>4)和goto存在的作用不清楚,麻烦各位前辈指点下
  for (i = 1; i < cubed; i += 2)
        {
                for (j = i; j < cubed; j += 2)
                {
                        sum += j;
                        if (sum == cubed)
                        {
                                if (j - i > 4)
                                {
                                        printf("%d = %d + %d ... + %d\n", cubed, i, i+2, j);
                                }
                                else
                                {
                                        printf("%d = %d + %d + %d\n", cubed, i, i+2, i+4);
                                }
                                goto FINDIT;
                        }

                        if (sum > cubed)
                        {
                                sum = 0;
                                break;
                        }
                }
        }

FINDIT:

        return 0;
}
最佳答案
2021-2-13 19:38:37
                               if (j - i > 4)
                                {
                                        printf("%d = %d + %d ... + %d\n", cubed, i, i+2, j);
                                }
                                else
                                {
                                        printf("%d = %d + %d + %d\n", cubed, i, i+2, i+4);
                                }
                                goto FINDIT;

j-i>4  是判断这个数是几个数相加的,因为一个数字,j循环一次
如果数字多就用第一种输出方法输出,否则就用第二种

goto 语句的话是用来跳出循环的
两层循环的话break,不太好跳出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-13 18:48:00 | 显示全部楼层
j - i > 4应该是判断立方值大于8时候的输出值(16,25,...)
goto作用:因为有两层循环,直接使用break退出只能退出1层循环,所以得到输出后直接采用了goto语句直接跳到FINDIT:return 0 来退出程序;
但建议不用goto,还用其他方法可以用的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-13 19:38:37 | 显示全部楼层    本楼为最佳答案   
                               if (j - i > 4)
                                {
                                        printf("%d = %d + %d ... + %d\n", cubed, i, i+2, j);
                                }
                                else
                                {
                                        printf("%d = %d + %d + %d\n", cubed, i, i+2, i+4);
                                }
                                goto FINDIT;

j-i>4  是判断这个数是几个数相加的,因为一个数字,j循环一次
如果数字多就用第一种输出方法输出,否则就用第二种

goto 语句的话是用来跳出循环的
两层循环的话break,不太好跳出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-13 20:23:24 | 显示全部楼层
一叶枫残 发表于 2021-2-13 18:48
j - i > 4应该是判断立方值大于8时候的输出值(16,25,...)
goto作用:因为有两层循环,直接使用break退 ...

这种情况下,用 goto 是最简洁而高效的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-13 21:21:47 | 显示全部楼层
永恒的蓝色梦想 发表于 2021-2-13 20:23
这种情况下,用 goto 是最简洁而高效的。

那直接把return 0写在里面不是更简洁?????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-13 21:36:31 | 显示全部楼层
一叶枫残 发表于 2021-2-13 21:21
那直接把return 0写在里面不是更简洁?????

好吧,有道理。
我的意思是说,在退出多重循环的时候,goto 是最简洁而高效的(直接返回除外)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-16 15:24:51 | 显示全部楼层
谢谢前辈们,我懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 15:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表