zoukankan      html  css  js  c++  java
  • Java编程思想 4th 第3章 操作符

    有了数据,还需要进行数据间的运算,因此Java中也有数据间运算的各种符号,书本称之为操作符,正确的翻译应该是运算符。

    Java中的运算符同C++相同,运算符同运算符对象构成表达式,表达式是运算对象及运算符组成的式子,对表达式求值将得到一个结果,单独的变量或者字面值也算表达式,结果是其本身。运算符分为:一元运算符、二元运算符、三元运算符。一元即一个作用对象,二元两个作用对象,以此类推。

    运算符有先后优先之分,正如先乘除后加减一样,此规则称为优先级。另外,运算符还具有结合律,也即一个运算符是先和该运算符左侧对象还是右侧对象结合进行计算。比如,对于如下代码,就体现了结合律:

    int i = 1, j = 2, k = 3;
    i += j += k += 5;

     上面代码中由于三个都是加法赋值运算符+=,并且加法赋值运算符是右结合的, 所以该表达式从右向左开始计算,因此k=8,j=10,i=11。

    赋值运算符是二元运算符,左右两侧各一个运算对象,对于右侧赋值运算符并没有太多要求,只需右侧能够提供一个值即可,而左侧则必须是一个左值,也就是说,左侧运算对象必须拥有一块内存,它能够存储右侧的值。

    赋值运算符作用于基本类型时,是拷贝右侧对象的值到左侧。作用于类对象引用时,则结果是赋值运算符左右两侧的引用最终都指向右侧引用绑定的对象。

    在调用对象的method时,传递给method的参数实际上就是一个用赋值运算符进行初始化的过程,即用实际的实参初始化method的形参,由于Java是传值调用,因此最后实参和形参都指向实现所绑定的对象。这是类指针行为,因此最终改变的是实参所引用的对象。

    Java中的boolean类型支持位运算,个人觉得是个畸形的东西,因为首先Java没有规定boolean的位数,其次boolean类型在逻辑上进行位运算也是无意义的,而Java设计目的是简洁,不知道为什么Java会支持。

    算术运算符、自增自减运算符和关系运算符同C++完全相同,逻辑运算符和C++略有不同。在C++中,其他类型,诸如char、int、double甚至指针类型都能转换为boolean类型,但Java中不允许这一转换,因此在逻辑运算符中必须让表达式结果生成boolean类型,但C++中逻辑运算符的短路求值属性被Java保留了下来。例如a && b,如果a的结果是false,那么就没有必要再计算b了。

    Java中也有直接常量,按照C++中接地气的翻译应该是字面常量,其前缀和后缀的形式决定了其类型,前缀比如0、0x表示八进制或者十六进制,而后缀f,L等则表示float还是Long类型。另外,Java中还有一个可以看做中缀的e,这是一种指数记数法。

    Java中还有按位运算符及移位运算符,它们是绝大多数人都没用过的东西。让人意外的是,Java中的boolean类型支持位运算,个人觉得是个畸形的东西,因为首先Java没有规定boolean的位数,其次boolean类型在逻辑上进行位运算也是无意义的,而Java设计目的是简洁,不知道为什么Java会支持。

    Java继承了C++中唯一的一个三元运算符,三元运算符的作用是简化代码,然而Java中似乎并不待见它。

    Java字符串操作使用了类型转换,实际上我觉得C++的输出流更好用,另外Java中没有sizeof运算符,因为Java中基本类型的内存占用位数是固定的,实际上C++中提供sizeof运算符其原因并不是基本类型的大小随平台变化,真正原因在于C++能直接操作内存的,在直接操作内存时需要明确得知欲操作内存的大小。

  • 相关阅读:
    Linux运维工作总结教训
    java-GC
    java设计模式-原形模式
    java-桥接模式
    java-装饰者模式
    java-正则表达式
    java设计模式-建造者模式
    Python 条件与循环
    Python 集合、字典、运算符
    Python 字符串拼接、格式化输出、深浅复制
  • 原文地址:https://www.cnblogs.com/pluse/p/7341759.html
Copyright © 2011-2022 走看看