2011-10-17 33 views
5

考虑:为什么输出的不同之处C和Java表达式M + + +(++米)

int m = 2, n; 

n = m++ + (++m); 

在C输出是:

m = 4, n = 4; 

在Java输出是:

m = 4, n = 5; 

这是怎么发生的?

+0

你使用哪种编译器?相同的代码为我提供了m = 4和n = 6(Visusal Studio 2010) –

+0

这是因为您无法在没有序列点的语句中两次更改同一个变量。这会导致C中的未定义行为。 – Dani

+0

我正在使用gcc。 – phoxis

回答

9

它可以不同,因为C不允许正确的程序包含这样的表达式 - C没有定义这样的程序的行为。这给C编译器在如何解释这些表达式方面提供了很大的自由度。

Java通过定义像这样的表达式的预期行为来更紧密地约束实现。

(这在C中断裂的规则是表达式可能不会在没有插入序列点的情况下多次修改对象的值)。

+1

“C不允许正确的程序包含这样的表达式。”是的,它确实;它只是没有指定它的行为。不是一回事。 – EJP

+0

@EJP:这样的程序不正确。 – caf

+0

如果这样的程序不正确,编译器不应该编译它。 – EJP

相关问题