数据值和类型

时间:2011-12-28 16:01:44

标签: java variables types

假设:

int x = 10;
double d = -3.0;
boolean f = false;

1

为什么在将它作为int转换之后,以下内容仍为double ...对于第二个,为什么在定义为long时输出float?:

(int) d / 2.0
(long) d * 2f

2

为什么以下第一个打印字符串(?),后者打印一个数字?

"2" + x + 2
"3" + 3 * x

但是以下内容出现错误:

"5" + i + 2

第3

此外,随后,实际发生了什么,结果是什么?

d++ + d

4

当使用Math.round时,为什么将下面的double转换为float,或者它们是同一个东西?

Math.round(x / d)

4 个答案:

答案 0 :(得分:2)

<强> 1

此:

(int) d / 2.0

与此相同:

((int) d) / 2.0

也许你是这个意思?

(int)(d / 2.0)

<强> 2

他们都“打印”字符串(假设您正在讨论将它们用作System.out.println的参数)。

这些:

"2" + x + 2
"3" + 3 * x

与以下内容相同:

("2" + x) + 2
"3" + (3 * x)

与这些相同(假设x = 10):

("2" + 10) + 2
"3" + 30

与这些相同:

"2102"
"330"

第3

我不记得这里应该发生什么。但是你永远不需要/想要编写这样的代码,所以没关系!

<强> 4

Math.round的返回类型是整数类型,而不是浮点类型。

答案 1 :(得分:1)

(int) d / 2.0
(long) d * 2f

你仍然使用浮点数学,即一个操作数仍然是double / float,因此结果是double / float。

"2" + x + 2
"3" + 3 * x

第一个只是连接,即表达式的类型是String,因此所有操作数都转换为字符串。对于x=1,您需要"212"

第二个是操作符优先级,即在*之前计算+,因此表达式3 * x是一个整数数学运算,其结果将由{转换为字符串} {1}}。

"3" + result

错误在于您的代码,发布异常。很可能"5" + i + 2 未定义。

i

查看运算符优先级和后增量运算符。 d++ + d 将返回x++的值,然后递增它。然后,x的先前值将添加到新值。您可以认为它与x类似。

  

使用Math.round时,为什么将下面的double转换成浮点数,或者它们是否相同?

  Math.round(x / d)

没有转换,只是一个重载的方法(一个采取双倍,一个采取浮动)。基本上x + (x+1)的精度低于float,但两者都是浮点数。

答案 2 :(得分:1)

为什么在将它作为int转换之后,以下内容仍为double ...对于第二个,为什么在定义为long时输出float?:

(int) d / 2.0
(long) d * 2f

因为广告(int)运算符的优先级高于/*运算符。 你应该这样读:

((int) d) / 2.0

((long) d) * 2f

为什么以下第一个打印字符串(?),后者打印一个数字?

"2" + x + 2
"3" + 3 * x

我认为在两种情况下都是字符串,你必须“读取”这样的表达式:

("2" + x) + 2
"3" + (3 * x)

但是以下内容出现错误:

"5" + i + 2

错误是什么?

此外,通过以下内容,实际发生了什么以及结果是什么?

d++ + d

这是一系列行动:

  1. tmp = d
  2. d = d + 1
  3. return tmp + d
  4. 当使用Math.round时,为什么将下面的double转换为float,或者它们是同一个东西?

    Math.round(x / d)
    

    它会转换为long,因为Math.round(double)的返回类型为long

答案 3 :(得分:0)

一个问题太多了。

  • 您正在转换操作数,而不是表达式,并且将提升类型。
  • 他们实际印刷什么,你如何区分他们的类型?查看Java operator precedence
  • 因为没有i
  • 您可以打印结果。

Conversions and Promotions JLS section也可能有所帮助;你的很多问题都在那里得到解答。