Hon*_*bec 3547 java casting operators variable-assignment assignment-operator
直到今天,我还以为:
i += j;
Run Code Online (Sandbox Code Playgroud)
只是一个捷径:
i = i + j;
Run Code Online (Sandbox Code Playgroud)
但是如果我们试试这个:
int i = 5;
long j = 8;
Run Code Online (Sandbox Code Playgroud)
然后i = i + j;
将不会编译但i += j;
将编译正常.
这是否意味着事实上i += j;
是这样的捷径
i = (type of i) (i + j)
?
Luk*_*der 2397
一如既往地提出这些问题,JLS就是答案.在本例中§15.26.2复合赋值运算符.提取物:
除了仅计算一次之外,表单的复合赋值表达式
E1 op= E2
等效于E1 = (T)((E1) op (E2))
,whereT
的类型.E1
E1
§15.26.2引用的一个例子
[...]以下代码是正确的:
Run Code Online (Sandbox Code Playgroud)short x = 3; x += 4.6;
并且结果x的值为7,因为它相当于:
Run Code Online (Sandbox Code Playgroud)short x = 3; x = (short)(x + 4.6);
换句话说,你的假设是正确的.
Pet*_*rey 472
这个演员的一个很好的例子是使用*=或/ =
byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57
Run Code Online (Sandbox Code Playgroud)
要么
byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40
Run Code Online (Sandbox Code Playgroud)
要么
char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'
Run Code Online (Sandbox Code Playgroud)
要么
char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'
Run Code Online (Sandbox Code Playgroud)
Thi*_*ler 246
非常好的问题.在Java语言规范确认您的建议.
例如,以下代码是正确的:
Run Code Online (Sandbox Code Playgroud)short x = 3; x += 4.6;
并且结果x的值为7,因为它相当于:
Run Code Online (Sandbox Code Playgroud)short x = 3; x = (short)(x + 4.6);
Ume*_*thi 179
是,
基本上我们写的时候
i += l;
Run Code Online (Sandbox Code Playgroud)
编译器将其转换为
i = (int)(i + l);
Run Code Online (Sandbox Code Playgroud)
我刚检查了.class
文件代码.
真的是一件好事
dku*_*mar 90
你需要从浇铸long
到int
explicitly
在的情况下,i = i + l
那么它会编译并给出正确的输出.喜欢
i = i + (int)l;
Run Code Online (Sandbox Code Playgroud)
要么
i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.
Run Code Online (Sandbox Code Playgroud)
但是如果+=
它只是工作正常,因为运算符隐式执行从右变量类型到左变量类型的类型转换,所以不需要显式转换.
Din*_*108 61
这里的问题涉及类型铸造.
当你添加int和long时,
但是+=
它的编码方式使它能够进行类型转换.i=(int)(i+m)
tin*_*iry 52
在Java类型中,当赋值操作右侧的表达式类型可以安全地提升为赋值左侧的变量类型时,将自动执行转换.因此我们可以安全地分配:
byte -> short -> int -> long -> float -> double.
反之亦然.例如,我们不能自动将long转换为int,因为第一个需要比第二个更多的存储,因此信息可能会丢失.要强制执行此类转换,我们必须执行显式转换.
类型 - 转换
Sto*_*fan 44
有时候,可以在面试时询问这样的问题.
例如,当你写:
int a = 2;
long b = 3;
a = a + b;
Run Code Online (Sandbox Code Playgroud)
没有自动类型转换.在C++中,编译上面的代码不会有任何错误,但在Java中你会得到类似的东西Incompatible type exception
.
所以要避免它,你必须编写如下代码:
int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting
Run Code Online (Sandbox Code Playgroud)
小智 22
主要区别在于,a = a + b
没有进行类型转换,因此编译器因为没有进行类型转换而对你生气.但是a += b
,它真正做的是b
对类型兼容的类型进行类型转换a
.所以,如果你这样做
int a=5;
long b=10;
a+=b;
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)
你真正在做的是:
int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)
小智 12
这里微妙点......
对于i+j
when j
是double并且i
是int,存在隐式类型转换.Java ALWAYS在它们之间有操作时将整数转换为double.
澄清i+=j
哪里i
是整数并且j
是双精度可以描述为
i = <int>(<double>i + j)
Run Code Online (Sandbox Code Playgroud)
请参阅:隐式转换的此描述
您可能要强制转换j
到(int)
在这种情况下,为了清晰.
Java 语言规范定义E1 op= E2
等效于E1 = (T) ((E1) op (E2))
whereT
是一种类型E1
并且E1
被评估一次。
这是一个技术性的答案,但您可能想知道为什么会这样。好吧,让我们考虑以下程序。
public class PlusEquals {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
a = a + b;
System.out.println(a);
}
}
Run Code Online (Sandbox Code Playgroud)
这个程序打印什么?
你猜到3了吗?太糟糕了,这个程序不会编译。为什么?好吧,碰巧 Java 中的字节相加被定义为返回一个int
. 我相信这是因为 Java 虚拟机没有定义字节操作来保存字节码(毕竟数量有限),而是使用整数操作是一种语言中公开的实现细节。
但是如果a = a + b
不起作用,那将意味着a += b
如果它E1 += E2
被定义为E1 = E1 + E2
. 正如前面的例子所示,情况确实如此。作为使+=
操作符为字节和短裤工作的技巧,涉及到隐式转换。这不是什么了不起的黑客,但在 Java 1.0 工作期间,重点是让语言发布开始。现在,由于向后兼容,Java 1.0 中引入的这个 hack 无法删除。