A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈林阳 黑马帝   /  2011-9-15 20:40  /  2392 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class ArrayDemo
{
        public static void main(String[] args)
        {
                int[] a ={2,5,3,9,6,1,8};
                int x;
                for(x =0;x<a.length-1;x++)
                {
                        for(int y =x+1;y<a.length;y++)
                        {
                                if(a[x]>a[y])
                                {
                                        int temp = a[x];
                                        a[x] = a[y];
                                        a[y] = temp;
                                }
                        }
               
                }
                System.out.println(a[x]);
        }
}

取数组中的最大值,通过这个程序可以取出最大值,可是我不知道为什么最后的输出语句上是a[x],x不是x<a.length-1吗?那么a[x]就应该是数组中倒数第二个啊,可是它的取值却是最后一个,还有System.out.println(a[x])语句在for循环外,for循环里的x的变化不是只在循环里有效吗?那么循环外a[x]的x就应该是只定义了int,而没有取值范围的啊?请大家帮我详细解释下,谢谢

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 鼓励一下下!

查看全部评分

9 个回复

倒序浏览
楼主,你那个代码是排序用的,求最大值应该是这样:

public static void max(int [] arr)
{
int max=arr[0];
for(int x=0;x<arr.length;x++)
  {
  if(arr[x]>max)
   max=arr[x];
  }
System.out.print("max="+max);
}

