如果你使用Java的原始数字类型,加上布尔值,并将它与C ++等效类型进行比较,运算符有什么区别,例如优先级规则或位操作运算符的作用是什么?还是括号的影响?
问另一种方法,如果我使用Java表达式并尝试在C ++中编译并运行它,它是否总是编译并始终给出相同的结果?
答案 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