JavaSE基础04-基本运算符
运算符详解运算符是Java语言中用于执行数据操作的符号。Java提供了丰富的运算符按照功能可以分为以下几类算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、三元运算符等。理解每种运算符的用法、注意事项及优先级是编写正确表达式的基础。一、算术运算符用于基本的数学运算操作数必须是数值类型整数或浮点数但也可用于字符串连接。运算符含义示例结果加法5 38-减法5 - 32*乘法5 * 315/除法5 / 31整数除法%取模余数5 % 32自增i或i变量1--自减i--或--i变量-1注意点整数除法两个整数相除结果仍是整数小数部分直接舍弃不是四舍五入。若想得到浮点结果至少一个操作数为浮点类型。int a 5, b 2; System.out.println(a / b); // 输出 2 System.out.println(a / 2.0); // 输出 2.5取模运算在Java中取模结果符号与被除数左操作数相同。System.out.println(5 % 2); // 1 System.out.println(5 % -2); // 1 System.out.println(-5 % 2); // -1 System.out.println(-5 % -2); // -1自增/自减前缀形式i先加1再使用变量的值。后缀形式i先使用变量的值再加1。int i 3; int j i; // i4, j4 int k i--; // k4, i3字符串连接运算符可用于连接字符串。如果任一操作数是字符串则另一个操作数会被转换为字符串。System.out.println(Hello World); // 输出: Hello World System.out.println(结果 123); // 输出: 结果123 System.out.println(1 2 3); // 输出: 33二、关系运算符比较运算符用于比较两个值的大小或相等关系返回布尔类型true/false。运算符含义示例结果等于5 3false!不等于5 ! 3true大于5 3true小于5 3false大于等于5 3true小于等于5 3false注意点关系运算符的结果只能用于布尔表达式如if条件。比较基本类型时比较的是数值是否相等。比较引用类型时比较的是两个引用是否指向内存中的同一个对象地址相同。若需比较对象内容应使用equals()方法。String s1 new String(abc); String s2 new String(abc); System.out.println(s1 s2); // false不同对象 System.out.println(s1.equals(s2)); // true内容相同三、逻辑运算符用于连接布尔表达式返回布尔值。运算符含义用法说明短路与a b两者都为真才真若a为假则不计算b||短路或a || b两者有一个为真即真若a为真则不计算b!逻辑非!a取反逻辑与非短路a b两者都为真才真总是计算两边|逻辑或非短路a | b两者有一个为真即真总是计算两边^逻辑异或a ^ b相同为假不同为真短路特性若左边为false右边表达式不会被计算因为结果已确定为false。||若左边为true右边表达式不会被计算因为结果已确定为true。示例int a 5, b 0; if (b ! 0 a / b 1) { // 短路b!0为false不计算a/b避免除零异常 // ... }非短路和|总是计算两边常用于位运算见下在逻辑表达式中较少使用除非需要确保两边都执行比如方法调用有副作用。异或^对于布尔值true ^ truefalsetrue ^ falsetrue。四、位运算符对整数类型的二进制位进行操作操作数只能是整数类型byte, short, int, long, char。运算符含义示例说明按位与a b同1则1否则0|按位或a | b有1则1否则0^按位异或a ^ b相同为0不同为1~按位取反~a0变11变0包括符号位左移a n左移n位低位补0相当于乘以2ⁿ右移a n右移n位高位补符号位算术右移无符号右移a n右移n位高位补0逻辑右移注意点按位运算对补码形式操作。移位运算可能溢出需注意数据类型范围。对byte、short、char进行移位前会自动提升为int结果也是int。int a 5; // 二进制 0101 int b 3; // 二进制 0011 System.out.println(a b); // 0001 1 System.out.println(a | b); // 0111 7 System.out.println(a ^ b); // 0110 6 System.out.println(~a); // 取反111...1010负数具体看int位数 System.out.println(a 1); // 1010 10 System.out.println(a 1); // 0010 2正数高位补0 int c -5; // 负数右移高位补1 System.out.println(c 1); // 结果仍为负数 System.out.println(c 1); // 高位补0变成正大数应用场景底层系统编程、加密算法、高效乘除运算左移代替乘2右移代替除2、状态标志位操作等。五、赋值运算符将右边的值赋给左边的变量。除了基本还有复合赋值运算符运算符含义示例等价于简单赋值a b将b的值赋给a加后赋值a ba a b-减后赋值a - ba a - b*乘后赋值a * ba a * b/除后赋值a / ba a / b%取模后赋值a % ba a % b位与后赋值a ba a b|位或后赋值a | ba a | b^位异或后赋值a ^ ba a ^ b左移后赋值a ba a b右移后赋值a ba a b无符号右移后赋值a ba a b注意点赋值运算符优先级很低通常最后执行。复合赋值会自动进行类型转换隐式强制转换可能引起精度损失。byte b 10; b 5; // 编译通过等价于 b (byte)(b 5) // b b 5; // 编译错误b5结果为int需强制转换b (byte)(b 5);直接使用b b 5会导致编译错误因为Java中byte类型参与算术运算时会自动提升为int类型需要显式强制转换才能赋值回byte变量。六、三元运算符条件运算符Java中唯一的三目运算符格式为条件 ? 表达式1 : 表达式2若条件为true整个表达式值为表达式1否则为表达式2。示例int a 10, b 20; int max (a b) ? a : b; // max 20注意点表达式1和表达式2的类型需兼容否则会进行类型提升。三元运算符可以嵌套但建议保持简洁以提高可读性。七、运算符优先级当表达式包含多个运算符时优先级决定了运算顺序。优先级高的先计算相同优先级按结合性从左到右或从右到左计算。优先级运算符分类运算符结合性1后缀exprexpr--左到右2前缀expr--exprexpr-expr~!右到左3乘除取模*/%左到右4加减-左到右5移位左到右6关系小于、大于instanceof左到右7相等!左到右8逻辑与位与左到右9逻辑异或位异或^左到右10逻辑或位或|左到右11逻辑与短路左到右12逻辑或短路||左到右13条件三元? :右到左14赋值-*/%|^右到左记忆技巧可以使用口诀或参考表但重要的是写代码时若不确定优先级用括号()明确指定顺序提高可读性。八、类型转换与运算符的结合数值提升当进行算术运算时如果操作数类型不同Java会自动进行类型提升将较小的类型转换为较大的类型byte-short-int-long-float-double然后再计算。复合赋值中的自动转换如前所述复合赋值会隐式将结果转换为左侧类型可能丢失精度。字符串连接优先级作为字符串连接时优先级高于赋值但低于算术运算。注意结合方向。九、常见陷阱与注意事项与混淆if (a 1)在Java中会编译错误因为a1是赋值结果不是布尔值但若a是布尔类型则a true是合法表达式可能造成逻辑错误。浮点数相等比较由于浮点数精度问题不要直接用比较浮点数是否相等应使用差值小于某个极小值来判断。短路与、或的使用利用短路特性可以简化代码并避免异常。移位操作对负数的影响注意和的区别尤其是对负数。优先级错误例如a 2 1等价于a (21)因为优先级高于实际可能不是期望的(a 2) 1。所以加括号清晰。十、总结类别主要运算符返回值类型注意事项算术运算符-*/%--数值型整数除法、自增前后缀关系运算符!boolean引用类型用equals逻辑运算符||!|^boolean短路特性位运算符|^~整数型对补码操作移位有区别赋值运算符-*/%等根据左侧类型复合赋值含隐式转换三元运算符? :根据表达式1和2的类型简洁但勿滥用
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416707.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!