/*
运算符
*算术运算符+ / - * % ++ --
*赋值运算符= += -= /= *= %=
*比较、逻辑运算符
*位运算符
*三元运算符
*/
class AriTest{
public static void main(String[] agrs) {
//算数运算符
//1.除法************************************************************************
int num1=12;
int num2=5;
System.out.println(num1/num2);//结果为2,任然为int型
System.out.println(num1/num2*num2);//结果为10.
//如何得到精确的值呢?
double result1=num1/num2;
System.out.println(result1);//结果为2.0,仍然不对
double result2=num1/(num2+0.0);//将num2变成double型,运算结果自动转换成double
System.out.println(result2);//得到精确值
//2.取余**************************************************************************
int m=12;
int n=5;
System.out.println("m % n = "+m%n);
int m1=-12;
int n1=5;
System.out.println("m1 % n1 = "+m1%n1);
//3.++(前后)
int a1=10;
int b1=a1++;//先赋值,后自增;
System.out.println("a1 = "+a1+",b1 = "+b1);//a1=11,b1=10
int a2=10;
int b2=++a2;//先自增,后赋值;
System.out.println("a2 = "+a2+",b2 = "+b2);//a2=11,b2=11
//!!!!!!!!!!!!!!!!!!!!!自增不改变变量的数据类型!!!!!!!!!!!!
short s1=10;
//s1=s1+1;经典的错误,s1和整数常量1相加变成int类型;
s1=(short)(s1+1);
System.out.println(s1);//s1=11
s1++;//无需上述那么复杂的强制类型转换操作
System.out.println(s1);//s2=12
//由此引出一个问题:
byte b3=127;
b3++;//不改变数据类型,但是超过了byte的数据范围,循环回到下一位,即-128
System.out.println("b3= "+b3);//b3=-128
/*
练习题:
随意给出一个整数,打印显示他的个位数、十位数、百位数上的值;
格式如下:
数字XXX的情况如下:
个位数
十位数
百位数
例如:数字153的情况如下:
个位数:3
十位数:5
百位数:1
*/
int num0=153;
int arr[]= {0,0,0};
String str="";
int i=0;
if(i==0)
str="个位数:";
else if(i==1)
str="十位数:";
else
str="百位数:";
System.out.println("数字"+num0+"的情况如下:");
for(i=0;i<3;i++) {
arr[i]=num0%10;
num0/=10;
System.out.println(str+arr[i]);
}
//赋值运算符
int i1=10;
int j1=10;
//连续赋值,和上面两行代码
int i2,j2;
i2=j2=10;
//前面也提到了,+=,-=,/=,*=,%=操作不会改变变量本身的数据类型。
short s=10;
//s=s+2;编译不通过,s变量类型变为int
s+=2;//编译通过,不改变s的数据类型
//练习2*********************************************************
int m0=2;
int n0=3;
n0*=m0++;//关键在于运算符的优先级问题.++在后,因此应该先进行赋值运算,再对m0进行自增运算
System.out.println("m0="+m0);//m=2+1
System.out.println("n0="+n0);//n=3*2
//这些题在开发中基本上遇不到,没必要画过多精力理解.
//比较运算符 ==,!=,<,>,<=,>=;比较运算符的运算结果是布尔型的。
System.out.println(i1==j1);//判断i1和j1是否相等
System.out.println(i1=j1);//将j1赋值给i1,并输出i1
/*逻辑运算符:只适用于布尔型的变量之间的运算,且运算结果也为布尔型。
逻辑与& 短路与&&;
逻辑或| 短路或||;
逻辑非! 短路非^;
*/
//逻辑与和短路与:
boolean bb=false;
int numb=10;
if(bb & (numb++>0)) {
System.out.println("我家在北京");
}else {
System.out.println("我家在南京");
}
System.out.println("numb="+numb);//逻辑与运算,numb++后numb由10变成11
boolean bb1=false;
int numb1=10;
if(bb1 && (numb1++>0)) {
System.out.println("我家在北京");
}else {
System.out.println("我家在南京");
}
System.out.println("numb1="+numb1);//短路与运算,当已知一个变量是false时,不再看另一个变量就可直接得出结果(false),因此numb1++不执行,numb1=10
//同理就很容易推到逻辑或和短路或的区别:短路或在已知一个变量为true时,不再看另一个变量而直接给出结果(true);其他情况下和逻辑与没有区别。
bb=bb1=true;
if(bb | (numb++>0)) {
System.out.println("我家在北京");
}else {
System.out.println("我家在南京");
}
System.out.println("numb="+numb);//逻辑或运算,numb++后numb由11变成12
if(bb1 || (numb1++>0)) {
System.out.println("我家在北京");
}else {
System.out.println("我家在南京");
}
System.out.println("numb1="+numb1);//短路或运算,当已知一个变量是false时,不再看另一个变量就可直接得出结果(false),因此numb1++不执行,numb1=10
//!!!!!!!!!!!!!!!!!开发中推荐使用短路与、短路或!!!!!!!!!!!!!!
//练习**************************************************************************************************
int x,y;
x=y=1;
if(x++==2 & ++y==2)//x++=1,++y=2, false&true=false
x=7;
System.out.println("x="+x+",y="+y);//x=2,y=2
int x1,y1;
x1=y1=1;
if(x1++==2 && ++y1==2)//x1++=1, false短路不再判断继续下一个关系式,得到结果false
x1=7;
System.out.println("x1="+x1+",y1="+y1);//x1=2,y1=1
int x2,y2;
x2=y2=1;
if(x2++==1 | ++y2==1)//x2++=1,++y2=2; true|false=true
x2=7;
System.out.println("x2="+x2+",y2="+y2);//x2=7,y2=2
int x3,y3;
x3=y3=1;
if(x3++==1 || ++y3==1)//x3++=1,true,短路或不再继续判断下一个关系式,返回结果true
x3=7;
System.out.println("x3="+x3+",y3="+y3);//x3=7,y3=1
//面试题*****************************************************************************************************
boolean x0=true;
boolean y0=false;
short z=42;
if((z++==42)&&(y0=true)) //z++==42,z=43,true; 注意y0=true不是关系表达式,是给y0赋值为true;
z++; //显然条件满足,z++,z=44;
if((x0=false)||(++z==45)) //同样的,x0=false是一个赋值语句,短路与左边为false,需要看右式;++z=45,z=45,true;
z++; //条件成立,z++,z=46
System.out.println("z="+z);//z=46
//位运算符 左移<< 右移>> 无符号右边移>>> 与& 或| 抑或^ 取反~ 位运算符是直接对二进制数进行运算的
int i0=21;
System.out.println("i0 << 2: "+(i0 << 2));//左移两位,在一定范围内,即乘以2的2次方。
System.out.println("i0 << 26: "+(i0 << 26));//此时仍在该范围内,得到2的26次方倍的i0;
//int共4X8=32个bit,因此21=0000 0000 0000 0000 0000 0000 0001 0101,左移27位,刚好最高位变为1(符号位)
System.out.println("i0 << 27: "+(i0 << 27));
/*
经典面试题:最高效方式的计算:2*8?
答:2<<3 或 8<<1
*/
//练习:交换两个变量的值
//方法1:
int numb_1=10;
int numb_2=20;
int temp=numb_1;
numb_1=numb_2;
numb_2=temp;
System.out.println("numb_1="+numb_1+",numb_2="+numb_2);
//方法2:不用定义临时变量;但是相加操作可能超出存储范围;且只能适用于数值类型。
numb_1=numb_1+numb_2;
numb_2=numb_1-numb_2;
numb_1=numb_1-numb_2;
System.out.println("numb_1="+numb_1+",numb_2="+numb_2);
//方法3:使用位运算符。只适用于数值类型
numb_1=numb_1^numb_2;
numb_2=numb_1^numb_2;
numb_1=numb_1^numb_2;
System.out.println("numb_1="+numb_1+",numb_2="+numb_2);
//三元运算符: (条件表达式)?表达式1:表达式2; 实质上就是一个if-else语句
int m_1=20;
int m_2=6;
int max=(m_1>m_2)?m_1:m_2;//表达式1、2必须类型一致或类型可以统一为一种。
System.out.println("max="+max);
//*********************************************
//获取三个数中的最大值
int q1=12;
int q2=30;
int q3=-43;
int max1=(q1>=q2)?q1:q2;
int max2=(max1>=q3)?max1:q3;
System.out.println("三个数中最大值是:"+max2);
}
}