变量与运算符
一、变量
1、定义变量
变量就是一切通过内存分配并赋值的量,分为不可变变量和可变变量
int x;
x = 1;
int x = 1;
其中变量类型决定了变量的数据类型、范围、存储在内存中所占的字节数以及可以进行的合法操作。变量名必须为一个合法的标识符。 定义变量的规则:
- 变量名字中不能有空格
- 禁止使用关键字作为变量名
- 避免使用汉字,不要使用英文和拼音混写
- 整体是驼峰结构,首字母小写如lowerUserName
- $和_可以随意使用,但是不建议当做开头
- 数字不能作为开头
2、数据类型(四类八种)
类型 | 类型名 | 占用空间 | 取值范围 |
---|
整数类型 | byte | 8位(1个字节) | -2^7 ~ 2^7-1 | 整数类型 | short | 16位(2个字节) | -2^15 ~ 2^15-1 | 整数类型 | int | 32位(4个字节) | -2^31 ~ 2^31-1 | 整数类型 | long | 64位(8个字节) | 2^63 ~ 2^63-1 | 浮点数类型 | float | 32位(4个字节) | (正数)1.4E-45 - 3.4028235E38 (整体)-3.4028235E38 ~ 3.4028235E38^63-1 | 浮点数类型 | double | 64位(8个字节) | 1.7976931348623157E308 ~ 4.9E-324 | 字符类型 | char | 16位(2个字节) | 65536(看字符编码) | 布尔类型 | boolean | 8位(1个字节) | 只有两个值true和false |
3、各数据类型的取值范围
数据在计算机中存储形式为补码
-
整形的取值范围(以byte举例):byte是一个字节,共8位,其中第一位是符号位:0正1负。所以用于表示数值的其实只有7位。所以它的取值范围是:2^7 ~ 2^7-1 但其中有几个特殊值需要特别注意
- 0:
源码:0000 0000 反码:0000 0000 补码:0000 0000 - -0:
源码:1000 0000 反码:1111 1111 补码:0000 0000(进位1溢出不要) - 128
不能表示 - -128
源码:(1) 1000 0000 反码:(1) 0111 1111 补码:(1) 1111 1111(首位溢出)-128
结论:byte的取值范围为2^7 ~ 2^7-1 其他整形以此类推
- 浮点数的取值范围
浮点数的取值范围涉及IEEE 754 较难,之后会单独复习一次 - char类型的取值范围
需要注意目标的字符集应与源地址字符集相同,否则会出现乱码
- ASCII:
(American Standard Code for Information Interchange,美国信息互 换标准代码) ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在 1986年,到目前为止共定义了128个字符。ASCII码,用一个字节表示,8 位能够表示256个字符,可以用来表示所有的大写和小写字母,数字0到 9、标点符号,以及在美式英语中使用的特殊控制字符,足够美国人用的 了,事实上他们只用到了128个字符,还有位就空着了。 主要记住几个常用的比如0为48;a为65;A为97。 - Unicode:
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编 码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种 语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和 符号最少由 16 位来表示(2个字节),即:2 ^16 = 65536(注:此处说的是最少2个字节,可能更多)。 - GB2312:把中国单独拉出来看,MBCS时期,中国于1980年发布了GB2312,就是国 标的拼音,这个编码用区位码(94个区,每区94个字符)的方式可以支持 7000多个汉字,它所收录的汉字已经覆盖中国大陆99.75%的使用频率,基 本可以满足汉字计算机的需要了。
gb2312 是简体中文的码 gbk 支持简体中文及繁体中文 - UTF-8:
UTF-8,是对Unicode编码的压缩和优化,所以UTF-8包含于Unicode,只 是它不再是最少使用2个字节,而是将所有的字符和符号进行分类:ascii码 中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存。
4、数据类型的转换
- 自动类型转换
自动类型转换也叫作隐式类型转换,指的是两种数据类型在转换的过程中不需要显式的进行声明,当把一个数据取值范围较小的数值直接赋给一个取值范围大的数据类型变量时,系统就会进行自动类型转换,否则必须使用强制类型转换。
byte i = 3;
int j = i;
double k = j;
表达式类型自动提升 变量在表达式中进行运算时,也有可能进行自动类型转换,这就是所谓的表达式类型自动提升,如byte、short和char类型的变量在运算期间类型会自动提升为int,然后在进行计算,同理float类型也会提升至double类型
byte a = 3;
byte b = 4
byte c = a + b;
- 强制类型转换
强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要显式的声明。当两种类型不兼容时,或者目标类型取值范围小于源类型时,自动类型转换无法生效,此时就需要进行强制类型转换。 将取值范围大的数据类型的变量赋值给取值范围小的数据类型时,可能会造成数据的丢失;就像将1L水瓶中装的750ml的水注入只有500ML水瓶中,其中有250ml的水就会溢出。 所以是否进行强制类型转换就需要开发者自己决定了
byte a = 3;
byte b = (byte) a;
byte c = (byte) 4;
float d = (float) 1.4;
二、运算符
1、算数运算符
+ - * / % ++ --
其中%为取余 6 % 5 = 1 和数学的用法一样不过多复习 其中讲一下i++与++i的区别(i–与--i类似) 如果不赋值都是自增1,相当于i+1 如果赋值,i++则为现将i赋值给其他变量,然后自增 相反,++i为先自增再赋值
int i = 1;
int j = i++;
int k = 1;
int m = ++k;
2、赋值运算符
+= -= *= /= =
=即为赋值例如
int x,y,z;
x = y = z =1;
+=、-=、*=、/=、%=为简写 x += 3就相当于 x = x+3 首先进行加法运算,再讲结果赋值给x,其他几个类似 赋值运算符中强制类型转换的自动实现 在为变量赋值时,当两个类型彼此不兼容或者目标类型取值范围小于源类型时,需要进行强制类型转换。但在使用+=、-=、**=、/=、%=时,强制类型转换会自动完成,不需要再进行显式的声明
short i = 3;
int j = 5;
j +=i;
3、比较运算符
运算符 | 运算 | 示例 | 结果 |
---|
== | 相等于 | 4 == 3 | false | != | 不等于 | 4 !=3 | true | < | 小于 | 4 < 3 | false | > | 大于 | 4 > 3 | true | <= | 小于等于 | 4 <= 3 | false | >= | 大于等于 | 4 >= 3 | true |
注意在使用比较运算符时,不要将比较运算符==和赋值运算符=搞混
4、逻辑运算符
与&
或|
异或^
非!
短路运算符&&和||的结果和&和|的结果一样 区别为: &&短路与,如果左边的结果为false,则会直接出结果不再进行右边的运算 ||短路或,如果左边的结果为true,则会直接出结果不再进行右边的运算
5、位运算符
&按位与、|按位或、~取反、按位异或^、<<左移、>>右移、>>>无符号右移
其中(<<)就是将二进制向左移动指定位数,运算时,左侧移走部分舍去,右侧的空位补0;
(>>)就是将二进制向右移动指定位数,运算时,左侧空位补0或1(原来是负数就补1,正数就补1),右侧移走的舍去 (>>>)就是无符号右移指定位数,运算时,不管原来为正数还是负数,都在左侧空位补0,右侧移走的舍去
运算符 | 示例 | 结果 |
---|
<< | 0000 0001 << 2 | 0000 0100 | << | 1001 0011 << 2 | 0100 1100 | >> | 0110 0010 >> 2 | 0001 1000 | >> | 1110 0010 >> 2 | 1111 1000 | >>> | 0110 0010 >>> 2 | 0001 1000 | >>> | 1110 0010>>>2 | 0011 1000 |
6、条件运算符
条件运算符也称为三元运算符或三目运算符
条件 ? 结果1 : 结果2;
条件的结果一定是boolean类型,只能为true或是false,为true则输出结果1,为false则输出结果2 条件运算符的嵌套 举例:一行代码运算出i,j,k三者中的最大数
int i = 10;
int j = 30;
int k = 50;
int max = i > j ? i > k ? i : k : j > k ? j : k;
7、运算符的优先级
由于()的优先级最高,编写代码时,可以尽量使用括号()来实现想要的运算顺序,以免产生歧义。
|