【问题标题】:Is there any difference between the Java and C++ operators?Java 和 C++ 运算符之间有什么区别吗?
【发布时间】:2011-07-08 11:41:36
【问题描述】:

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

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

【问题讨论】:

  • 我认为当你投射 ie (int) 时会发生一些不同的事情。我似乎记得您可能会遇到在 C 中不会遇到的编译错误。
  • 我不确定我是否理解你。您的意思是在 C 中编译的东西在 Java 中没有?那对我来说没问题。但反之亦然。
  • 是的,Java 强制不允许在 C 中编译某些东西。我试图弄清楚昨晚是什么......该死的我的记忆。

标签: java c++ operators


【解决方案1】:
  • 对于这样的表达式:

    a = foo() + bar();
    

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

  • 类似的东西:

    i = i++;
    

    在 C++ 中未定义,但在 Java 中再次定义良好。

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

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

【讨论】:

  • @Lazarus:你说得对,副作用(这是我所考虑的)有点超出了问题的范围。当然,除非foo 的副作用会影响bar 的结果,反之亦然。
  • @Lazarus:就后增量而言,C++ 以sequence points 的形式工作。 i有两处修改,但没有中间序列点,所以结果未定义。
  • 关于序列点的有趣文章,但让我们面对现实吧,你的后增量语句不仅仅是一个边缘情况,它是一个边缘情况;)
【解决方案2】:

Java 比 C++ 对表达式求值顺序的规定更多,而 C++ 表示,如果表达式的任何合法求值顺序在序列点之间修改了两次对象,则会得到未定义的行为。 /p>

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

对于位运算符,Java 指定负数的补码表示,而 C++ 没有。并不是说您可能在 C++ 中遇到另一种表示,但是如果您遇到了,那么您会发现例如 -2 | 1 在 Java 中始终是 -1,但在 C++ 中是 -2使用 1 的补码实现。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 同意,在 Java 中有我不熟悉的位运算符,但提供 >> 被翻译为 >>> 仅涉及原语的表达式中运算符的优先级(如OP)肯定仍然相当一致(假设实现遵循规范)。
    【解决方案4】:

    右移运算符>> 不同。在 Java 中,它始终是算术移位,即将符号位复制到最左边的位,而在 C++ 中,它是由实现定义的,是算术移位还是逻辑移位。您可以使用 >>> 在 Java 中进行逻辑转换,这在 C++ 中不存在。

    【讨论】:

    • 实现定义是指每个编译器还是每个操作系统?如果我在 Windows 上测试 gcc,它会在 Linux 上使用相同的词吗?或者我也不能依赖它?
    • 您只需要阅读编译器的文档。大多数现代编译器都会为您提供有符号整数的算术右移,因此如果 gcc 在 Windows 和 Linux 上的行为不同,我会感到惊讶,但您只需阅读文档即可确定。
    【解决方案5】:

    看这个:

    int a = 0;

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

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

    【讨论】:

      【解决方案6】:

      肯定有很多不同,因为在 Java 中几乎所有的数字类型都是有符号的。阅读 Java Puzzlers 书籍和 Java 语言规范以了解所有细微差别。

      【讨论】:

        猜你喜欢
        • 2011-10-09
        • 2012-12-16
        • 2021-12-23
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 2011-05-13
        • 2011-01-02
        相关资源
        最近更新 更多