Java编程思想第八更


  • 内容导读:Java运算符,位运算,逻辑运算

第三章:控制程序流程

“就象任何有感知的生物一样,程序必须能操纵自己的世界,在执行过程中作出判断与选择。”

  • 好像是扎克伯格说过,程序的优点就是可以执行一个动作成千上万次。一段代码加上循环和判断可以成为一个简单的文字游戏。

3.1 使用 Java 运算符

几乎所有运算符都只能操作“主类型”(Primitives)。唯一的例外是“=”、“==”和“!=”,它们能操作
所有对象(也是对象易令人混淆的一个地方)。除此以外,String 类支持“+”和“+=”。

  • Java也支持其他所有编程语言所支持的加减乘除,但是为了简化字符串的操作,还可以在字符串上使用加号来连接两个字符串。
  • ==和!=基本就脱离了计算符号,而是作为一个逻辑判断的符号。

3.1.1 优先级

  • 先乘除后加减,有括号先算括号,幼儿园都知道,剩下的就不用考虑了。
  • 原来看绿皮的那本C语言,里面不停的强调各种操作符的优先级,搞的我一直在背那个傻东西,学计算机学到这种地步也是诡异。

3.1.2 赋值

赋值是用等号运算符(=)进行的。它的意思是“取得右边的值,把它复制到左边”。右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行。

  • 这里的等号就不代表数学中的相等,指代一种数据的转移,将右边的数据存储到左边的符号中。

但在为对象“赋值”的时候,情况却发生了变化。对一个对象进行操作时,我们真正操作的是它的句柄。所以倘若“从一个对象到另一个对象”赋值,实际就是将句柄从一个地方复制到另一个地方。这意味着假若为对象使用“C=D”,那么C 和 D最终都会指向最初只有 D 才指向的那个对象。

  • 在Java中对象间传递的是引用,而不是对象。例如A=B=C,对C做改动A和B都会变化,因为他们本质上指向的就是同一个对象。

3.1.3 算术运算符

  • 整数除法会直接舍弃小数,而不是四舍五入。

3.1.4 自动递增和递减

  • 对于基本类型可以使用++或者–符号,代表在此基础上加1或者减1,是非常常用的符号。
  • ++和–可以添加在数字的前面或者后面,在前面意味着先改变值再执行。同理,在后面代表先执行语句,后改变值。不要问我a++++a是多少,纠结这个就是傻子。包括我。

3.1.5 关系运算符

关系运算符生成的是一个“布尔”(Boolean)结果。它们评价的是运算对象值之间的关系。若关系是真实的,关系表达式会生成 true(真);若关系不真实,则生成false(假)。关系运算符包括小于(<)、大于(>)、小于或等于(<=)、大于或等于(>=)、等于(==)以及不等于(!=)。等于和不等于适用于所有内建的数据类型,但其他比较不适用于boolean 类型。

  • 在人类的世界是有成功与失败,通过与否决,可以与不可以等等概念,我们需要电脑也能明白这个道理,于是就发明了boolean这个类型,它是只有两个值的类型,true和false,代表真和假。

==和equal

  • ==可以在基本类型和引用类型上使用,因为==是直接比较目标地址的内容,所以就会产生两种情况。如果是基本类型,地址里存放的就是自身的值,比较就是正确的。但是如果是引用类型,地址里存放的就是引用,除非是指向同一片地址,否则就是false,即使new了两个一模一样的张三,比较还是false。当然还有Integer的特殊情况,请自行查阅。
  • 使用equal方法时,因为equal是继承与Object,在Object中默认的实现就是使用==符号进行比较,但是这样得出的结果就不是我们想要的比较内容了,所以一般情况下都是要重写equal方法的,具体如何重写有ide给你生成好了。好像是利用hash值进行的比较。

3.1.6 逻辑运算符

