求教两个简单的C语言问题

2020-01-30 13:40发布

int main(void)
{
        int i=1;
        printf("%d,%d,%d",i,++i,i);
        return 0;
}
为什么结果是2,2,1?

int main(void)
{
        int i=1,j=2;
        printf("%d,%d,%d,%d",i,i++,i+=j,++j);
        return 0;
}
为什么结果是4,4,4,3?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
小德GD
1楼-- · 2020-02-01 04:30
 精彩回答 2  元偷偷看……
小德GD
2楼-- · 2020-02-01 05:59
zhugean 发表于 2013-4-25 12:27
从右到左的话第二个不应该是5443吗?

但用VC6.0测确实是4,4,4,3
yklstudent
3楼-- · 2020-02-01 10:41
吃饱了没事情干吗???
monkerman
4楼-- · 2020-02-01 11:42
小德GD 发表于 2013-4-26 00:46
但用VC6.0测确实是4,4,4,3
printf("%d,%d,%d,%d",i,i++,i+=j,++j);

唉......VC 的结果既然是这样, 我就给解释下吧.
首先从右往左:
++j 后 j 变成了 3, 注意前加操作是先自增后赋值.
i += j 后 i 变成了 1 + 3 = 4;
i++ 时, 由于后加操作是先赋值后自增, 所以, i 还是 4.
i, 当然也是 4, 因为 , 号不是序列点.

如果你用 GCC 的话, 结果会不一样, 他的前加后加操作有自己的理解和规定(不同版本可能也不一样).
            例如++j, i++都是在 i += j; 之前完成, 而且产生副作用. 这时 i+= j; 后 i 的值是 5. 第一个 i 也是 5.

如果你用 Borland-C++  结果可能又不一样. 别纠结了.
takashiki
5楼-- · 2020-02-01 16:00
小德GD 发表于 2013-4-26 00:46
但用VC6.0测确实是4,4,4,3

又是一个深受谭浩强毒害的……你已经发现这个是坑了,为什么还要往里跳?C语言的陷阱防不胜防的。
主要原因为未定义行为

第一个为什么结果是2,2,1?因为依赖编译器实现,结果还可以是2,2,2。把++放到i后面,你的结论还会更不同。第二个同理。不信请用VC Debug/Release模式分别都试试。
因此,我们要尽量避免编译器的未定义行为,进到坑了尽量绕道,别一脚踏进去了。
wangshumou
6楼-- · 2020-02-01 20:32
 精彩回答 2  元偷偷看……

一周热门 更多>