Java和C ++运算符之间有什么区别吗?
如果你使用Java的原始数字类型,加上布尔值,并将它与C ++等效类型进行比较,那么运算符有什么区别,例如优先级规则或位操作运算符的作用是什么? 还是括号的影响?
问另一种方法,如果我使用Java表达式并尝试在C ++中编译并运行它,它是否总是编译并始终给出相同的结果?
-
对于像这样的表达式:
a = foo() + bar();
在Java中,评估顺序是明确定义的(从左到右)。 C ++没有指定是先评估
foo()
还是bar()
。 -
像:
i = i++;
在C ++中未定义,但在Java中再次定义良好。
-
在C ++中,对负数执行右移是实现定义/未定义的; 而在Java中它是明确定义的。
-
另外,在C ++中,运算符
&
,|
和^
是纯粹的按位运算符。 在Java中,它们可以是按位或逻辑运算符,具体取决于上下文。
Java更多地指定了表达式的评估顺序而不是C ++,如果表达式的任何合法评估顺序在序列点之间两次修改对象,则C ++表示您会得到未定义的行为。
因此, i++ + i++
在Java中定义良好,但在C ++中具有未定义的行为(无需诊断)。 因此,您不能盲目地将表达式从Java复制到C ++。
对于按位运算符,Java指定负数的二进制补码表示,而C ++则不指定。 并不是说您可能在C ++中遇到另一种表示forms,但如果您这样做,那么您会发现例如-2 | 1
-2 | 1
在Java中始终为-1
,但在使用1s补码的C ++实现中为-2
。
我认为C ++和Java之间的运算符优先级是一致的,并且表达式是确定性的,然后它应该以相同的方式进行评估。
右移运算符>>
是不同的。 在Java中,它始终是算术移位,即它将符号位复制到最左边的位,而在C ++中,它是实现定义的,无论是算术移位还是逻辑移位。 您可以使用>>>
在Java中获得逻辑转换,这在C ++中是不存在的。
必须有很多不同,因为在Java中几乎所有数字类型都是签名的。 阅读Java Puzzlers一书和Java语言规范,了解所有细微差别。
看到这个:
int a = 0;
int b =(a ++)+(a);
如果你打印b
然后它将在C ++中输出0
而在Java中输出1