调用max把你的数组作参数就可以得出你数组里的最大值.求最大值的思路是这样的:把数组第一个元素的值赋给变量max,并遍历数组用数组每一个元素与max比较,当有比max大的值时,把该值赋给max.
[ 本帖最后由 杜桂发 于 2011-09-15  21:11 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 回答的不错!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-15 21:38:06
藤椅

回复 藤椅 的帖子

x<a.length-1,  a.length-1不是最后一个吗?那么x<a.length-1的话,x最大也就是倒数第二位的啊 ,把你的运行出来的x是6,也就是最后一位,可是按照x<a.length-1,a[x]应该是倒数第二位的
回复 使用道具 举报
黑马网友  发表于 2011-9-15 21:47:43
板凳
你这个是 排序,,大的数排后,,  
  这里输出 a[x] ,,为正确值,是因为,x在等于5时,又++了,只是没满足<a.length-1而再执行循环。。
  还有,这里的x的声明是在循环外的,所以最后的输出语句依然能访问。。而在循环里赋值,那怕这循环不执行  x 也=0,,
回复 使用道具 举报
黑马网友  发表于 2011-9-15 22:26:11
报纸
楼主的这个程序可以实现数组从小到大的排序,并把数组最后一个元素打印出来,看楼主的代码[code]for(x =0;x<a.length-1;x++)
                {
                        for(int y =x+1;y<a.length;y++)
                        {
                                if(a[x]>a[y])
                                {
                                        int temp = a[x];
                                        a[x] = a[y];
                                        a[y] = temp;
                                }
                        }
               
                } [/code]楼主定义的数组中实际有7个元素,当x=5时,程序执行完循环代码后加一,即x=6,在执行判断语句x<a.length-1,不成立,跳出循环,此时x=6,故打印的是最后一个元素.
回复 使用道具 举报
黑马网友  发表于 2011-9-16 16:09:13
地板
a[x]是在第一个for外显示的,所以x++后,a【x】就是最后一个了。你不妨把System.out.println(a[x]); 他移动到两个for中间,那就只显示6个数了。你的x定义在for外所以System.out.println(a[x]); 能在for外显示。个人理解,有错指教
回复 使用道具 举报
黑马网友  发表于 2011-9-16 23:22:06
7#
我同意7楼lily的回答
先回答你的第二个问题:System.out.println(a[x])语句在for循环外,for循环里的x的变化不是只在循环里有效吗?那么循环外a[x]的x就应该是只定义了int,而没有取值范围的啊?
这涉及到一个变量的作用域的问题,x变量的作用域从它定义的位置起,到main()函数结束,所以在for语句中是可以访问到x变量并对其值做修改的。
然后第一个问题:为什么最后的输出语句上是a[x],x不是x<a.length-1吗?那么a[x]就应该是数组中倒数第二个啊,可是它的取值却是最后一个
你应该这样理解,程序为什么会跳出for循环,是因为x<a.length-1这个条件不满足,所以跳出for循环的时候x=a.length-1,而不是x=a.length-2,反过来想,当x=a.length-2时此时满足x<a.length-1这个条件,所以不会跳出for循环,会再循环一次,执行x++后,x=a.length-1,此时不满足x<a.length-1这个条件所以跳出了for循环,所以在跳出for循环的时候x=a.length-1,a[x]是数组的最后一个元素

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 回答的不错!

查看全部评分

回复 使用道具 举报
李叶 黑马帝 2011-9-17 08:57:03
8#
呵呵,这个问题分两个部分解释一下吧:

===========================分割线===========================

首先,对于x的取值问题,楼上的贾双涛童鞋已经回答的很正确了,在此我们先把结论提取出来:
一个变量,只要是在它的作用域内,任何语句对它进行修改或者访问的时候,操作的都是同一个变量

那么,什么是变量的作用域呢?
为了方便讲解,咱们先看一下下面两段代码吧:[code=java]//代码1
public void printX() {
  int x;                          //在for循环之外定义了x

  for(x=0; x<10; x++) {           //在for循环之中改变x的值
    //...                         //本处代码略,下同
  }

  System.out.println(x);          //在for循环之外打印x的值
} [/code][code=java]//代码2
public void printX () {
  for (int x=0; x<10; x++) {      //在for循环之中定义x和改变x的值
    //...
  }
  System.out.println(x);          //在for循环之外打印x的值
}[/code]如果你实际测试一下的话,你就会发现
代码1中的x可以被正常打印出来,而代码2则会编译报错
这是为什么呢?其实只需要简单观察一下代码,我们就可以发现
代码1中的x是在printX方法之中(也就是for循环之外)定义的,而代码2中的x是在for循环之中定义的
所以,代码1中的x就能在整个printX方法中使用,而代码2中的x就只能在for循环之中使用
所以,我们就可以说,代码1中的x的作用域就是整个printX方法中,而代码2中的x的作用域就只有for循环中

所以,我们再回来看一下你的代码吧:[code=java]public static void main(String[] args) {
  //...
  int x;
  for(x =0;x<a.length-1;x++) {
    //...
  }
  System.out.println(a[x]);
} [/code]我们可以很清楚的看到,由于x是在main方法中定义的
所以,我们就可以说,你的代码中的x的作用域就是整个main方法中

好了,我们再结合一开始所说的那句话来重新理解一下你的程序吧:
一个变量,只要是在它的作用域内,任何语句对它进行修改或者访问的时候,操作的都是同一个变量
之前我们已经说过了,在你的代码中,x的作用域是在整个main方法中的
而for语句和下面打印a[x]的语句也是存在于main方法之中的
所以,for语句和打印a[x]的语句就都在x的作用域内

因此,for语句对x的修改,修改的就是在main方法中定义的这个x
而下面打印a[x]的语句中访问的x,访问的也是在main方法中定义的这个x
所以,在for语句中对x的修改,就可以被下面的a[x]访问到,因为它们操作的都是同一个x

===========================分割线===========================

然后我们再来看一下第二个问题,其实这个问题很简单,我只要写一段等价的代码,你应该就明白了[code=java]//for循环的代码
for(x =0;x<a.length-1;x++) {
  ...
}

//等价的代码
x = 0;                  //首先为x赋初始值
while (x<a.length-1) {  //然后循环判断x的值是否满足条件
  ...
  x++;                  //最后再执行x++
}[/code]从等价的代码可以看到,x++实际上是每次循环结束后才执行的
然后就还是楼上贾双涛童鞋的解释了:
当x=a.length-2的时候,while条件满足
于是执行循环中的语句,然后再执行x++,此时x=a.length-1
然后继续判断while条件,由于不满足,于是跳出循环
此时x就已经是a.length-1了,所以a[x]就是数组中的最后一个元素
[ 本帖最后由 李叶 于 2011-09-17  09:01 编辑 ]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马