2

下面的变量(称为 b)是否可以称为表达式,如果它是唯一位于等号右侧的变量?

// This code fragment will not compile.
// c is a char, and b is a byte.

c = b;

我之所以问这个问题是因为表达式中的类型提升这个话题。我了解 Java 将所有字节提升为整数。这是该代码片段无法编译的唯一原因吗?(请注意,我知道演员表;这不是这个线程的重点。非常感谢。)

编辑: 非常感谢乔恩和彼得。使用第二个示例查看此主题:

byte b = 1;
short s = 2;

s = b;  // OK
s = b*2;  // Not OK (compilation error)

以下情况是真的吗?

(第 3 行)Java 将字节转换为短字节。(第 4 行)Java 将表达式 b*2 转换为 int。

如果这是正确的,那么似乎 =b; 和=b*2;是 Java 以不同方式处理的“表达式”。所以,=b; “表达式”不会转换为 int,而是扩展为 short。但是 =b*2; 表达式被转换为一个 int,而不是一个 short,即使名为 s 的目标变量是一个 short。

编辑2: 另外 -

short s1, s2 = 2, s3 = 2;
s1 = s2*s3;  // Not OK (compilation error)

尽管所有三个变量都是短裤,但 s2*s3; 表达式被提升为 int,从而导致编译错误。

4

2 回答 2

5

试试这个

byte b = -1;
short s = b; // is ok as a byte can be promoted to an short.
int i = b; // is ok as a byte can be promoted to an int.
float f = b; // is ok as a byte can be promoted to an float, long or double.

char c = b; // won't compile

final byte b = 1;
char c = b; // compiles fine as the compiler can inline the value.

在这种情况下

short s = b*2;  // Not OK (compilation error)

b * 2 是int一个2int。如果b是最终的,您将能够做到这一点,因为编译可以内联该值。

于 2013-11-01T09:04:13.503 回答
1

下面的变量(称为 b)是否可以称为表达式,如果它是唯一位于等号右侧的变量?

是的,一点没错。

我了解 Java 将所有字节提升为整数。

好吧,在某些情况下。并非在所有情况下。

从根本上说,代码不会编译,因为没有从byteto的隐式转换char。从JLS 的第 5.1.2 节(扩大原语转换):

原始类型的 19 种特定转换称为扩展原始类型转换:

  • byteshort, int, long, float, 或double
  • ...

请注意目标类型列表中缺少charbyte.

于 2013-11-01T09:05:10.243 回答