问题1
简而言之,出现不同值是由于不同的编译器编译出的执行代码计算顺序不同所致。
但编译器也不是能恣意妄为的,需要符合一定规范。Java编译器的规范是JSR901--Java Language Specification。C/C++的规范分别是ISO/IEC9899(最近的版本是99年的,常称C99)和ISO/IEC14882(最近的是2003勘误版,2007好像有个草案)。
我觉得ISO/IEC9899在6.5节(99版)中对于C中这种顺序的未定义说的最简洁:"The grouping of operators and operands is indicated by the syntax ...the order of evaluation
of subexpressions and the order in which side effects take place are both unspecified." ISO/IEC14882也在第5章(2003版)中做了类似的“未定义说明”。相反Java规范在15.7(第三版)节对计算顺序做了明确规定,简而言之消除了副作用在不同的计算顺序下产生不同的值。