操作符 3.12 三元操作符 if-else

3.12 三元操作符 if-else

      三元操作符也称为条件操作符,它显得比较特别,因为它有三个操作数;但它却是属于操作符的一种,因为它最终也会成为一个值,这与本章下一节中介绍的普通if-else语句是不同的。

      其表达式采取下述形式:

       boolean-exp ?value0 :value1

       如果boolean-exp(布尔表达式)的结果为 true,就计算 value0,而且这个计算结果也就是操作符最终产生的值。

       如果boolean-exp (布尔表达式)的结果为 false,就计算 value1,同样,它的结果也就成为了操作符做种产生的值。

      当然,也可以换用普通的 if-else 语句(在后面介绍),但三元操作符更加简洁。尽管C(C中发明了该操作符)引以为傲的就是它是一种简练的语言,而且三元操作符的引入多半就是为了体现这种高效率的编程,但假如你打算频繁使用它,还是要多做思量,因为它很容易产生可读性极差的代码。

       条件操作符与 if-else 完全不同,因为它会产生一个值。

       下面是这两者进行比较的示例:

       

条件操作符

      

    3.13 字符串操作符 + 和 +=

        这个操作符在Java中有一项特殊用途:连接不同的字符串。这一点已经在前面的例子中展示过了。尽管与 + 和 += 的传统使用方式不太一样,但我们还是很自然地使用这些操作符来做这件事情。

        这项功能用在C++中似乎是个不错的主意,所以引入了操作符重载(operator overloading)机制,以便C++程序员可以为几乎所有操作符增加功能。但非常遗憾,与C++的另外一些限制结合在一起,是的操作符重载成为了一种非常复杂的特性,程序员在设计自己的类时必须对此有非常周全的考虑。与C++相比,尽管操作符重载在Java中更易实现(就像在C#语言中所展示的那样,它具有相当简单直接的操作符重载机制),但仍然过于复杂。所以Java程序员不能像C++和C#程序员那样实现自己的重载操作符

        字符串操作符有一些很有趣的行为。如果表达式以一个字符串起头,那么后续所有操作数都必须是字符串型(请记住,编译器会把双引号内的字符序列自动转换成字符串):

       3.14 使用操作符时常犯的错误

        使用操作符时一个常犯的错误就是,即使对表达式如何计算有点不确定,也不愿意使用括号。

        在C和C++中,一个特别常见的错误如下:

        while( x = y){

      //

}

       程序员很明显是想测试是否“ 相等 ”(==),而不是进行赋值操作。在C和C++中,如果y是一个非零值,那么这种赋值的 结果肯定是 true,而这样便会得到一个无穷循环。在Java中,这个表达式的结果并不是布尔值,而编译器期望的是一个布尔值。由于Java不会自动地将 int转成 布尔值,所以在编译时会抛出一个编译时的错误,从而阻止我们进一步运行程序。所以这种错误在Java中永远不会出现。

       Java中有一个与C和C++中类似的问题,即使用按位“ 与 ” 和按位 “ 或 ”代替逻辑 “ 与 ”和 逻辑 “ 或 ”。按位 “ 与 ”和按位“ 或 ”使用单字符(&或|),而逻辑 “ 与 ” 和逻辑  “ 或 ” 使用双字符(&&或||)。就像“ = ”和“ == ”一样,键入一个字符当然要比键入两个简单。Java编译器可防止这个错误发生,因为它不允许我们随便把一种类型当做另一种类型来用。

       3.15 类型转换操作符

       类型转换(cast)的原意是“ 模型铸造 ”。在适当的时候,Java会将一种数据类型自动转换成另一种。

       加入我们为某浮点变量赋以一个整数值,编译器会将 int 自动转换成 float。类型转换运算允许我们显式地进行这种类型的转换,或者在不自动进行转换的时候强制进行类型转换。

        要想执行类型转换,需要将希望得到的数据类型置于圆括号内,放在要进行类型转换的值的左边,可以在下面的示例中看到它:

    

强制类型转换

     在C和C++中,类型转换有时会让人头痛。但是在Java中,类型转换则是一种比较安全的操作。然而,如果要执行一种名为窄化转换(narrowing conversion)的操作(也就是说,将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型),就有可能面临信息丢失的危险。此时,编译器会强制我们进行类型转换,实际上是说“这可能是一件危险的事情,如果无论如何要这么做,必须显式地进行类型转换。”而对于扩展转换(widening conversion),则不必显式地进行类型转换,因为新类型肯定能容纳原来的类型的信息,不会造成任何信息丢失。

       Java允许我们把任何基本数据类型转换成别的基本数据类型,但布尔型除外,后者根本不允许进行任何类型的转换处理。“类”数据类型不允许进行类型转换。为了将一种类型转成另一种,必须采用特殊的方法(对象可以在其所属类型的类族之间可以进行类型转换;例如“橡树”可转型为“树”,反之亦然。但不能把它转换成类族以外的类型,如“岩石”)。

     因此答案是在将float或double转型为整型值时,总是对该数字执行截尾。如果想要得到舍入的结果,就需要使用java.lang.Math中的round()方法。

    3.15.2 提升

      如果对基于数据类型执行算术运算或按位运算,大家会发现,只要类型比int小(即char、byte或者short),那么在运算之前,这些值会自动转换成int。这样一来,最终生成的结果就是int类型。如果把结果赋值给较小的类型,就必须使用类型转换(既然把结果赋给了较小的类型,就可能出现信息丢失)。通常,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。如果将一个float值与一个double值相乘,结果就是double;如果将一个int和一个long值相加,则结果为long;

   3.16 Java没有sizeof

      在C和C++中,sizeof()操作符可以告诉你为数据项分配的字节数。

      在C和C++中,需要使用sizeof()的最大原因是为了“移植”。

      不同的数据类型在不同的机器上可能有不同的大小,所以在进行一些与存储空间有关的运算时,程序员必须获悉那些类型具体有多大。例如,一台计算机可用32位来保存整数,而另一台只用16位保存。显然,在第一台机器中,程序保存更大的值。可以想像,移植是令C和C++程序员颇为头痛的一个问题。

       Java不需要sizeof()操作符来满足这方面的需要,因为所有数据类型在所有机器中大小都是相同的。我们不必须考虑一直问题——它已经被设计在语言中了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值