第三章---- 操作符

package com.felay.demos;

public class Demo2 {
	
	public static void main(String[] args) {
		/**
		 * Thinking in java 第三章 --操作符
		 * 
		 * 在学习到操作符的时候,我总是很容易漫不经心的去看相关内容,因为总是觉得在学习c语言的
		 * 时候,已经把相关内容理解的很透彻了,但是书读常新,确实在读这本书的相关内容的时候,依旧
		 * 是有很多新的感悟,更重要的让我学会了用分类思想去思考一件事情。作者在讲操作符之前,就给
		 * 我们一个提示,在使用操作符的时候,一定要注意每种操作符的优先级,当然对于我们来说,很少去
		 * 写很复杂的有关操作符的复杂运算,但是一些喜欢ACM算法和乱码大赛的大神么,对此却是乐此不彼
		 * 那些不属于我们的学习范畴,我们只是常规的去应用这些操作符来满足我们普通的逻辑处理,而在这个
		 * 章节中,我就不反复那些早已经学烂的知识,知识总结了自己在遇到的几个我们平时需要注意的细节而
		 * 已。
		 * 1.'+'操作符问题
		 * 	我们在使用'+'这个操作符的时候,是需要一些注意的,因为它是个重载运算符号,我们需要注意的地方
		 * 是当涉及到数字和字符串运算的时候,需要去考量一下,这个符号是否运算得当.
		 * 如:
		 */
		int number = 100 ;
		String str = "111000011111";//假设是二进制
		System.out.println(number+str);
		/**
		 * 这个时候我们就需要注意,我们到底需要是什么类型的结果了,因为当我们有时候需要把一些大数据用字符串的
		 * 方式来处理的时候,我们在使用'+'的时候,千万要多思考一下.
		 * 2.++、--
		 * 恐怕,这两个符号,是我们在学习编程的时候,遇到最头疼的问题了。当年不知道多少人纠结在这个问题中,也许至今
		 * 仍有很多人并不十分清楚它们的运算原理.下面我以一个小例子来说明。
		 * 假设我们有一箩筐苹果,总数量为5000个,我们需要把苹果分发给村民,每次村民只能取一个,旁边有一个计数人员
		 * 每当村民拿一个苹果,计数人员就会在记事本上写上减去一个苹果,直到苹果分发完毕,这个过程思考起来没有任何问题
		 * 但是文字叙述起来确实很麻烦,如果用代码实现的化,就是下面的样子
		 */
		int apples=5000;
		while(apples>=0){
			apples--;
		}
		/**
		 * 当随着每拿一个苹果,苹果的数量就会减少一个,上述的代码能很清晰的表达的上述的拿苹果的问题,这里我们用用到了'--'
		 * 的后缀使用,当然前缀也只是稍微修改下问题的描述,只需要把取苹果改为放苹果罢了,原来没有苹果,村民每放一个苹果,计数
		 * 人员负责在记事本上记上增加一个苹果,那么代码就可以象下面一样去写
		 */
		int apples1=0;
		while(apples1<5000){
			apples1++;
		}
		/**
		 * 那么什么时候我需要用到前缀呢?现实生活中确实是用到的很少,但是++i前缀的使用者显然不是站在生活的角度来考虑这个问题的
		 * 因为,后缀已经能满足我们的使用了,之所以是存在前缀,我看过一篇文章,内容如下:
		 * 编程的时候应该尽可能使用递增操作符 ++ 和递减操作符 -- 的前缀形式.因为它少创建两个临时对象,效率比较高.
			还是从代码来分析吧,比较有说服力:)
			下面是 ++ 和 -- 的前缀实现形式:
			T& T::operator++(){                     T& T::operator--(){
			    ++*this;                                --*this;
			    return *this;                           return *this;
			}                                       }
			下面是 ++ 和 -- 的后缀实现形式:
			T T::operator++(int){                   T T::operator--(int){
			    T old(*this);                           T old(*this);
			    ++*this;                                --*this;
			    return old;                             return old;
			}                                       }
			我们来分析一下自增自减的后缀形式所多花费的开销:
			    T old(*this);
			         这一句产生一个类型为T的临时对象 old, 并用原值*this进行初始化.当函数return的时候,又再次创建一个临时对象,并用old的值进行初始,之后,局部变量old被销毁.并用临时创建的变量对赋值符左边的变量进行赋值(如果有的话).赋值后,临时变量再次被销毁.
			    而前缀形式的自增自减呢?首先函数内没有创建临时变量,故这方面的开销就节省了.其次,返回的是一个引用,故也节省了这时候创建销毁临时对象的开销.
			    因此后缀式的自增自减,所多花费的开销是两次临时变量的创建,以及两次临时变量的销毁.如果自增自减的对象不是内建的数据类型,而一个类类型[当然,你首先得重载自增自减操作符:) ], 那么这个开销可能会比较大.因为变成了两次构造函数以及两次析构函数的调用.
			    所以在调用代码的时候,要优先使用前缀形式,除非确实需要后缀形式返回原值.
			参考书籍: C++ 编程规范
			从文章的分析来看,之所以会有前缀的时候,显然是从编程的效率来考虑的,尽管这种底层的东西我们不是很了解,但是我们从上述的例子中可以看出
			在效率上,确实是前缀的效率更高。至于我们如何使用,在如今硬件发展如此快速的时代,我们并不用太关心这个问题。
			3.'='与'=='的使用
				这里我们在使用判等的问题的时候,也需要注意我们使用的到底是'='还是'=='.因为很多初学者,还没有从原有的数学思维中跨出来。
			4.'&'与'&&'  '|'与'||'
			在使用运算符的时候,我们要非常清楚上述几个运算符的区别,首先,它们是属于不同的分类,'&&','||'属于逻辑操作符,'&','|'属于位运算符
			虽然很多时候,在使用的时候,它们的区别不大,甚至效果一样,但是确实它们的原理,差别很大,在这里,我引用网上一篇分析很到位的文章:
			在java的逻辑运算符中,有这么四类:&&(短路与),&,|,||(短路或)。
			&&和&都是表示于,区别是&&只要满足第一个条件,后面条件就不再判断。而&要对所有的条件都进行判断。
			看下面的程序:
			[html] view plaincopyprint?
			public static void main(String[] args) {  
			        // TODO Auto-generated method stub  
			        if((23!=23)&&(100/0==0)){  
			            System.out.println("运算没有问题。");  
			        }  
			    }  
			输出的是“运算没有问题”,没有报错。而将&&改为&就会如下错误:
			[html] view plaincopyprint?
			Exception in thread "main" java.lang.ArithmeticException: / by zero  
			
			原因是:&&时判断第一个条件为false,后面的100/0==0这个条件就没有进行判断。
			        &时要对所有的条件进行判断,所以会对后面的条件进行判断,所以会报错。
			   ||和|都是表示“或”,区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断。
			看下面的程序:
			[html] view plaincopyprint?
			public static void main(String[] args) {  
			    // TODO Auto-generated method stub  
			    if((23==23)||(100/0==0)){  
			        System.out.println("运算没有问题。");  
			    }  
			}  
			此时输出“运算没有问题”。若将||改为|则会报错。
			原因是:||判断第一个条件为true,后面的条件就没有进行判断就执行了括号中的代码,而|要对所有的条件进行判断,
			所以会报错。
			
			上面三个问题是我们在编程的时候需要注意到的,当然因人而异,还有其他问题也是我们需要注意的。
			
		 */
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值