求教两个简单的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 20:34
monkerman 发表于 2013-4-26 08:59
唉......VC 的结果既然是这样, 我就给解释下吧.
首先从右往左:
++j 后 j 变成了 3, 注意前加操作是先自 ...

非常谢谢你用心的回答。想再麻烦问下“i, 当然也是 4, 因为 , 号不是序列点.”这句话怎么理解?
小德GD
2楼-- · 2020-02-01 23:40
takashiki 发表于 2013-4-26 09:34
又是一个深受谭浩强毒害的……你已经发现这个是坑了,为什么还要往里跳?C语言的陷阱防不胜防的。
主要原 ...

恩,受教了,谢谢
monkerman
3楼-- · 2020-02-02 01:11
本帖最后由 monkerman 于 2013-4-26 13:51 编辑
小德GD 发表于 2013-4-26 12:56
非常谢谢你用心的回答。想再麻烦问下“i, 当然也是 4, 因为 , 号不是序列点.”这句话怎么理解? ...


不客气. 我也只是恰好知道.
第一个 i 的值其实是第二个 i++ 的 i 值, 因为 VC 对后加操作的自增是在语句结束之后, 也就是分号. 所以还是 4, 逗号在这里并不被当作是序列点.
剩下的上面已经解释了. 你可以改一下, 然后再看结果. 多来几次可能就明白了. 强烈建议比看反汇编, 看到 incl 指令就明白了.
例如:
  1. printf("%d, %d, %d, %d", i++, i++, i += j++, ++j); // 看一下结果, 测试时可以这么写, 正式时千万别这么写, 会被骂的.
复制代码
significance201
4楼-- · 2020-02-02 06:06
看来是一个学生

一周热门 更多>