【问题标题】:Difference Between i = i+1 & i++i = i+1 和 i++ 之间的区别
【发布时间】:2015-04-07 11:44:42
【问题描述】:

谁能解决我的困惑,这是我的代码:

byte i = 0;

i++;
System.out.println(i);

结果:1

byte i = 0;

i = i+1;
System.out.println(i);

生成编译时错误:类型不匹配:无法从 int 转换为 byte

当我将其转换为字节时:i = (byte) (i+1); 然后很高兴得到结果 1

执行这个例子我明白 i = i+1 & i++ 执行不能相同的操作,所以现在我想知道它们之间到底有什么区别......!!!

【问题讨论】:

  • 在进行增量时会发生隐式转换。所以最后两者都是相同的。
  • 我认为你应该把学习的重点放在原始数据类型 byteint 之间的区别上——以及它们之间的转换。

标签: java casting operators


【解决方案1】:

i++i+=1 将结果隐式转换回 i 的类型。

所以如果ibyte,那么i++; 等同于i = i + 1; - 它实际上等同于i = (byte)(i + 1);

来自 Java 语言规范,section 15.14.2,强调我的:

... 值 1 被添加到变量的值中,并且总和被存储回变量中。在加法之前,对值 1 和变量的值执行二进制数字提升(第 5.6.2 节)。 如有必要,总和会通过缩小原语转换 (§5.1.3) 和/或进行装箱转换 (§5.1.7) 缩小到变量的类型存储

除了“因为规范是这样说的”之外,没有根本原因。编写规范的人很可能以这种方式编写规范,以便 ++ 对所有数字类型都有用(不仅仅是 intlong)。

【讨论】:

  • @DhruvRaval 你知道i = i + 1i = (byte)(i + 1) 的区别吗?
【解决方案2】:

对于 short、char、byte 和 int 数据类型,如果执行任何算术运算,编译器会将数据类型升级为 int 并执行该操作。编译器会将表达式结果值的数据类型改为int

所以对于字节 i

i = i+1; // will not work

因为i+1 将产生一个整数数据类型值。所以你必须在外部进行类型转换为

i = (byte)(i+1); // this is equivalent to i +=1; or you can say i++;

【讨论】:

  • @Jägermeister:老兄添加两个字节值并在字节变量中赋值,然后看看。
  • @Jägermeister 不,那是不正确。两个bytes 相加的结果是inttry it and see
  • @Jägermeister :根据您的说法byte b=0;byte c=0; byte d=b+c; 这应该可以吗?但它不起作用,因为结果是一个 int。
  • @Jägermeister 这称为二进制数字提升:docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
  • 我认为这是因为您错过了括号。 i = (byte)(i + 1);
【解决方案3】:

最后我发现我的问题(问题)更好理解,所以在这里描述它以轻松理解其他人..!!!

1> i = i + 1

在java中,只要在两个或多个变量之间执行任何算术运算,那么它的返回值的类型就取决于这个等式:

返回值类型 = (int, VARIABLE-1 的最大范围,最大范围 变量-N)

这里,返回值类型:int

对于方程 (int, byte, byte) 所以 int 有最大范围..

byte -> 1 字节大小 & int -> 4 字节大小

这就是为什么上面的 exe 我不能直接将返回值存储在字节中,它需要 外部类型转换 i = (byte) (i+1)

2> i++

在java中,每当递增和递减操作像这样执行时,它的返回值类型取决于这个等式:

返回值类型 =(变量类型,值 + 1)

这些等式表示内部类型转换在这种情况下执行

必须记住:

案例 1如果需要,需要外部类型转换

案例 2自动执行内部类型转换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2016-06-29
    • 2021-12-21
    • 1970-01-01
    • 2021-05-03
    • 2013-05-06
    相关资源
    最近更新 更多