变与不变

变与不变

有些事的发生突然能让人将它延伸到其他方面,在昨天的一道java题目中有这两个循环,问哪道会编译出错:

Int  n = 100;

While( n>100){};

System.out.println(n);

另一个:

Int  n = 100;

For( ;  ;  ;){}

Sytem.out.println(n);

呵呵,哪个会有错,第一个while里条件n>100似乎永远都满足,for里面不做任何判断,貌似都是死循环,循环下的语句都不会执行到啊,好啦,答案是第一道没错,第二道

输出语句报错:unreachable code不可到达代码,暂且让我这么翻译,呵呵。我们都不明白为何会这样啊,难道两个循环有不同,老师似乎一时也没想明白过来。哈哈,好啦,该猜想一下啦,while里面的条件语句是n>100,是个表达式,个人觉得是可以改变的,虽然从目前的值上看永远为真,for里面不作任何条件判断,永远执行循环。既然如此,我试着把while条件改成true,for里的判断条件改成n>0,呵呵,似乎互换了一下,如你所想,结果也呼唤了一下,第一个while循环报错:unreacable code,第二个for循环没错了。咦,what's  going on?

怎么回事啊,个人理解n>100是个可变真假的条件表达式,true是不可变的,所以一个我自称为“逻辑上的死循环”,另一个我称之为“定理上的死循环”。

为何如此,因为n是变量,n的值是可变的,如果像c语言一样我完全可以通过指向n的指针去改变n值,使其不满足条件。跟别人争论了,个人争辩能力不行,口不太会说,只好来个测试,既然n是可变的,如果定义的n是不可变的,那表达式n>100的真假值也是不可变的,好,那就将n声明为final类型的,修改如下

Final int n = 100;

While( n> 0){}

System.out.println();

呵呵,unreachable code ,验证正确,至此,故事讲完了,什么感悟呢?

哈哈,左脑的逻辑思考表现还行,该让闷骚的右脑的感性思考来领领风骚,生活中这么多事,什么该坚持,什么该放弃,或许也同这两个循环一样,一个是逻辑上的死循环,一个是定理上的死循环,区分出哪些是逻辑上的,那些是定理上的,对于逻辑上的稍加修改逻辑也就好了,然而定理上的死循环,别犹豫,直接循环体里面添加个break语句吧。

你可能感兴趣的:(随想)