博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(1)、JAVA 学习点滴、复合语句、表达式中的自动类型提升
阅读量:6242 次
发布时间:2019-06-22

本文共 1918 字,大约阅读时间需要 6 分钟。

今天又看了会JAVA。

脑海中一直觉得JAVA 就是一个框架,就如YII 框架。
提供了很多的类包提供给程序员们 使用。
不过看着看着,以PHP的编程经验就会觉得别扭!
java有复合语句的概念:

{ //方法体{   int a;    a = 1321321;    //代码块}   System.out.println(a);}

如上所示,变量 a 是不能获取到的,程序编译会报错。

使用 {} 包起来的代码块 会生成一个作用域。

但PHP代码 :

{$a = 13132;} echo $a;

而如上的PHP代码却是可以直接访问到变量a的。

在PHP中,只有在类,方法和函数中有作用域的概念。
而在JAVA 中,只要是用{} 包裹住的代码,在其中定义的变量就会产生作用域。
如若要在外部访问到该变量a的运算结果,那么就应该在获取变量的同一级层中进行定义方可。

表达式中的自动类型提升:

除了赋值外,还有另外一个地方也可能会发生某些类型转换:在表达式中。为了分析其中的原因,考虑下面的情况。在表达式中,中间值要求的精度有时会超出操作数的范围。例如,检查下面的表达式:

byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;

中间部分a*b的结果很容易超出byte操作数的范围。为了解决这类问题,当对表达式求值时,Java自动将每个byte、short或char操 作数提升为int 类型。这意味着使用int 类型而不是byte类型执行子表达式a*b。因此,尽管a和b都被指定为byte类型,中间表达式(50*40)的结果2000是合法的。

尽管自动类型提升很有用,但是它们会导致编译时混淆错误。例如,下面的代码看起来是正确的,但是会导致问题: 

byte b = 50;
b = b * 2; // Error! Cannot assign an int to a byte!

上面的代码试图将50*2——一个完全有效的byte值——保存在一个byte变量中。但是,当计算表达式的值时,操作数被自动提升为int 类型,所以结果也被提升为int 类型。因此,现在表达式的结果是int 类型,如果不使用强制类型转换,就不能将结果赋给那个byte变量。尽管对于这个特定情况来说,所赋予的值仍然满足目标类型,但是仍然需要进行强制类型转 换。

如果能理解溢出产生的后果,就应当使用显式的强制类型转换,如下所示:

byte b = 50;
b = (byte)(b * 2);
 
这样就可以得到正确的值100。

类型提升规则

Java定义了几个应用于表达式的类型提升规则,如下所示:首先,正如刚才所描述的,所有byte、short和char类型的值都被提升为int 类型。然后,如果有一个操作数是long 类型,就将整个表达式提升为long 类型;如果有一个操作数是float 类型,就将整个表达式提升为float类型;如果任何一个操作数为double类型,结果将为double类型。

下面的程序演示了为了使第二个参数与每个二元运算符相匹配,如何提升表达式中的每个值:

class Promote {
public static void main(String args[]) {
byte b = 42;
char c = 'a';
short s = 1024;
int i = 50000;
float f = 5.67f;
double d = .1234;
double result = (f * b) + (i / c) - (d * s);
System.out.println((f * b) + " + " + (i / c) + " - " + (d * s));
System.out.println("result = " + result);
}
}

下面进一步分析程序中如下这行代码中的类型提升:

double result = (f * b) + (i / c) - (d * s);
 
在第一个子表达式f*b中,b被提升为float类型,并且该子表达式的结果也是float类型。接下来在子表达式i/c 中,c被提升为int 类型,并且结果也是int 类型。然后在d*s中,s的值被提升为double类型,并且该子表达式的类型为double。最后考虑三个中间值的类型——float、int 和double。float加上int 的结果是float。之后,作为结果的float减去最后的double,会被提升为double,这就是表达式最终结果的类型。

转载地址:http://ikpia.baihongyu.com/

你可能感兴趣的文章
spice在桌面虚拟化中的应用系列之三(USB映射实现,SSL加密,密码认证,多客户端支持)...
查看>>
Loading project 91606170 of 1: Project FooBar 问题如何解决?
查看>>
C# yeild使用
查看>>
MapReduce-Hadoop分布式计算模型
查看>>
StrokePlus
查看>>
joisino's travel
查看>>
组合游戏-博弈论中经典模型题目
查看>>
浅谈HTTP的GET和POST
查看>>
点灯笼
查看>>
try{}catch{}
查看>>
[Aaronyang] 写给自己的WPF4.5 笔记11[自定义控件-AyImageButton的过程 1/4]
查看>>
Linux VMware新添加网络适配器找不到配置文件问题
查看>>
Javascript百学不厌 - this
查看>>
机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
查看>>
实用算法实现-第 14 篇 启发式搜索
查看>>
c#常用的排序算法
查看>>
论文阅读——Visual inertial odometry using coupled nonlinear optimization
查看>>
Office插件编程[转]
查看>>
读代码还是读文档,来自知乎
查看>>
Linux 常见编译错误
查看>>