class abc
{
public static void main(String[] arg)
{
int a = 1, b = 3;
int d;
a++;
a++;
d=a+b;
System.out.println(d);
double c;
c = Math.IEEEremainder(0.9,0.5);
System.out.println("Math.IEEEremainder(0.9,0.5)");
System.out.println("IEEEremainder: "+c);
}
}
回答你的3个问题:
1)
因为 a++++ 是不合法的写法。我想Java
的这样设置完全合理,可以让那些无聊的老师不要再来出这种问题,即便在C++中,这种写法也是绝对不可取的,因为
某个变量的++++的结果不取决于语言本身而是取决于操作系统,所以所得结果将不经相同。既然这样,Java干脆取消了这种写法的合法性。
2)
Java
中的类型转换有隐式转换和强制转换,这是一贯的理解,大多书上的解释如下:
隐式转换:
对于一元运算符(比如++, 或--), byte 类型的操作数或short 类型的操作数被转换成 int 类型,而其他的类型保持不变.
对于二元运算符,
对于只包含整数类型的操作数,如果其中一个操作数是long, 那么其他的操作数也要转换成long 类型, 否则所有的操作数都被转换成 int
类型.表达式的结果是 int 类型,除非是产生的值非常大才使用 long
类型.
对于至少有一个是浮点类型操作数的情况,如果表达式中有一个操作数是 double 类型的,那么另一个操作数需要转换为 double 类型,
并且计算结果也是 double 类型的, 否则两个操作数被转换成 float 类型,并且结果也是float 类型的.
强制转换:
强制运算符是由括在括号里的类型名构成的. 他是放在操作数前面具有较高优先级的一元运算符,其结果是得到具有由强制指定的类型的变量,并具有原来对象的值.
但是我们来看下面的一段程序:
class abc
{
public static void main(String[] arg)
{
double test = 9.6;
int a = test;
// error
a = test/3;
// error
System.out.println("a: "+a);
}
}
大家编译以后看看结果是什么, 我用的是JDK 1.5 在Dos下编译, 结果是不能通过, 那么是否能够说, Java
语言的机制有了改变, 由原来的隐式转换被允许到现在的不被允许了呢? 我个人认为是的, 我不觉得隐式转换有什么意义.
反而是一种隐患. 这种隐患便是数据失真,这种数据失真在大的程序中,由于不是语法,语义上错误,往往在程序在运行期才能发现,而即便发现也很难查找错
误的源头.
要实现类型转换必须强制转换,这也是为了保证消除由于程序中的疏忽而导致数据失真的问题。C++中是允许类型自动转换的。但这也使得
程序具有潜在的隐患。
通过对强制转换的要求, 便能杜绝这种数据失真。
3)那段代码在我这里可以编译也可以运行,不过没有那两句注释行。
[此贴子已经被作者于2005-9-10 1:59:40编辑过]