运算和类型
1、计算两个整数值的实数平均值(错误)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("计算整数值x和y的平均值。");
System.out.print("x的值:"); int x = stdIn.nextInt();
System.out.print("y的值:"); int y = stdIn.nextInt();
double ave = (x + y) / 2; // 平均值
System.out.println("x和y的平均值为" + ave + "。"); // 显示
}
}
输出:
原因:
在这样的运算中会默认执行被称为双目数值提升(binary numerical promotion)的类型转换。
在执行运符之前, int型操作数的值会先被提升为double型、int型的2会转换为double型的2.0,最终, 两个操作数都变成了double型, 因此a和b的运符结果都为double型。
双目数值提升的类型转换规则如下:
• 若有—个操作数为double型,则将另 —个操作数转换为double型
• 否则,若有一个操作数为float型,则将另 —个操作数转换为float型
• 否则,若有一个操作数为long型,则将另 —个操作数转换为long型
• 否则,将两个操作数都转换为int型
2、计算两个整数值的实数平均值
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("计算整数值x和y的平均值。");
System.out.print("x的值:"); int x = stdIn.nextInt();
System.out.print("y的值:"); int y = stdIn.nextInt();
double ave = (x + y) / 2.0; // 平均值
System.out.println("x和y的平均值为" + ave + "。"); // 显示
}
}
输出:
最先执行的运算是用括号括起来的x+y。这是int+int, 运算结果也是int型。而作为除数的浮点型常址2.0是double型。
(x + y) / 2.0相当于int/ double,也可得到double型的结果。
3、造型运算符
计算两个整数值的实数平均值(使用造型运算符)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("计算整数值x和y的平均值。");
System.out.print("x的值:"); int x = stdIn.nextInt();
System.out.print("y的值:"); int y = stdIn.nextInt();
double ave = (double)(x + y) / 2; // 平均值
System.out.println("x和y的平均值为" + ave + "。"); // 显示
}
}
输出:
运算符/的左操作数表达式 (double) (x+ y)的通用格式:(类型)表达式--该表达式用来将表达式的值转换为指定类型的值
(int)5.7会舍弃double型的浮点型常量值5.7中小数点以后的部分,得到int型的5;
这里执行的类型转换称为造型(cast) 另外 , 括号并不是用来优先执行运符的符号(分隔符), 而是一种被称为造型运算符(cast operator)的运算符--(类型)x 得到将x转换为指定类型后的值。
4、基本类型的缩小转换
double型的值是不允许赋给int型的,(与被赋的值无关, 不管是10.0 还是10000000000.0 都不允许)向较小的类型赋值, 必须进行类型转换
基本类型的缩小转换:
• 从short到byte、char的转换
• 从char到byte、short的转换
• 从int到byte、short、char的转换
• 从long到byte、short、char、int的转换
• 从float到byte、short、char、int, long的转换
• 从double到byte、short、char、int、long、float的转换
只有常量表达式才可以无需造型就能赋值 如果是变量的话必须使用造型
short a = l; //正确
byte b = a; //错误
对于float型变量,不可以不造型就赋入double型的常量值
float a = 3.14; //错误,3.14是double型
float b = (float)3.14; //正确
float c = 3.14f; //正确,3.14f是float型
5、基本类型的放大转换
基本类型的放大转换:
• 从byte到short、int、long、fleoat、double的转换
• 从short到int、long、float、double的转换
• 从char到int、long、float、double的转换
• 从int到long、float、double的转换
• 从long到float、double的转换
• 从float到double的转换
放大转换在赋值或初期化时会自动执行,与缩小转换不同,放大转换并不需要造型
int a ='5'; //都正确
long b = a
double c = 3 .14f
从整型到浮点型的转换(丢失精度的示例)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int a = 123456789;
long b = 1234567890123456789L;
System.out.println(" a = " + a);
System.out.println("(float) a = " + (float)a);
System.out.println(" b = " + b);
System.out.println("(double)b = " + (double)b);
}
}
输出:
在从int到float的转换过程和从long到double的转换过程中精度信息丢失了。
6、转义字符
转义字符:
Unicode 转义:
1)\b…退格符:当输出退格符\b时, 当前显示位置会移动到该行中的前一个位置;
2)\f…换页符:当输出换页符\f时, 当前显示位詈会移动到下一逻辑页的页首;
3)\n …换行符:当输出换行符\n时, 当前显示位萱会移动到下一行的行首;
4)\r…回车符:当输出回车符\r时, 当前屈示位笸会移动到当前行的行首;
5)\t…水平制表符:当输出水平制表符\t时, 当前显示位置会移动到该行下—水平制表位置。
输出水平制表符:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("ABC\t123");
}
}
输出:
转义字符\"和\'的使用示例:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("关于字符串常量和字符常量。");
System.out.println("用双引号括起来的\"ABC\"为字符串常量。");
System.out.print("用单引号括起来的");
System.out.print('\'');
System.out.println("A'为字符常量。");
}
}
输出:
7、总结
1) Java中可以使用的类型分为基本类型和引用类型;
2)基本类型分为数值类型和布尔型,数值类型义分为整型和浮点型;
3)类型不同, 表示数值的位也有所不同;
4)整型是表示一定范闱内连续的整数的类型,整型分为char型、byte型、short型、int型、long型;
5) char型以外的整型是表示负值、0 、正值的有符号整型。其内部通过补码表示的形式来表示;
6)整数常量是int型;L但如果加上整型后缀L或l, 就变成了long型。如果开头是0x或0X, 则为十六进制整数常量. 如果开头是0并且是2位以上, 则为八进制整数常量, 否则便为十进制整数常量;
7)浮点型由符号、指数、尾数构成,长度和精度存在一定限制;浮点型分为float型和double型;
8)浮点型常量是double型. 但如果加上整型后缀F或f, 就变成了float型,如果开头是0x或0X.,则为十六进制浮点型常量, 否则便为十进制浮点型常量;
9)如果使用浮点型变量来控制循环、就会累积误差,应该使用整型变量;
10)表示真或假的是布尔型(boolean型)表示真的布尔型常州为true, 表示假的布尔型常量为false;
11)当执行”字符串+ boolean 型值” 或者"boolean 型值+字符串" 的运算时, boolean型的值会先转换为"true" 或者'false" 字符串之后再进行拼接;
12)二元符术运符中会对操作数进行双目数值提升;
13)使用造型运算符()可以将操作数的值转换为任意类型的值;
14)基本类型的缩小转换中, 除了常量之外、原则上都必须进行显式类型转换而基本类型的放大转换会自动执行, 无需造型;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.println("15 / 2 = " + 15 / 2 );
System.out.println("15.0 / 2.0 = " + 15.0 / 2.0);
System.out.println("15.0 / 2 = " + 15.0 / 2 );
System.out.println("15 / 2.0 = " + 15 / 2.0);
System.out.print("变量x:"); int x = stdIn.nextInt();
System.out.print("变量y:"); int y = stdIn.nextInt();
boolean eq = (x == y);
System.out.println("它们" + (eq ? "相等。" : "不相等。"));
System.out.println("平均值为" +
(double)(x + y) / 2 + "。");
for (int i = 0; i <= 10; i++)
System.out.printf("x = %6.5f\n", (float)i / 10);
System.out.println("\"ABC\"为字符串常量。");
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= i; j++)
System.out.print('\\');
System.out.println();
}
}
}
输出: