关于 C 语言 i++与++i 的问题

2015-08-24 10:43:24 +08:00
 speed

int a,b;

int i=10 , j=10;

a=(i++)+(i++)+(i++);

b=(++j )+(++j )+(++j );

a 与 b 的值,一直没搞明白!!!

3063 次点击
所在节点    问与答
33 条回复
abscon
2015-08-24 10:47:30 +08:00
建议帖主换 C 语言教材。

关注点不对
book1925
2015-08-24 10:48:41 +08:00
i++是运算完后 i 再+1 。
所以 a=10+10+10=30.
然后 i 再变为 11

++i 是运算之前 i 就已经+1 。
所以 b=11+11+11=33.
canautumn
2015-08-24 10:49:28 +08:00
Undefined Behavior
speed
2015-08-24 10:51:35 +08:00
这不是 C 教材上的,只是最近看了篇贴在由这个衍生到 2 个概念顺序点和副作用,所以一直没搞明白这题是怎么算的。。。
@abscon
speed
2015-08-24 10:53:26 +08:00
用 visual C++6.0 测下来 b 的值为 37
@book1925
RecursiveG
2015-08-24 10:54:16 +08:00
1. 不同的编译器会有不同的结果
2. 不要写这样的代码
3. 换教材 +1
4. 如果非要搞明白,搜“ Undefined Behavior ”
crab
2015-08-24 10:55:46 +08:00
钻牛角尖
kokdemo
2015-08-24 10:55:53 +08:00
@speed 我觉得意思是这样的,每次++j 的时候 j 都已经自增了……

所以 b = 11+12+13 = 36
多出来的 1 不知道哪里来的……
lingo233
2015-08-24 10:56:04 +08:00
看编译器,不知道会是什么。
b821025551b
2015-08-24 10:57:01 +08:00
这种谭浩强 style 的问题不需要去考虑
book1925
2015-08-24 11:00:41 +08:00
@speed
本人也比较才疏学浅,刚才的回答确实有问题,还是以其他有经验的人的回答为准吧
speed
2015-08-24 11:01:34 +08:00
VisaulC++6.0 则会先计算前两个 i 的值为 12 ,第三个 i 的值变成了加三次以后的值为 13 ,因此结果是 12+12+13=37 。作者是这样回答的。。。
@kokdemo 我也没看懂,呵呵
publicID001
2015-08-24 11:02:53 +08:00
Modifying a variable more than one time in a expression is asking for trouble.
speed
2015-08-24 11:04:34 +08:00
@b821025551b
@crab
@abscon
@canautumn
谢谢,现实中肯定不会出现这种引起混乱的代码,只是想自己分析下,呵呵
lissome
2015-08-24 11:18:59 +08:00
a 是计算后再 i = i + 1 三次,所以 a 是 30
b 是先 j = j + 1 三次,再计算,所以 b 是 39
seki
2015-08-24 11:20:53 +08:00
不要搞这些花活,这种代码除了炫以外,就剩下坑了
leavic
2015-08-24 11:22:37 +08:00
C 的问题看汇编可解
ljbha007
2015-08-24 11:30:41 +08:00
这种代码审核的时候会被毙掉
airbnber
2015-08-24 11:49:12 +08:00
@speed 书没错,只是这题目挖了一个小坑,赋值之后确实应该是 33 和 37
Kilerd
2015-08-24 11:54:28 +08:00
目测又是谭浩强害死人。
```c
int a,b;

int i=10 , j=10;

a=(i++)+(i++)+(i++);

//等价于
a = i + i + i;
i++;
i++;
i++;

b=(++j )+(++j )+(++j );

//等价于
++j;
b = j;

++j;
b += j;
++j;
b += j;
```

换教程把。
BTW,谭浩强的书就别看了

C 分两种。一种是谭浩强的 C ,一种是 C

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/215498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX