Java表达式谜题

来自Java编程思想

1、奇数性:判断一个数是否是奇数的时候要注意负数时的情况。
				可以用  x % 2 != 0 来判定。
				也可以用(x & 1) != 0;位操作来判定。
2、找零时刻:System.out.println(2.00-1.10);想要的输出结果为0.99但是实际结果为0.8999999999999999
					解决方法:(1)  System.out.printf("%.2f%n",2.00-1.10);
								  (2)  System.out.println(200-110+"cents");
								  (3)  System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
					方法评价:第一种计算原理相同只是显示的结果不一样。
									第二种比较可取。
									第三种如果有大量的计算则会存在效率问题。
3、长整数:注意不要让数据溢出,如果可能溢出,则使用长整形来提前处理。
4、1和l注意区分,如果要使用长整形的时候一定要把l写成大写的L这样才能明确的区开来。
5、十六进制加法的时候出现的问题。十六进制数的最高位如被占用,那么他就是一个负数,例如
	int的最高为4个字节32位,如果有一个0xcafebabe那么这个数就是一个负数-889275714。
	如果为long那么就是一共8个字节64位。
	System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
	左操作数为一个long型,右操作数为int类型,为一个负的十六进制,如果转换为long型,
	则还为与原来等值的负数。左操作数的高32位是一,右操作数的高32位是负一,所以
	相加之后高32位就变成了0。
	System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));
	这样就不会出现问题了。
	(注意相加的进制的最高为是否被占用)。
6、多重转型:System.out.println( (int )(char )(byte ) -1);
	先把int类型的-1转换为byte型的-1,在转换为char型在转换为int类型之后的结果为65535。
	不可思议的结果。int 到 byte的转换,int32位byte8位,int的-1所有的32位都置位转换到byte
	的时候,执行窄化原始类型转化直接把高24位丢掉。留下一个8位的都被置位的byte类型,
	还表示-1。从byte到char,char16位且无符号。从byte到char发生符号扩展,因此就是16个1,
	转换为char之后就是2的16次方减一,即65535.从char到int执行零扩展,因此还是65535.所以最终
	结果是65535.
	如果想把char转换为宽度更宽的类型,并且希望有符号扩展的话,就先把char转换为short然后再转换。
	如果你在将一个byte类型的数值b转换为char,并不希望有符号扩展,那么你必须使用一个位掩码
	来限制它。例如
	char c = (char) (b & 0xff)
7、互换内容:x^=y^=x^=y;在Java中并不能完成内容互换,最简单的方法就是声明一个中间变量。
8、dogEquis,问号冒号操作符。
		char x = 'X';
		int i = 0;
		System.out.println(true ? x : 0);
		System.out.println(false ? i : x );
		规则:
				(1)如果第二个和第三个操作数的类型相同,那么他就是条件表达式的类型。
				(2) 如果一个类型为T,T代表byte/short/char,另一个是int常量,那么表达式类型
						的类型就是T;
				(3)否则对操作数类型进行二进制提升,而表达式的类型就是提升后的类型。
		第一个符合第二点,所以为char,输出X
		第二个符合第三点所以为int,输出88;(X对应的ascll码)
编程是应该注意的问题,尽量让第二和第三个操作数有相同的类型,这样程序看起来更清晰。
9、半斤
	使用复合赋值操作符的时候,默认把类型强制转换为操作符左边的,如果左边的类型比右边的
	窄,就会出现强制类型转换,可能出现溢出的现象,这就会给程序带来一定的不确定性。
	因此,在编写程序的时候尽量要是左边的宽度比右边大,或者是相等,这样就不会出现问题。
		short x = 0;
		int i = 123456;//short的范围为-32768~32768
		x += i; //把类型强制转换为左边的类型。会出现溢出现象
10、八两
		复合赋值操作符要求两百年必须是原始类型(int)或包装了的原始类型(Integer)(似乎不是这样);
		简单复制操作符允许左侧对象是引用类型,要保证左右兼容;
		Object x ="Buy";
		String i = "Effective Java";
		int j = 10 ;
		x = x + i; //合法
		System.out.println("10、八两");
		System.out.println(x);
		x  = "Buy";
		//x += j;//不合法
		x += i;//如果右侧不是String类型则不合法,如果是int\char\long等则合法。
		System.out.println(x);

	

package Java_JieHuo;

import java.math.BigDecimal;

public class test_JieHuo {
	public static void main(String [] args){
		SearchZero();
		longInteger();
		l_And_1();
		JoyOfhex();
		Mulitcast();
		CleverSwap();
		DogEquis();
		BanJin();
		BaLiang();
	}
	
	//2--找零时刻
	public static  void SearchZero(){
		System.out.println(2.00-1.10);
		//笨拙的方法
		System.out.printf("%.2f%n",2.00-1.10);
		System.out.println(200-110+"cents");
		
		System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
		//System.out.println(new BigDecimal(2.00).subtract(new BigDecimal(1.10)));
	}//end SearchZero
	
	//3--长整数
	public static void longInteger(){
		long ms_Per_Day = 24L * 60 *60 *1000;
		long mms_Per_Day = 24L * 60 * 60 * 1000 * 1000;
		System.out.println("每天的毫秒数"+ms_Per_Day);
		System.out.println("每天的微秒数"+mms_Per_Day);
		System.out.println(mms_Per_Day/ms_Per_Day);
	}//end longInteger
	
	//4注意 1 和 l 
	public static void l_And_1(){
		System.out.println("注意1和:");
		System.out.println(12345+5432l);
		System.out.println(12345+54321);
	}//end l_And_1
	
	//5 16进制加法时出现的问题
	public static void JoyOfhex(){
		int a = 0xcafebabe;
		System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
		System.out.println(Long.toHexString(0x100000000L + 0xcafebabeL));
		System.out.println(a);
		System.out.println((long)a);
	}//end JoyOfHex
	
	//6多重转型
	public static void Mulitcast(){
		System.out.println( "6、多重转型");
		System.out.println( (int )(char )(byte ) -1);
		
	}//end Mulitcast
	
	//7、互换内容
	public static void CleverSwap(){
		int x = 1984;
		int y = 2001;
		x^=y^=x^=y;
		System.out.println("7、互换内容");
		System.out.println("x ="+x+"y="+y);
		int tmp;
		x = 1984;
		y = 2001;
		tmp =x;
		x = y;
		y = tmp; 
		System.out.println("x ="+x+"y="+y);
	}//end CleverSwap
	
	//8、dogEquis
	public static void DogEquis(){
		char x = 'X';
		int i = 0;
		System.out.println("8、dogEqius");
		System.out.println(true ? x : 0);
		System.out.println(false ? i : x );
	}//end DogEqius
	
	
	//9、半斤
	public static void BanJin(){
		short x = 0;
		int i = 123456;//short的范围为-32768~32768
		x += i; //把类型强制转换为左边的类型。
		System.out.println("9、半斤");
		System.out.println(x);
		/*x = x + i; //不能通过编译
		System.out.println(x);*/
	}//end BanJin

	//8、八两
	public static void BaLiang(){
		Object x ="Buy";
		String i = "Effective Java";
		int j = 10;
		x = x + i; 
		System.out.println("10、八两");
		System.out.println(x);
		x  = "Buy";
		x += i;
		//x += j;//不合法
		System.out.println(x);
	}//end BaLiang
	
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值