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