向前辈请教个for循环小问题

cqboyone 2017-07-06 07:54:40
为什么我把for循环的变量定义拿到前面去算出来就是错的呢?
...全文
239 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
110成成 2017-07-06
  • 打赏
  • 举报
回复
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 5555, 85, 65, 78, 4, 54, 1, 8, 48, 5 };
		int i = 0;
		int n = 0;
		// int i;
		// int n;
		int num = 0;
		for (; i < arr.length; i++) {
			System.out.println("==i==" + i + "====");
			for (; n < arr.length - 1 - i; n++) {
				System.out.println("===n==" + n + "====");
				if (arr[n] > arr[n + 1]) {
					num = arr[n];
					arr[n] = arr[n + 1];
					arr[n + 1] = num;

				}

			}

		}
		for (int m = 0; m < arr.length; m++) {
			System.out.println(arr[m] + "");
		}
	}

}
如果放在外面定义并赋值,以下是打印信息 ==i==0==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ===n==7==== ===n==8==== ==i==1==== ==i==2==== ==i==3==== ==i==4==== ==i==5==== ==i==6==== ==i==7==== ==i==8==== ==i==9==== 当i=0,第一次遍历没有问题,但是记住当i=1时,此时因为n不是局部变量,而且你在函数内并没有重新赋值,所以此时n=8,此时进入不了for (; n < arr.length - 1 - i; n++) 这层循环遍历,所以相当于总共值进行了一次排序,所以不对。
package com.js.prdt.filter;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 5555, 85, 65, 78, 4, 54, 1, 8, 48, 5 };

		int i;
		int n;
		int num = 0;
		for (i = 0; i < arr.length; i++) {
			System.out.println("==i==" + i + "====");
			for (n = 0; n < arr.length - 1 - i; n++) {
				System.out.println("===n==" + n + "====");
				if (arr[n] > arr[n + 1]) {
					num = arr[n];
					arr[n] = arr[n + 1];
					arr[n + 1] = num;

				}

			}

		}
		for (int m = 0; m < arr.length; m++) {
			System.out.println(arr[m] + "");
		}
	}

}
第二种情况,见打印 ==i==0==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ===n==7==== ===n==8==== ==i==1==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ===n==7==== ==i==2==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ==i==3==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ==i==4==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ==i==5==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ==i==6==== ===n==0==== ===n==1==== ===n==2==== ==i==7==== ===n==0==== ===n==1==== ==i==8==== ===n==0==== ==i==9==== 一看打印信息你就应该知道了,因为n重新赋值了,赋值为0,所以没有问题,两层循环排序,没有问题。
cqboyone 2017-07-06
  • 打赏
  • 举报
