Java和C ++运算符之间有什么区别吗?

时间:2011-07-08 11:41:36

标签: java c++ operators

如果你使用Java的原始数字类型,加上布尔值,并将它与C ++等效类型进行比较,运算符有什么区别,例如优先级规则或位操作运算符的作用是什么?还是括号的影响?

问另一种方法,如果我使用Java表达式并尝试在C ++中编译并运行它,它是否总是编译并始终给出相同的结果?

6 个答案:

答案 0 :(得分:11)

  • 表达式如下:

    a = foo() + bar();
    

    在Java中,评估顺序是明确定义的(从左到右)。 C ++没有指定是先评估foo()还是bar()

  • 像:

    i = i++;
    

    在C ++中是未定义的,但在Java中也是如此明确定义。

  • 在C ++中,对负数执行右移是实现定义/未定义;而在Java中它是明确定义的。

  • 此外,在C ++中,运算符&|^是纯粹的按位运算符。在Java中,它们可以是按位或逻辑运算符,具体取决于上下文。

答案 1 :(得分:5)

Java指定了更多关于表达式的评估顺序而不是C ++,并且C ++表示如果任何的表达式的法律评估顺序在序列点之间修改对象两次,则会得到未定义的行为。< / p>

因此,i++ + i++在Java中定义良好,但在C ++中具有未定义的行为(无需诊断)。因此,您不能盲目地将表达式从Java复制到C ++。

对于按位运算符,Java指定负数的二进制补码表示,而C ++则不指定。并不是说你可能在C ++中遇到另一个表示,但是如果你这样做了,那么你会发现例如-2 | 1在Java中总是-1,但是{{ 1}}在使用1s'补码的C ++实现中。

答案 2 :(得分:2)

我认为运算符优先级在C ++和Java之间是一致的,并且如果表达式是确定性的,那么它应该以相同的方式进行评估。

答案 3 :(得分:1)

右移算子>>是不同的。在Java中,它总是算术移位,即它将符号位复制到最左边的位,而在C ++中,它是实现定义的,无论是算术移位还是逻辑移位。您可以使用>>>在Java中获得逻辑转换,这在C ++中是不存在的。

答案 4 :(得分:0)

必须有很多不同之处,因为在Java中,几乎所有数字类型都是经过签名的。阅读Java Puzzlers一书和Java语言规范,了解所有细微差别。

答案 5 :(得分:0)

见:

  

int a = 0;

     

int b =(a ++)+(a);

如果您打印b,那么它将在C ++中输出0而在Java中输出1