JAVA_Lesson2(传智播客笔记之语言基础_运算符)

高级语言其实只是厂商不同,表现形式不同。需要掌握2点:

1. 表现形式是什么样(固定的格式)

2.(关键字、标志符、注释、常量和变量、运算符、语句、函数、数组等)什么时候使用。

System.out.println中的System是一个已有的类,不是关键字,需要注意。(区分的技术以及书写规范:关键字都是小写(一点是这样的),类名单词每个首字母要大写(尽量要这样)

标志符规则1.数字不可以开头2.不可以使用关键字Java严格区分大小写,main不是关键字,只是个函数的名称JVM认识这个main,还认识public static void main(String[] args).

注释:///**/用法等价于C语言中,java的特有注释:/** 中间可以写文档的注释,这种注释可以被提取(通常用于说明书)*/ 其实这个工具就是javadoc工具。

注释规则:另外单行注释可嵌套,单行可嵌套多行,多行可嵌套单行,但是多行注释不可嵌套多行注释。另外注释不占用文件的内存,不占字节码。(.class文件不会变大)注释可以用来调试代码,缩小范围去调试代码,这个时候要小心注释。

 IPV44个字节组成的。1个整数往往是有4个字节组成,一个中文占2个字节。

内存存址,硬盘寻道,自然内存里面运行快。变量就是在内存中开辟的一片空间,用于存储不确定的数据。这也就是变量存储在内存中的原因。

Long l=1234566890123//直接编译会报错的,需要在数字后标识l

Float f=2.3//也会报错,需要在数字后面加f

非法字符需要小心中文符号。

自动类型提升和强制转换:

如果两端是数值类型,即使两端不一致,也可以运算。eg

Int x=3

 

 

 

 

 

byte b=5;(类型自动提升)

 

 自动提升为如下:

 

 

 

 

 

 x=x+b;(涉及到自动类型提升)

 

 

 

 

 

Byte b=3

b=b+3;(暂时先记下来)

出问题了:原因在于:左侧占一个字节,右侧自动提升后变成4个字节(4默认是4字节),这样若前面3个字节有有效数字,则会出现丢失有效数字。

Turefalse不是数值性,不能做数值运算。

a仅仅是一个变量,而且还未被定义。只有’a’这样写才能是字符常量。‘a’+1其实是char类型的字符常量被提升了

 byte b=4;// b数值类型范围-1281274在内存中很多0。直接把4前面很多0给去掉了。

下面摘录一段浅显的解释:

byte b1 = 4; //1 
byte b2 = 200; //2
1 没问题,2会报错。
4 和 200 在Java 中就是 int。你把 int 赋给 byte,必须要做强制类型转换。
在 // 1 中,4 在 byte 的取值范围内,编译器替你做了转换。这样做有个前提:尽管在内部表示不一样(byte 1 位,int 4 位),byte 4 和 int 4 确实是相等的。
在 // 2 中,200 超出了 byte 的范围,编译器不敢替你做主,所以就报错了。如果程序员觉得没问题,可以使用强制转换。即: byte b2 = (byte)200; 


float f1 = 0.4; // 3

float f2 = 0.4F; // 4
// 3 报错,// 4 没问题
不管你是使用double还是float,小数在计算机中都是不能精确表示的。你写的是 0.4,在计算机内部可能表示成 0.3999999999999999998. 只不过double 使用的字节数多,所以double 比 float 更精确一些。
如果把一个 float 转换成 double,会损失精度,编译器会告诉你这样转是错误的。

在 Java 中,0.4 是一个 double, 0.4F 是一个float。前面说过了,double 比 float 更准确一些,所以 0.4 和 0.4F绝对是不一样的。
总结一下:
int 4 == byte 4
double 0.4 != float 0.4

 b=3+7;//没有错误,原理跟上面那条语句一致

 byte b1=3;byte b2=7;

b=b1+b2;//在此,b1b2是变量,变量意味着其数值会变化,容易出事。例如两者一相加就可能越界,此外,数值不确定编译器也无法检查其数值。

但是需要注意的是:

int x

int x1=10int x2=98; (要区别以上,因为上面byte和右边的3不是同一种类型的数据,而这个左右两边是一样的。)

x=x1+x2

这样反而又没有问题,或许本质就是能装的下就可以。Integer.MAX_VALUE表示整数的最大值。可以用这数去试试。会变成负数,超过其范围了,再次进位到第33位。舍弃高位后,最高位就变成1了。就变成负数了。

下面贴个该问题的详细解答:

byte的取值范围是-127到128,你也知道字面量的整型默认的是int类型(小数类型默认是double),int类型的范围大概是负20多亿到20多亿,所以赋值的时候强制转换会有精度损失,举一个例子就清楚了。
byte b=1024
我们知道byte的取值范围是-127到128,所以强制转换之后b肯定是小于1024。

但是你用int类型来定义肯定是不会有这个问题,因为字面量整型默认是int没有强制转换,所以也不存在精度损失。

最后相加之后都存在溢出问题,例如:
byte b1 = 127;
byte b2 = 127;
byte b3 = b1+b2;
b3就不是254,因为溢出了。int类型也一样。
追问
那溢出是不是不会报错,强制转换时编译器会检查是否超出取值范围损失精度,比如
byte b1=3;
byte b2=7;
b=b1+b2
system.out.println(b)会报错损失精度
上面b是默认int类型而b1 b2是变量byte类型如果超出byte取值范围,进行强制转换时会损失精度。而下面
int b1=3
int b2=7
b=b1+b2
输出b系统不会报错,因为都是int默认类型不存在强制转换,但是他们都可能存在溢出,像上面你说的,溢出是不是不会报错
追答
可能溢出不会存在编译警告,这和你IDE设置有关,包括上一个强制类型转换也一样和编译检查设置有关,可以设置为警告,也可以设置为错误。

运算符:

-5%2=-15%-2=1 (得到的结果符号与被除数一致)

+可以做为连接符,3+”2”会打印出32,任何数据和字符串用加号连接,就会变成一个更大的字符串。

 Java中的++--运算符与C语言有别,需要注意:

Int a=3;

++a;

打印a=4a++也是一样都是4

 

int a=3b

b=a++// 右边运算完事后再赋值给左边,但是与实际结果似乎不是这么回事,现在分析底层过程:a++其实是算完了之后再给b赋值的。A的值需要参与其他运算,然后去参与自增的动作。在内存中会开辟一片临时区域(把已有的值预存),另外一片区域中(3+1=4),这时在变量a的内存中变成了4,但是最重要的是给b赋值的是预先开辟的那片内存中的值给b赋值。所以b的值是3。其中一共涉及到3片内存:变量a的内存、运算区,临时存储区

打印ab的值()b=3;a=4(按照C语言的规范应该是如此)

Int a=3,b;

B=++a;

打印a,b()

a=4,b=4;(C 语言目前还没有冲突)

 

下面就与C语言有点冲突:

Int i=3

I=i++

打印i=3而在VC环境下运行为4.但是Java语言中得出的结果为3

大致过程如下:

i=i++;等价于:

temp=i;//临时存放下i的值

I=i+1//i的运算区,此时i的值为4

I=temp//i的值又重新被赋值,将临时存储中的值赋值给ii重新为3

 

面试题考开发不常用的东西。

short s=3

s+=4;  //没事(若用java (后面的文件名大小写混乱的话),结果会显示找不到或无法加载主类)

由于是+=操作符,在解析时候s+=1就等价于s = (short)(s+1),

s=s+4; //报错s=s+4这句先执行s+4然后把结果赋给s,由于4为int类型,所以s+4的返回值是int,编译器自动进行了隐式类型转换所以将一个int类型赋给short就会出错,

以上2个语句有什么区别?

因为s是变量,不确定的值,因为右边不是常量,所以不行。

没事的原因:因为s+=4是一次运算(跟short s=3一样都是赋值运算,底层可以自动转换),但是s=s+42次运算(不能做自动转换)。

另外:由低往高转是自动的,而由高往低转需要做判断是否损失精度(强制转换)。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值