Java 解释为什么同一代码中存在差异

Java 解释为什么同一代码中存在差异,java,c,Java,C,我的代码是: code(){ int x=7; x=x++; output x; //prints 8 in C, prints 7 in Java } 上面的代码:用C打印8,用Java打印7 为什么会这样?请解释。将用Java打印7。x=x++;相当于: int temp = x; x = x + 1; x = temp; 如果使用前缀运算符(++x),结果会有所不同 你自己看看这里: 阅读以理解C中的输出。在Java中,x=x++,计算结果如下: i

我的代码是:

 code(){
    int x=7;
    x=x++;
    output x;   //prints 8 in C, prints 7 in Java
 }
上面的代码:用C打印8,用Java打印7

为什么会这样?请解释。

将用Java打印7。x=x++;相当于:

int temp = x;
x = x + 1;  
x = temp;
如果使用前缀运算符(++x),结果会有所不同

你自己看看这里:

阅读以理解C中的输出。

在Java中,x=x++,计算结果如下:

int temp = x;
x = x + 1;
x = temp;
所以,在这个表达式之后,x基本上没有变化


然而,在C语言中,这个表达式是一个。另请参见

此代码在C中导致未定义的行为,因此结果可能是任何、7、8、15或页面错误。为什么这段代码给出7,是编译器的问题。

在Java背景中,i=i++语句会出现如下情况:

int temp = i; // store current value of i  
i = i + 1; // increase i because of i++  
i = temp; // assign to i  

这是因为运算符优先级在C中的优先级高于Java

x=x++;

这会在C中给出任意结果,主要取决于编译器。阅读C语言中的顺序点。你可以参考丹尼斯·里奇的C语言编程。

我想你想说C语言中的8?^是的,对不起,我是说that@anonymous好的,然后读我对Rohit答案的评论。错。这是用Java打印的7。所有的先例都是一样的。在C语言中,它是特定于编译器的,即未定义的,而在Java语言中,它是在语言规范rhs中定义的,在分配给lhs之前,包括副作用都被完全避免了。@MarkoTopolnik感谢Ideone的证明。先生,我已经运行了这段代码。。我已经看到了这种解释,但为什么这种行为在C中有所不同/@anonymous也一样。@anonymous,请阅读:@anonymous。这种行为在C中没有定义。它可以根据不同的编译器和环境提供不同的输出。他的意思可能是说他的C代码打印8,这是因为在他的编译器中:x=x++;喙状分为两部分:x=x;那么x=x+1;因为++。但是是的,它的编译器依赖于C@GrijeshChauhan。嗯,是的。这就是我在回答中写的。我没有提到C语言中的输出,因为它是未定义的。在Java中,保证是7,而OP说是8。再次检查OP在Java中说是7,但在C中他得到了8。@GrijeshChauhan。啊!!我想他改变了。