为什么以下是有效的
byte i=0;
i++;
Run Code Online (Sandbox Code Playgroud)
其中以下内容无效
byte i=0;
i=i+1;
Run Code Online (Sandbox Code Playgroud)
会是什么原因?
我知道在i+1整个值明确增加1(这将是int值)的情况下,i++因此将发生编译问题,但是如果它做同样但没有得到任何错误.
每当您在不同类型的两个操作数之间执行二元运算时,其中一个操作数就会提升为更高类型。然后运算的结果就是这个类型。
\n\n因此,在您的情况下,byte类型 a 首先提升为 an int,因为1是一种int类型。然后进行加法运算后,结果为 类型int。现在,由于您无法将 an 分配int给 a byte,因此您需要进行类型转换以消除编译器错误:
byte a = 2;\na = a + 1; // Error: Cannot assign an int value to byte\na = (byte)(a + 1); // OK\nRun Code Online (Sandbox Code Playgroud)\n\n现在,对于复合赋值运算符,类型转换是隐式为您完成的。表达方式:
\n\na += 1\nRun Code Online (Sandbox Code Playgroud)\n\n内部转换为:
\n\na = (byte)(a + 1);\nRun Code Online (Sandbox Code Playgroud)\n\n这是在 JLS - \xc2\xa715.26.2 复合赋值运算符中指定的:
\n\nA compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.
前缀增量运算符和后缀增量运算符的情况类似。
\n\n根据 JLS - \xc2\xa715.15 一元运算符:
\n\nThe type of the prefix increment expression is the type of the variable.