2 sinat 25136209 sinat_25136209 于 2017.01.15 23:21 提问

关于java中的一个小问题

如图图片说明
这是一个求最大公约数的方法,我想问的是,如果给if语句后面加上括号,就是像我图片中那样的

public static int gcd(int n1,int n2){
        int gcd=1;
        int k=2;
        while (k<=n1&&k<=n2) {
            if (n1%k==0&&n2%k==0)
            { //看到有套嵌的循环不要跳。。。仔细看。。。
                gcd=k;
                k++;
                //continue;
            }

            System.out.println("11111");
            System.out.println(gcd);
        }

        return gcd;


    }

如果给if加上了{},为啥这个while循环跳不出来?

5个回答

gelangqing
gelangqing   2017.01.16 11:11
已采纳

请注意加上大括号后意味着只有当n1,n2对k取余都为0的情况下k值才会改变,我们以k=2,n1为大于2的奇数来讲,那么n1%k==0永远不可能成立,意味着k只能等于2,进了这个循环便没有退出条件因此构成死循环。当你不加大括号时,if的执行体是 gcd=k;这一条语句, k++;不属于循环体,因此每次迭代k值都会增大,直到退出循环。

gelangqing
gelangqing 追加: “k++;不属于循环体”写错了,应该是“ k++;不属于if条件的执行体”。加上大括号是指明了该判断语句或者循环的作用域,如果不加大括号则说明执行体是紧跟判断语句后面的第一条语句。所以你这个问题就是if判断的作用域的问题。
一年多之前 回复
qq_29594393
qq_29594393   Ds   Rxr 2017.01.15 23:37

if会执行空语句k n1 n2 的 值都没有发生改变 。然后就是一值输出,自然是死循环了

wang2046783134
wang2046783134 ?但是不影响执行后面的k++呀?if里面是空语句,执行后会往后执行,会执行k++的
一年多之前 回复
qq_25796431
qq_25796431   2017.01.16 08:46

可以试想一下if里面是flase的时候,if后面的代码块并没有执行,也就是k值没有变化。循环一直为真。然后就是死循环了。

wang2046783134
wang2046783134   2017.01.15 23:32

图片和后面的代码一样啊?? 是我眼花了~~?
有没有语法错误提示?加上{}后应该在里面加一个;,这样if会执行空语句,然后接着执行后边的,试试?

u010920327
u010920327   2017.01.16 16:25

int getGCD(int x, int y) {
while(y!=0){
y=x+y;
x=y-x;
y=(y-x)%x;
}
return x;
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
数组的两个小问题
1.不可以对数组名(指针常量)进行赋值操作2.对数组进行整体赋值只能在最初声明的时候进行。
关于泛型和重载的小问题
 首先描述问题,看代码。代码例子:view plaincopy to clipboardprint?import java.util.ArrayList;   public class Test {       public static String test(ArrayList list){           return "";       }       public static Integer test(ArrayList list){           return 1;       } 
java中的数组的常见操作问题
数组操作常见操作     对数组操作最基本的动作就是存和取。     核心思想:就是对角标的操作。     示例:遍历并打印数组元素 class ArrayDemo{ public static void main(String[] args) { int[] arr = {89,34,270,17}; for
数组操作的两个常见小问题
/* 数组操作的两个常见小问题: ArrayIndexOutOfBoundsException:数组索引越界异常 原因:你访问了不存在的索引。 NullPointerException:空指针异常 原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。 作用:请自己把所有的场景Exception结尾的问题总结一下。以后遇到就记录下来。  现象,原因,解决方案。 */
一个有趣的小问题
有兄弟三人:大毛,二毛,三毛。有帽子五顶:三顶蓝色,两顶红色。将这五顶帽子随机发给三个 兄弟,三兄弟站成一列,后面的人能看见站在他前面的人,按大毛、二毛、三毛的顺序站好。 帽子分发好后,大毛问三毛:你知道你的帽子是什么颜色的吗? 三毛说:我不知道。
AMDD 一个把大问题分成小问题的优化算法
还没看懂,先记下地址“ 这个博客上有基础知识: http://www.cnblogs.com/breezedeus/p/3496819.html 下面是AMDD http://web.stanford.edu/~boyd/admm.html
善于用Java File类解决生活中遇到的一些问题
        在用手机QQ音乐升级完音质后,会将原来的音乐名xxx.mp3,变成了xxx_(1).mp3。由于本人有强迫症,所以自己编写了个方法去转换,其中可以使用File.renameTo()方法将原来的文件改名,然后移动到新的文件夹中。public class ChangeFileName { public static void ChangeFileName(String old...
一道需要完备逻辑思考的小Java题目(对入小白)
在网易云课堂上的《Java应用基础:入门篇》中有这样一道题,多项式加法: 一个多项式可以表达为x的各次幂与系数乘积的和,比如:(下图中倒数第二项应该是6x,而不是6的x次幂) 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。 程序要处理的幂最大为100。 输入格式: 总共要输入两个多项式,
Java中的一个小问题
今天突然被同学问到一个小问题:Java中有两个方法,其中两个方法的名称、返回值、参数列表都相同,但有一个带有static,有一个不带,那这两个方法属于方法重载吗?遇到这个问题,我首先想到的是一个方法属于类,一个方法属于对象,而且方法重载主要看参数列表的类型或数量,所以第一印象是这两个方法不属于方法重载。但心里没底,回到实验室编写一下程序看一下,结果是不合法,无语中。。。 public cla
使用java解决数学中的问题
1.输入两个正整数m和n,求其最大公约数和最小公倍数。package com.test;public class asgasaf { /** * 输入两个正整数m和n,求其最大公约数和最小公倍数 * 在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数, * 取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0,