java - 为什么相同的代码在 Java 中的工作方式不同?

标签 java c

我用 java 和 C 编写了以下代码。但是这些程序的输出是不同的。 Java应用给了21,C应用给了22(我用的是GCC编译器)。

你能描述一下吗?

这是JAVA代码。

class test
{

    public static void main(String args[])
    {
        int a =5;
        int b = (++a) + (++a) + (++a);
        System.out.println(b);
    }

}

这是 C 代码。

#include <stdio.h>

int main( int argc, const char* argv[] )
{
int a =5;
int b = (++a) + (++a) + (++a);
printf("%d \n",b);
}

最佳答案

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

这是 undefined behavior在 C 中,这意味着它可以输出 21、22、42,它可以崩溃或做任何它想做的事情。这是 UB,因为标量对象的值在同一表达式中多次更改而无需干预 sequence points

行为是用Java定义的,因为它有更多的序列点。 Here's an explanatory link

关于java - 为什么相同的代码在 Java 中的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5244607/

相关文章:

c - scanf 和 fgets 的问题

C - 尝试在 linux 中构建一个简单的 shell 并在循环中使用 strtok、realloc 时遇到问题

java - 打印输出从 arraylist 接收到的下拉列表中的值

java - 尝试使用 selenium webdriver 和 java 处理多个浏览器窗口时出现 java.util.NoSuchElementException

java - Wicket 中的嵌套表单 : form "breaks"

c - 互斥操作函数参数应该是 `volatile` 吗?

c - 尝试用C实现动态大小矩阵。错误在哪里?

ios - 从 objective-c 生成 key 并使用 OpenSSL 签名创建 CSR

java - Weld/CDI 的最佳调试技巧是什么?

java - UnsupportedOperationException : Use MenuItemCompat. setOnActionExpandListener()