首页 > 其他分享 >short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么 错?

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么 错?

时间:2024-06-17 21:59:46浏览次数:25  
标签:short int s2 s1 public 类型 什么

在 Java 中,赋值操作和复合赋值操作符(如 +=)的行为有些微妙的区别。详细分析如下:

1. short s1 = 1; s1 = s1 + 1; 的问题

public class ShortAddition {
    public static void main(String[] args) {
        short s1 = 1;
        // s1 = s1 + 1;  // 编译错误
    }
}

问题解释:

  • s1 = s1 + 1; 中,s1short 类型,1int 类型。
  • s1 + 1 的计算会将 s1 提升为 int 类型,然后进行加法运算,结果也是 int 类型。
  • int 类型的结果不能直接赋值给 short 类型的变量 s1,因为存在潜在的精度丢失。
  • 因此,编译器会报错:Type mismatch: cannot convert from int to short

解决方法:可以进行显式类型转换。

public class ShortAddition {
    public static void main(String[] args) {
        short s1 = 1;
        s1 = (short) (s1 + 1);  // 强制类型转换
        System.out.println(s1);  // 输出 2
    }
}

2. short s1 = 1; s1 += 1; 的行为

public class ShortAddition {
    public static void main(String[] args) {
        short s1 = 1;
        s1 += 1;  // 正确
        System.out.println(s1);  // 输出 2
    }
}

解释:

  • s1 += 1; 是复合赋值操作符,它等价于 s1 = (short) (s1 + 1);
  • 复合赋值操作符会自动进行隐式类型转换,不需要手动转换类型。
  • 因此,这个语句可以正确编译,并且执行结果是 s1 被加 1。

详细解释:

类型提升规则:

在表达式计算中,Java 会对较小的整型数据类型(byteshortchar)进行类型提升。提升规则是:

  • 如果操作数中有一个是 double,另一个会被提升为 double
  • 如果操作数中有一个是 float,另一个会被提升为 float
  • 如果操作数中有一个是 long,另一个会被提升为 long
  • 否则,两个操作数都将被提升为 int

示例:

public class TypePromotion {
    public static void main(String[] args) {
        short s1 = 1;
        // s1 = s1 + 1;  // 错误,s1 + 1 会被提升为 int 类型

        short s2 = 1;
        s2 += 1;  // 正确,等价于 s2 = (short) (s2 + 1)
        
        // 输出结果
        System.out.println("s2: " + s2);  // 输出 2
    }
}

s1 = s1 + 1; 中,s1 + 1 的结果是 int 类型,而在 s2 += 1; 中,+= 操作符会自动进行类型转换,使得编译器可以接受。

标签:short,int,s2,s1,public,类型,什么
From: https://www.cnblogs.com/Stars-125/p/18253299

相关文章

  • 一行Python代码可以做什么,超出你想象
    哈喽,大家好,我是木头左!揭秘编程语言的灵活性在编程的世界里,简洁就是力量。Python以其优雅和简洁而著称,让开发者能够用更少的代码做更多的事。但这并不意味着功能上的妥协——Python的强大之处在于它允许在一行代码中执行多个语句,这不仅能提高的编码效率,还能使代码更加紧凑和易......
  • 计算机网络 — 为什么要有运输层(传输层)
    目录IP协议能够把源主机发送的分组,按照首部中的目的地址,交由目的主机,那为什么还需要运输层呢?IP协议能够把源主机发送的分组,按照首部中的目的地址,交由目的主机,那为什么还需要运输层呢?从IP层来说,通信的两端是两台主机,但严格的说,是主机中的一个进程和另......
  • 我为什么要转行做大模型?
    前言最近研究了一下大模型相关的内容,决定从互联网的推荐算法转行做大模型推理工程化相关的工作。所以简单说说我在这个决定中的思考过程。1.推荐算法岗的现状我本来是一个在大厂做推荐算法的工程师。收入在行业里面算是中游水平,就这么一直干着似乎也没什么问题。但......
  • Postman是什么?Postman的主要功能有哪些?
    1.Postman是一款广泛使用的API(应用程序编程接口)开发和测试工具。它提供了一个用户友好的图形界面,让开发者可以轻松构建、测试、调试和文档化API。以下是Postman的一些关键特点:多类型请求支持:Postman支持多种HTTP请求方法,包括GET、POST、PUT、DELETE等。参数化和环境:允许用......
  • Sass和传统CSS有什么区别?
    Sass(SyntacticallyAwesomeStylesheets)与传统CSS在功能和语法上有一些显著的区别。以下是Sass相比传统CSS的一些关键优势和区别:变量(Variables):Sass允许使用变量存储信息,如颜色、字体大小等,以便在样式表中重复使用。这在传统CSS中是不可能的。$primary-color:#3498db;$......
  • 什么是Web3.0,和区块链又有什么关系?
    又是一个莫名其妙的词语的新起-。-我大致归纳为以下几个点什么是web3.0Web3.0(Web3)是下一代互联网的发展方向,旨在创建一个更加去中心化、用户控制和数据保护的网络环境。与之前的Web1.0(静态网页)和Web2.0(动态、交互式网页和社交媒体)不同,Web3.0的核心理念和技术包括以下几个方......
  • PCIe BAR空间的值是谁设置的?谁分配的,什么时间分配的?
    Linux系统下PCIe总线、设备的枚举,资源的分配到底是哪里进行的?一直没搞太清楚,安装参考中的方法构建文件系统,编译内核,利用Qemu调试分析这个问题如下:内核代码是5.15.0-107-generic,工作环境是ubuntu22.04serverOS。Qemu虚拟机中的PCIe相关打印和对应函数如下[1.510805]P......
  • 什么是浅拷贝和深拷贝,如何用 js 代码实现?
    〇、简介和对比简介浅拷贝:只复制原始对象的第一层属性值。  如果属性值是值类型,将直接复制值,本值和副本变更互不影响;  如果是引用数据类型,则复制内存地址,因此原始对象和新对象的属性指向相同的内存地址,改变任一值,另一变量值也会同步变更。深拷贝:递归地复制原始对象的所......
  • 数据可视化在智慧物流中发挥了什么作用?
    数据可视化在智慧物流中发挥了至关重要的作用,成为优化物流管理、提升效率和改善客户体验的关键工具。在现代物流行业中,面对海量数据的挑战,数据可视化技术通过将复杂数据转化为直观的图表、图形和仪表盘,帮助企业和管理者更有效地理解、分析和利用信息,从而做出更明智的决策。首先,......
  • Windows11系统Win32_EncryptableVolume.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个Win32_EncryptableVolume.dll文件(挑选合适......