算数运算符
通过算数运算符可以完成基本的加减乘除取余的运算操作
算数运算符有哪些
- 求和
- 相减
- 乘积
/ 相除
++ 自加1
-- 自减1
% 取余、求模
例:
int a = 10;
int b = 3;
System.out.println(a+b); //13
System.out.println(a-b); //7
System.out.println(a*b); //30
System.out.println(a/b); //3 因为是int类型,所以结果也是int类型
System.out.println(a%b); //1
注意事项:
整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型。
/获取的是除法操作的商,%获取的是除法操作的余数
++这个叫做自增运算符,- -叫做自减运算符
例:
int k = 10;
k++;//相当于k = k + 1
System.out.println("k=" + k);
//这里面的+号是做的字符串相加的运算,输出结果为k=11
int j = 5;
++j;//相当于j = j + 1
System.out.println("j=" + j); //j=6
int m = 8;
m--;//相当于m = m - 1
System.out.println("m=" + m); //m=7
int n = 6;
--n;//相当于n = n - 1
System.out.println("n=" + n); //n=5
+号在java中有三种作用,代表正号,做加法运算,字符串的连接符
上面的自增(自减)运算符写在变量的前面和后面有什么区别呢?
单独使用:
放在变量的前面和后面效果一样,就像上面的例子
参与运算使用:
放在变量的前面,先自增或者自减,然后再参与运算。
放在变量的后面,先参与运算,再自增或者自减。
例:
int m = 10;
int e = m ++; //++如果出现在变量的后面,先赋值,然后自加1
System.out.println("e="+e); //10
System.out.println("m="+m); //11
int c = 10;
int d = ++c; //++如果出现在变量的前面,先自加1,然后再赋值
System.out.println("d="+d); //11
System.out.println("c="+c); //11
int z = 10;
System.out.println(z++); //10
System.out.println(z); //11
int y = 10;
System.out.println(++y); //11
System.out.println(y); //11
小练习:
第一题 请问下面程序最后打印的结果是什么?
int a = 10;
int b = 10;
int c = 10;
a = b++;
c = --a;
b = ++a;
a = c--;
System.out.println("a = " + a + ",b = " + b + ",c = " + c);
第二题 请问下面程序最后打印的结果是什么?
int x = 4;
int y = (x++)+(++x)+(x*10);
System.out.println("x = " + x + ",y = " + y);
第三题 下面程序有没有问题?
byte b = 10;
b = b + 1;
System.out.println("b = " + b);
第四题 请问下面程序最后打印的结果是什么?
int i = 0;
i = i++;
System.out.println(i);
答案分析
第一题:
a = b++; //此时a的值是10 ,b的值是11
c = --a; //a的值是9, c的值是9
b = ++a; //a的值是10, b的值是10
a = c--; //a的值是9, c的值是8
第二题:
第一个括号里面的x++的值是4,第二个括号里面的++x的值是6,第三个括号里面的x*10的值是60
第三题:
第二行代码里面有问题,因为1默认是int类型,当byte与int进行混合运算的时候,会提升为int类型,两个int相加的结果还是int,赋值给byte会损失精度。
第四题:
这里面涉及到内部的运行步骤:先用一个临时的变量temp保存变量自增前的值,然后变量自增,最后自增表达式会把temp的值作为整个表达式的值返回,也就是把temp的值返回给了i,由于temp保存的是i自增前的值,所以i的值不会变。
通过字节码(编译后的.class文件)的解释:
Code:
0: iconst_0 //将常量’0’push入操作数栈(operand stack,与普通栈不同)
1: istore_1 //将常量’0’存储到栈(注意不是堆,局部变量存储在栈中)
2: iload_1 //将常量’0’载入到操作数栈
3: iinc 1, 1 //在栈中将a增1,a从’0’变为’1′
6: istore_1 //在操作数栈中将常量”重新存储到栈,a从’1’变回’0′
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return










网友评论