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判断的作用域的问题。
11 个月之前 回复
qq_29594393
qq_29594393   Ds   Rxr 2017.01.15 23:37

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

wang2046783134
wang2046783134 ?但是不影响执行后面的k++呀?if里面是空语句,执行后会往后执行,会执行k++的
11 个月之前 回复
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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!