回复
引用 1 楼 110成成的回复:
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 5555, 85, 65, 78, 4, 54, 1, 8, 48, 5 };
		int i = 0;
		int n = 0;
		// int i;
		// int n;
		int num = 0;
		for (; i < arr.length; i++) {
			System.out.println("==i==" + i + "====");
			for (; n < arr.length - 1 - i; n++) {
				System.out.println("===n==" + n + "====");
				if (arr[n] > arr[n + 1]) {
					num = arr[n];
					arr[n] = arr[n + 1];
					arr[n + 1] = num;

				}

			}

		}
		for (int m = 0; m < arr.length; m++) {
			System.out.println(arr[m] + "");
		}
	}

}
如果放在外面定义并赋值,以下是打印信息 ==i==0==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ===n==7==== ===n==8==== ==i==1==== ==i==2==== ==i==3==== ==i==4==== ==i==5==== ==i==6==== ==i==7==== ==i==8==== ==i==9==== 当i=0,第一次遍历没有问题,但是记住当i=1时,此时因为n不是局部变量,而且你在函数内并没有重新赋值,所以此时n=8,此时进入不了for (; n < arr.length - 1 - i; n++) 这层循环遍历,所以相当于总共值进行了一次排序,所以不对。
package com.js.prdt.filter;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 5555, 85, 65, 78, 4, 54, 1, 8, 48, 5 };

		int i;
		int n;
		int num = 0;
		for (i = 0; i < arr.length; i++) {
			System.out.println("==i==" + i + "====");
			for (n = 0; n < arr.length - 1 - i; n++) {
				System.out.println("===n==" + n + "====");
				if (arr[n] > arr[n + 1]) {
					num = arr[n];
					arr[n] = arr[n + 1];
					arr[n + 1] = num;

				}

			}

		}
		for (int m = 0; m < arr.length; m++) {
			System.out.println(arr[m] + "");
		}
	}

}
第二种情况,见打印 ==i==0==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ===n==7==== ===n==8==== ==i==1==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ===n==7==== ==i==2==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ==i==3==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ==i==4==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ==i==5==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ==i==6==== ===n==0==== ===n==1==== ===n==2==== ==i==7==== ===n==0==== ===n==1==== ==i==8==== ===n==0==== ==i==9==== 一看打印信息你就应该知道了,因为n重新赋值了,赋值为0,所以没有问题,两层循环排序,没有问题。
大神才去真正玩转程序的人啊。再来膜拜一次
cqboyone 2017-07-06
  • 打赏
  • 举报
回复
引用 1 楼 110成成的回复:
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 5555, 85, 65, 78, 4, 54, 1, 8, 48, 5 };
		int i = 0;
		int n = 0;
		// int i;
		// int n;
		int num = 0;
		for (; i < arr.length; i++) {
			System.out.println("==i==" + i + "====");
			for (; n < arr.length - 1 - i; n++) {
				System.out.println("===n==" + n + "====");
				if (arr[n] > arr[n + 1]) {
					num = arr[n];
					arr[n] = arr[n + 1];
					arr[n + 1] = num;

				}

			}

		}
		for (int m = 0; m < arr.length; m++) {
			System.out.println(arr[m] + "");
		}
	}

}
如果放在外面定义并赋值,以下是打印信息 ==i==0==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ===n==7==== ===n==8==== ==i==1==== ==i==2==== ==i==3==== ==i==4==== ==i==5==== ==i==6==== ==i==7==== ==i==8==== ==i==9==== 当i=0,第一次遍历没有问题,但是记住当i=1时,此时因为n不是局部变量,而且你在函数内并没有重新赋值,所以此时n=8,此时进入不了for (; n < arr.length - 1 - i; n++) 这层循环遍历,所以相当于总共值进行了一次排序,所以不对。
package com.js.prdt.filter;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 5555, 85, 65, 78, 4, 54, 1, 8, 48, 5 };

		int i;
		int n;
		int num = 0;
		for (i = 0; i < arr.length; i++) {
			System.out.println("==i==" + i + "====");
			for (n = 0; n < arr.length - 1 - i; n++) {
				System.out.println("===n==" + n + "====");
				if (arr[n] > arr[n + 1]) {
					num = arr[n];
					arr[n] = arr[n + 1];
					arr[n + 1] = num;

				}

			}

		}
		for (int m = 0; m < arr.length; m++) {
			System.out.println(arr[m] + "");
		}
	}

}
第二种情况,见打印 ==i==0==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ===n==7==== ===n==8==== ==i==1==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ===n==7==== ==i==2==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ===n==6==== ==i==3==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ===n==5==== ==i==4==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ===n==4==== ==i==5==== ===n==0==== ===n==1==== ===n==2==== ===n==3==== ==i==6==== ===n==0==== ===n==1==== ===n==2==== ==i==7==== ===n==0==== ===n==1==== ==i==8==== ===n==0==== ==i==9==== 一看打印信息你就应该知道了,因为n重新赋值了,赋值为0,所以没有问题,两层循环排序,没有问题。
谢谢大神,真是太给力了。小弟无限膜拜中。手机看起来不方便。回去用电脑学习学习。

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