黑马程序员技术交流社区

标题: 选择排序,有个小问题 [打印本页]

作者: 韶山    时间: 2014-9-28 21:22
标题: 选择排序,有个小问题
下面注释的那里,加个分号也能编译通过,执行后有个错误的排序结果。class Demo
{

public static void selectSort(int[] arr)
{

        for (int x= 0;x<arr.length-1 ;x++ )
        {
                for (int y= x+1 ;y<arr.length ;y++ )
                {
                        if(arr[x]>arr[y]) //在这里写了分号也能编译正确并且能执行出一个错误的结果
                        {
                                int temp = arr[x];
                                arr[x] = arr[y];
                                arr[y] = temp;
                        }
                }
        }
}
public static void printArray(int[] arr)
{
        System.out.print("[");
        for (int x=0;x<arr.length ;x++ )
        {
                if(x!= arr.length-1)
                        System.out.print(arr[x]+", ");
                else
                        System.out.println(arr[x]+"]");
        }
       
}

public static void main(String[] args)
        {
                int [] arr = new int[]{3,1,4,2,7,5};
                System.out.println("排序前的数组:");
                printArray(arr);
                selectSort(arr);
                System.out.println();
                System.out.println("排序后的数组:");
                printArray(arr);
        }

}


作者: 双皮奶    时间: 2014-9-28 21:24
你加了分号表示你的if语句已经结束了。下面括号里面的东西跟if就没关系了,相当于局部代码块,编译是肯定不会报错的
作者: ζ_____________    时间: 2014-9-28 21:46
class Demo
{

public static void selectSort(int[] arr)
{

        for (int x= 0;x<arr.length-1 ;x++ )
        {
                for (int y= x+1 ;y<arr.length ;y++ )
                {
                        if(arr[x]>arr[y]);    //如果这样写的话,表示这个if只有判断的条件,但是没有if所控制作用范围的区域.也就是说只不过就是读了一次就结束了.
                       //从这里开始, 和if一点关系都没有,下面的{}区域只是作为局部代码块所使用. 所以这里的代码是一定会被for循环执行到的. 也就是说, 每一次遍历都要交换一次.
       {
                                int temp = arr[x];
                                arr[x] = arr[y];
                                arr[y] = temp;
                        }
                }
        }
}
public static void printArray(int[] arr)
{
        System.out.print("[");
        for (int x=0;x<arr.length ;x++ )
        {
                if(x!= arr.length-1)
                        System.out.print(arr[x]+", ");
                else
                        System.out.println(arr[x]+"]");
        }

}

public static void main(String[] args)
        {
                int [] arr = new int[]{3,1,4,2,7,5};
                System.out.println("排序前的数组:");
                printArray(arr);
                selectSort(arr);
                System.out.println();
                System.out.println("排序后的数组:");
                printArray(arr);
        }

}



作者: 韶山    时间: 2014-9-28 22:56
双皮奶 发表于 2014-9-28 21:24
你加了分号表示你的if语句已经结束了。下面括号里面的东西跟if就没关系了,相当于局部代码块,编译是肯定不 ...

原来,有了分号相当于空语句。
作者: 双皮奶    时间: 2014-9-29 19:37
韶山 发表于 2014-9-28 22:56
原来,有了分号相当于空语句。

就跟{}一样的作用
作者: Eagle    时间: 2014-9-29 19:51
一楼正解,那个分号就已经结束了那个if语句,那后面的{}就没有和if关联了!后面的代码与if完全没有关系,
但是它包括在for语句里面,
没有被if语句执行到,会被for语句执行的,
所以能输出一个错误的结果,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2