`
webdev2014
  • 浏览: 670070 次
文章分类
社区版块
存档分类
最新评论

第三章---- 操作符

 
阅读更多
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,后面的条件就没有进行判断就执行了括号中的代码,而|要对所有的条件进行判断,
			所以会报错。
			
			上面三个问题是我们在编程的时候需要注意到的,当然因人而异,还有其他问题也是我们需要注意的。
			
		 */
	}

}

分享到:
评论

相关推荐

    prolog教程

    第3章-事实 17 事实 (facts) 17 寻找Nani 19 第4章-简单查询 22 查询的工作原理 26 第5章-混合查询 29 混合查询 29 内部谓词 32 第6章-规则 38 规则 38 规则的工作原理 40 使用规则 45 第7章-小结 51 小结 51 第8章-...

    数据库系统概论-第三章-关系数据库标准语言SQL.pdf

    An Introduction to Database Sy 大连大学信息工程学院 数据库系统概论 An Introduction to Database System 第三章 关系数据库标准语言 SQ L An Introduction to Database Sy 第三章 关系数据库标准语言 SQL 3.1 ...

    JavaScript程序设计课件:第 3 章 表达式与操作符.ppt

    JavaScript程序设计课件:第 3 章 表达式与操作符.ppt

    Centos8操作系统入门视频.zip

    第3章-文件系统的管理方法和xfs文件系统备份恢复 1-Linux系统目录结构和相对路径与绝对路径 2-文件的管理 3-查看文件 4-实战-xfs文件系统的备份和恢复-1 5-实战-xfs文件系统的备份和恢复-2 第4章-Vim编辑器和恢复ext...

    C++大学教程

    第3章 函数-------------------------------------------------------------102 3.1 简介------------------------------------------------------------102 3.2 C++程序组件----------------------------------...

    python第3章答案-【Python基础教程】第3章字符串.pdf

    python第3章答案_【Python基础教程】第3章字符串 所有标准的序列操作(索引,分⽚,乘法,判断成员资格,求长度,最⼤值,最⼩值)对字符串都是同样适⽤的。 3.1 字符串是不可变的 在Python中,字符串和元组⼀样,都是...

    jQuery基础教程.中文.带目录(1/2)

    jQuery基础教程....第3章 事件-扣动板机 第4章 效果-为操作添加艺术性 第5章 Dom操作-基于命令改变页面 第6章 Ajax-让网站与时俱进 第7章 表格操作 第8章 构建功能型表单 第9章 滑移和翻转 第10章 插件 ……

    jQuery基础教程.中文.带目录(2/2)

    jQuery基础教程....第3章 事件-扣动板机 第4章 效果-为操作添加艺术性 第5章 Dom操作-基于命令改变页面 第6章 Ajax-让网站与时俱进 第7章 表格操作 第8章 构建功能型表单 第9章 滑移和翻转 第10章 插件 ……

    第3章 操作符与控制结构

    NULL 博文链接:https://onestopweb.iteye.com/blog/2203516

    第 3 章 操作符与控制结构

    NULL 博文链接:https://chaoyi.iteye.com/blog/2136283

    (Perl 语言编程-第三版 作者:Larry Wall, Tom Christiansen, and Jon Orwant 译者:何伟平)Perl .chm

    第三章 单目和双目操作符 第四章 语句和声明 第五章 模式匹配 第六章 子过程 第七章 格式 第八章 引用 第九章 数据结构 第十章 包 第十一章 模块 第十二章 对象(上) 第十二章 对象(下) 第十三章 重载 第...

    《汇编语言》-第三版-王爽-以及课后答案

    第3章寄存器(内存访问) 3.1内存中字的存储 3.2DS和(address) 3.3字的传送 3.4mov、add、sub指令 3.5数据段 3.6栈 3.7CPU提供的栈机制 3.8栈顶超界的问题 3.9push、pop指令 3.10栈段 实验2用机器指令和汇编指令...

    C++Primer视频(初级)下载地址

    第3章 标准库 string 类型 (1) 20.第3章 标准库 string 类型 (2) 21.第3章重点习题解答 22.第3章标准库string类型(3) 23.第3章标准库vector类型 24.第3章重点习题解答 25.第3章迭代器简介 26.二进制和...

    C++Primer视频(高级)下载地址

    10.13章 复制构造函数和赋值操作符 11.13章 析构函数 12.13章 深复制、浅复制 13.13章 管理指针成员 14.14章 重载操作符的定义 15.14章 重载输入输出操作符 16.14章 重载算术操作符 17.14章 重载关系...

    Programming In Lua 中文版PDF高清

    第3章 表达式 第4章 基本语法 第5章 函数 第6章 再论函数 第7章 迭代器与泛型for 第8章 编译 运行 错误信息 第9章 协同程序 第10章 完整示例 第二篇 tables与objects 第11章 数据结构 第12章 数据文件与持久化 第13...

    LINQ简要技术.rar

    第3章 非延迟操作符 8 3.1. 转换操作符 8 3.2. 相等操作符 9 3.3. 元素操作符 9 3.4. 量词操作符 9 3.5. 聚合操作符 10 第Ⅱ部分 LINQ到XML 12 第4章 LINQ到XML API 12 4.1 LINQ到XMl API简要说明 12 4.2 ...

    第三章 php操作符与控制结构代码

    第三章 php操作符与控制结构代码,学习php的朋友可以参考下。

Global site tag (gtag.js) - Google Analytics