数据值和类型
考虑:数据值和类型
int x = 10;
double d = -3.0;
boolean f = false;
为什么下面仍然是一个双重它被强制转换为int后...对于第二个也是,为什么它输出float时定义为长?:
(int) d/2.0
(long) d * 2f
2.
为什么下面的第一个打印一个字符串(?),而后者是一个数字?
"2" + x + 2
"3" + 3 * x
但后来有一个与下面的错误:
"5" + i + 2
此外,在follwing,什么是真正发生的事情,结果是什么?
d++ + d
4.
当Math.round时,为什么不把它转换以下双成浮动,或者是他们同样的事情?
Math.round(x/d)
为什么在将它作为int类型转换后仍然是double类型?对于第二个类型,为什么在定义长类型时会输出一个float类型?:
(int) d/2.0
(long) d * 2f
由于投(int)
操作的优先级高于/
和*
运营商。 你应该这样阅读:
((int) d)/2.0
((long) d) * 2f
为什么第一以下打印字符串,而后者的数字(?)?
"2" + x + 2
"3" + 3 * x
我认为这是两个casesm字符串必须 “阅读” 这一表述是这样的:
("2" + x) + 2
"3" + (3 * x)
但后来有一个与下面的错误:
"5" + i + 2
什么是错误?
此外,随着实际情况的发生和结果如何?
d++ + d
这是一系列的操作:
- TMP = d
- d = d + 1
- 返回TMP + d
当数学.round被使用,为什么它将下面的double转换为af憎恶,还是他们是同一件事?
Math.round(x/d)
将其转换为long
,因为Math.round(double)
返回类型为long
(int) d/2.0
(long) d * 2f
你还是浮点运算,即一个操作数仍然是一个双/浮动,因此,结果是双/浮动。
"2" + x + 2
"3" + 3 * x
第一也只是级联,即表达式的类型是String
因此,所有的操作数被转换成一个字符串。对于x=1
,你会得到"212"
。
第二个是受操作者precendence,即*
+
之前被评估,因此表达3 * x
是整数数学运算,其结果然后将通过"3" + result
被转换成一个字符串。
"5" + i + 2
错误在于你的代码,发布异常。最有可能的是i
是未定义的。
d++ + d
查看运算符优先级和后增量运算符。 x++
将返回x
的值,然后增加它。然后将以前的值x
添加到新值中。你可以认为它与x + (x+1)
相似。
当使用Math.round时,为什么它会将下面的double转换为float,还是它们是同一个东西?数学。
数学。round(x/d)
没有转换,只是一个重载的方法(一个取一个double,一个取一个float)。基本上float
比double
的精度要低,但都是浮点数。
此:
(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"
我不记得是什么应该发生在这里。但是你永远不需要/不想编写这样的代码,所以没关系!
4.
的Math.round
返回类型是整数类型,而不是一个浮点型。
其中一个问题太多。
- 您正在转换操作数,而不是表达式,并且类型将被提升。
- 他们实际打印什么,以及如何区分他们的类型?退房Java operator precedence。
- 因为没有
i
。 - 您可以打印结果。
Conversions and Promotions JLS section也可能有帮助;你的许多问题都在那里回答。
什么是'i'?... – 2011-12-28 16:05:02
这些都是很多不相关的问题,不使它成为一个伟大适合SO ... – 2011-12-28 16:05:31
第一个和第二个是运算符优先级(http://introcs.cs.princeton.edu/java/11precedence/),第三个是缺少的上下文(什么是“我”?)和最后一个: 去尝试一下。 – 2011-12-28 16:06:06