逻辑运算符 AND(&&)、OR(||)以及 NOT(!)能生成一个布尔值(true 或 false)——以自变量的逻辑关系为基础。下面这个例子向大家展示了如何使用关系和逻辑运算符。

  • 上面我们已经发明了逻辑符号,但是有些情况是需要多个逻辑来决定下一步行为,我们需要组合逻辑,这就有了与或非。
  • 与C与C++不同,不可以在逻辑运输符号的两边使用非布尔值,你不能像在C语言中一样1&&1了。我认为你是非常好的改革,可以把数字和布尔值区分开, 不会再滥用数字在逻辑判断中。
  • 其实使用一个&和|也是逻辑符号,但是为了简化逻辑式的执行,就有了短路逻辑运算,也就是使用两次这个符号,这样当式子已经不可能等于另一个值时就会跳过后面的计算了。正常情况直接用短路符号即可。不要问我用短路符号和不用短路符号的区别,然后在表达式里搞一堆数学计算,你就去问谭浩强吧。

3.1.7 按位运算符

按位运算符允许我们操作一个整数主数据类型中的单个“比特”,即二进制位。按位运算符会对两个自变量中对应的位执行布尔代数,并最终生成一个结果

按位运算来源于C 语言的低级操作。我们经常都要直接操纵硬件,需要频繁设置硬件寄存器内的二进制位。
Java 的设计初衷是嵌入电视顶置盒内,所以这种低级操作仍被保留下来了。然而,由于操作系统的进步,现在也许不必过于频繁地进行按位运算。

3.1.8 移位运算符

移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补 0)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java 也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C 或C++没有的。

  • 三种位移运算符,左移<<右移>>无符号右移>>>,右移的结果可不一定等于想象中的数学结果,但是符合电路二进制的结果。我感觉,最后一种可以称为数学右移,因为就是为了快速正确的进行二进制计算而发明的。
  • 正常最多看到用左移1来加快计算翻倍,剩下的两个都少见。

3.1.9 三元 if-else 运算符

布尔表达式 ? 值 0:值 1
若“布尔表达式”的结果为true,就计算“值0”,而且它的结果成为最终由运算符产生的值。但若“布尔
表达式”的结果为false,计算的就是“值 1”,而且它的结果成为最终由运算符产生的值。

  • 三元运算符号很像一个if加else,事实上也可以拿来代替简单的一层ifelse。可以让你的代码简洁不少,但是如果逻辑复杂还是建议使用ifelse,因为一旦过长可读性就会很差,因为我可能冒号在哪里都要找一会。

3.1.10 逗号运算符

  • 只在for循环中有用到,用来在一个部分执行两个或更多操作。

3.1.11 字串运算符+

  • 如果在字符串后面加上加号,然后跟上其他的内容,都会被编译成先将后面的内容转string,然后连接字符串。

3.1.13 造型运算符

“造型”(Cast)的作用是“与一个模型匹配”。在适当的时候,Java 会将一种数据类型自动转换成另一
种。例如,假设我们为浮点变量分配一个整数值,计算机会将 int自动转换成 float。通过造型,我们可明确设置这种类型的转换,或者在一般没有可能进行的时候强迫它进行。

正如您看到的那样,既可对一个数值进行造型处理,亦可对一个变量进行造型处理。但在这儿展示的两种情
况下,造型均是多余的,因为编译器在必要的时候会自动进行 int值到long 值的转换。当然,仍然可以设置
一个造型,提醒自己留意,也使程序更清楚。

  • 一般情况下“小类型“当作”大类型使用时都会隐形的自动转换,但是如果需要大转小,这种操作是具有丢失信息甚至失败的风险,需要手动的去操作。
  • 3.1结束,java的操作符号说起来很简单,但是其中还是有不少小细节,需要自己注意,尤其是位运算和数字类型转换的问题。
  • 一个半小时写一小节还是很爽的,虽然比较简单的内容。
  • Typora换了pai主题,还挺好看的。

END

作者

liukun

发布于

2020-09-24

更新于

2021-05-28

许可协议