运算符
基本四则运算符:+ - * / %
public static void main(String[] args) {
System.out.println(5 / 2); //2
System.out.println(5.0 / 2); //2.5
System.out.println((float)5 / 2); //2.5
System.out.println((float)(5 / 2)); //2.0
}
public static void main(String[] args) {
System.out.println(10 % 3); //1
System.out.println(-10 % 3); //-1
System.out.println(10 % -3); //1
System.out.println(-10 % -3); //-1
System.out.println(11.5 % 2.0); //1.5
}
int 除以 int 还是int,只不过要用double来计算。
在java中可以对小数进行除余数。
0 不能做除数:
public static void main(String[] args) {
System.out.println(5 / 0); //1
}
会报算术异常。
符合运算符
增量赋值运算符: += -= *= /= %=
自增自减运算符:++ --
前置++ 和后置++
++a a++
看下面这个例子,这个例子在C中是输出11,但是在java中输出10,这跟java的反汇编语言有关。
public static void main(String[] args) {
int i = 10;
i = i++
System.out.println(i); //10
}
以上转自比特大博哥的笔记。比特大博哥的个人空间-比特大博哥个人主页-哔哩哔哩视频
关系运算符
== != < > <= >=
这些运算符的值都是boolean类型,不会是1或者是0,而是true和false。
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a == b); //false
System.out.println(a != b); //true
System.out.println(a < b); //true
System.out.println(a > b); //false
System.out.println(a <= b); //true
System.out.println(a >= b); //false
}
逻辑运算符
&& || !
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
System.out.println((a < b) && (b < c)); //true
}
逻辑非 : !
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
System.out.println(!((a < b) && (b < c))); //false
boolean flg = true;
System.out.println(!flg); //false
}
! 运算符只能作用于Boolean类型的数据上。
表达式1 && 表达式2
表达式1 || 表达式2
相对于 && 如果表达式1 为假 那么会编译器会直接计算结果为真,不会执行表达式2。
相对于 || 如果表达式1 为真,那么会编译器会直接计算结果为真,不会执行表达式2。
public static void main(String[] args) {
System.out.println(10 > 20 && 10 / 0 == 0);
System.out.println(10 < 20 || 10 / 0 == 0);
}
我们发现两个式子的后面表达式2 : 10 / 0 == 0 ;这会式子都没有报错:
逻辑与和逻辑或
逻辑与:&
逻辑或: |
我们知道& 和 | 在左右两边为数的类型的时候,表示的是位运算,但在java中如果& 和 | 的操作室为Boolean类型的话,那么这个两个符号也可以分别表示逻辑与和逻辑或。
public static void main(String[] args) {
System.out.println(10 > 20 & 10 / 0 == 0);
System.out.println(10 < 20 | 10 / 0 == 0);
}
因为逻辑与和逻辑或不支持之前 && 和 || 的提前结束的操作,所以 相对于 & 和 | 他们会把左右两边的表达式1 和表达式2 都进行运算,所以针对上面的例子,就会抛出异常
所以虽然和这两个操作符也可以表示逻辑与和逻辑或,但是我们一般不使用他们来表示逻辑与和逻辑或。
位操作符
& : 按位与:如果两个数对应位置的数不相同,则为0,相同的话就是1 就为1 ,是0就为0。其实按位与可以看做是乘法,把两个数对应位置的数相乘的结果就是这个两个数按位与出来的结果。
|:按位或:只要有1 那么那一位的就是1,否则为0。
^ :按位异或:两位相等,则为0,不相等则为1·。
~:按位取反:如果该位为0,则转为1,如果为1 ,则转为0;
移位操作符
左移:<< 左移一位,右边第一位补0 就行。左移相当于是乘法,左移一位相当于是乘以 2^1 。
右移:>> 右移一位,右边第一位一位被舍去,左边最后一位需要补数,补0 还是 1 看符号位,是1 补1 ,是0 补 0。如果操作数是正数的话,右移相当于是除法。右移一位相当于是除以 2^1 。
0000 1011 //11
11 >> 1
0000 0101 //5
1111 1111 //-1
-1 >> 1
1111 1111 //-1 // 负数右移 左边补1
在计算机中位运算的速度是大于 * 和/ 的速度的,但是现在的计算机都对* 和 / 进行了优化,这个速度差异已经很小了。
无符号右移: >>> :既然是无符号,那么这个操作符在右移的时候就不看符号位了,直接在右移之后再最左一位补0。
没有无符号左移。
条件运算符
表达式1 ? 表达式2 : 表达式3
如果表达式1计算的值为真,那么就执行表达式2的内容,反之为假,就执行表达式3的内容。
条件运算符也是java中唯一的三目运算符。
public static void main(String[] args) {
int a = 10;
int b = 20;
int MAX = a < b ? b : a;
}
小结
% 操作符也可以对double类型进行计算
因为Java是强类型的语言,所以 && 这类运算符的操作室必须是boolean类型。
整体来看,java中的操作符合C中的还是基本一致的。
关键字
逻辑控制
输出语句
import java.util.Scanner;
public class text1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
System.out.println(a);
}
}
此时运行程序为:
其中的Scanner 类可以读入任何类型的数据。
需要注意的是:
这个nextInt()方法和nextLine() 方法这两个方法不连续使用,因为我们在上面输出整形之后,会输入一个回车,那么下面的nextLine()就会把这个回车认为是我们输入进去的字符。
我们一般在nextInt()下面不使用nextLine()方法,我们一般使用next()方法。
用next()可以替代。
next()和nextLine()区别
如果是nextLine():
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//nextLine()
String str = scan.nextLine();
System.out.println(str);
}
我们发现我们输入的字符包括空格都输出了出来
next():
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//nextLine()
String str = scan.next();
System.out.println(str);
}
我们发现,只输出了第一个空格前面的字符串。
next()遇到空格会结束。
分支语句
if( boolean 表达式 )
{
//满足条件所执行的代码
}
java中的if(条件)中的条件必须的是boolean类型的,如果是其他类型就会报错:
public static void main(String[] args) {
int a = 10;
if(a)
{
System.out.println("yes");
}
}
上面这个例子在C中是很常见的,但是在java中并不能用,我们只能使用boolean类型的表达式来作为条件:
public static void main(String[] args) {
int a = 10;
if(a == 10)
{
System.out.println("yes");
}
}
public static void main(String[] args) {
int a = 10;
if(a < 10)
{
System.out.println("<");
}
else if(a == 10)
{
System.out.println("=");
}
else
{
System.out.println(">");
}
}
switch语句:
public static void main(String[] args) {
int a = 1;
switch(a)
{
case 1:
System.out.println("1");
break;
case 2:
System.out,println("2");
break;
default:
System.out.println("输出错误");
}
}
java中的switch和C还是由些许不一样的:
在java中的switch 中的值只能是一下几种:
整数 (int 和 short)
枚举
字符
字符串
一下是不能作为是switch中的值的:
boolean float double long
用以上几种类型会报如下错误:
switch不支持复杂条件的判断:
public static void main(String[] args) {
int num = 15
switch(num <=20 && num >= 10)
{
//程序执行代码
}
像上面这个例子,switch中的条件在if中是很好判断的,但是在switch中机会报错:
switch虽然能够嵌套使用,但是使用之后,不太美观,而且数量多之后不容易查看代码:
public static void main(String[] args) {
int a = 1;
int b = 2;
switch(a)
{
case 1:
System.out.println("1");
break;
case 2:
switch(b)
{
case 1:
System.out.println("1");
break;
default:
System.out.println("输出错误");
}
break;
default:
System.out.println("输出错误");
}
}
循环结构
while(循环条件)循环和C一模一样,只是在循环条件这里,只能使用boolean类型,其他类型不行。
在java中退出循环有两种方法:ctrl + c( 直接中断程序) ctrl + d(正常的退出循环)ctrl + z也可以退出循环。
java中同样和C一样使用 break 和continue来跳出整个循环和一次循环。
而for循环也是差不多的:
public static void main(String[] args) {
for(int i = 0;i <= 10; i++)
{
System.out.println("hellw" + i + "次");
}
}
public static void main(String[] args) {
int i = 1;
for( ; ; )
{
System.out.println("你好");
i++;
}
}
其中i++一直在执行,那么当加到int整形的最大值之后,就会循环到int最小的数,然后继续执行i++。
我们发现,当for循环的表达式2 也就是循环条件表达式 为空的时候,也可以进入循环执行循环体,此时认为循环条件始终为true,但是在while循环中,循环条件不能为空:
public static void main(String[] args) {
while()
{
int i = 10;
}
}
此时报错了
如果想要实现类似效果,就需要在循环条件里写入true:
public static void main(String[] args) {
while(true)
{
int i = 10;
}
}
上述我们谈到了死循环中的i++,那么可能会出现下面这种情况:
public static void main(String[] args) {
for(byte i = 0;i <= 130;i++)
{
System.out.println(i);
}
}
此时会出现死循环,因为byte最大值是127,但是for循环的条件是 i <= 130 ,所以这个循环会一直继续下去。
用for循环打印菱形:
int i = 0;
int line = 11;
for(i=0; i<line; i++)
{
int j = 0;
for(j=0; j<line-1-i; j++)
{
System.out.print(" ");
}
for(j=0; j<2*i+1; j++)
{
System.out.print("*");
}
System.out.print("\n");
}
for(i=0; i<line-1; i++)
{
int j = 0;
for(j=0; j<=i; j++)
{
System.out.print(" ");
}
for(j=0; j<2*(line-1-i)-1; j++)
{
System.out.print("*");
}
System.out.print("\n");
}
}
do while () 循环
先执行,在判断条件,也就是说再开始的时候不管条件成不成立,都会先执行一遍。
do
{
}while(循环 条件);
public static void main(String[] args) {
int a = 100;
do
{
System.out.println("条件成立");
}while(a < 1);
System.out.println("循环结束");
}
我们看见条件是不成立的,但是我们依然打印了一次“条件成立”。
输入输出
输出
System.out.println(msg);
System.out.printf(msg);
System.out.print(msg);
println()是带\n 的 ,print()设计不带 \n 的。而printf()是格式化输出,和C中的printf函数是一样的。
printf()的 % 格式化输出。
使用Scanner 读取字符串/整数/浮点数
·import java.util.Scanner; // 导入Scanner的包
········
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的name:");
String name = sc.nextLine();
System.out.println("请输入你的age:");
int age = sc.nextInt();
System.out.println("请输入你的salary:");
float salary = sc.nextFloat();
System.out.println("你的信息如下:");
System.out.println("姓名:" + name + "\n" + "年龄:" + age + "\n" + "工资:" + salary);
sc.close();// 注意,用完之后一定记得关闭方法
}
需要注意的是,我们在使用完这个方法之后要记得用 close 方法来关闭我们之前用Scanner打开的方法。
而且我们再用Scanner这个方法输入汉字的时候可能会出现以下这种情况的乱码:
出现这种情况是一般是编码出现问题,我们可以在写Scanner方法的时候指定编译形式:
Scanner sc = new Scanner(System.in, "GBK");
或
Scanner sc = new Scanner(System.in, "UTF-8");
八种基本类型的输入:
使用Scanner 方法输出N个数据
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double sum = 0.0;
int num = 0;
while(sc.hasNextDonble())
{
double tmp = sc.nextDonble();
sum += tmp;
num++;
}
sc.close();// 注意,用完之后一定记得关闭方法
}