在一个序列点内, 同时出现有副作用的状况, 在c语言中是 未定义的行为.
也就是说,不同的编译器 可以 根据不同的顺序去算.
真正明智的 初学者最好不要 对未定义的行为 刨根问底, c语言之父说过: 这种无知, 恰好能够保护你.
也就是说, 我们不知道这个顺序的话, 不这样写就行了.
有涵养的程序员, 一定要有一个最基本的认知:
程序 绝对不能依赖 未定义行为.
可惜国内很多教科书 都没有意识到. 我在大学 课本是 <谭浩强>的那本, 第4版. 后面的 练习题 都有这种....
唉......
不信你可以试试: 微软的编译器, 和 gcc 编译出来的结果, 肯定不一样.
没有对错,
编译器怎么实现都是对的.
然而,
对于我们程序员来说, 假设正确答案是几 都是错的.
算是一个前者对于初学者的忠告.
希望能帮助更多的初学者...
-----------------------------------------
下面是证明给 另外一个回复者的, 他说 不管哪个编译器 都是 12( 不知道他测了几个编译器)
源码:
用 gcc 编译, 没有提示错误. 但结果是 13
而用 clang 编译器(苹果的)的话,
直接提示你 一个序列点内多处修改... (c语言中的 未定义行为)
结果也是13
这道题的计算顺序和++本身没关系,顺序从左到右,x++, ++x, x++
y = 3 + (++x)+(x++) // x = 4
y = 3 + 4 + (x++) // x = 5
y = 3 + 4 + 5// x = 6
结果y = 12
$v=10;
echo $v + ++$v + $v++ +$v;
php编辑器输出45
var i=10;
document.write(i+(++i)+(i++)+i);
js中输出44 我就很纳闷原来不通编辑器同样的代码结果也不一样教科书坑爹啊
这个由编译器决定,C语言没有明确说明