int a,b;
int i=10 , j=10;
a=(i++)+(i++)+(i++);
b=(++j )+(++j )+(++j );
a 与 b 的值,一直没搞明白!!!
1
abscon 2015-08-24 10:47:30 +08:00
建议帖主换 C 语言教材。
关注点不对 |
2
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. |
3
canautumn 2015-08-24 10:49:28 +08:00
Undefined Behavior
|
4
speed OP 这不是 C 教材上的,只是最近看了篇贴在由这个衍生到 2 个概念顺序点和副作用,所以一直没搞明白这题是怎么算的。。。
@abscon |
6
RecursiveG 2015-08-24 10:54:16 +08:00
1. 不同的编译器会有不同的结果
2. 不要写这样的代码 3. 换教材 +1 4. 如果非要搞明白,搜“ Undefined Behavior ” |
7
crab 2015-08-24 10:55:46 +08:00
钻牛角尖
|
8
kokdemo 2015-08-24 10:55:53 +08:00
|
9
lingo233 2015-08-24 10:56:04 +08:00
看编译器,不知道会是什么。
|
10
b821025551b 2015-08-24 10:57:01 +08:00 via Android 1
这种谭浩强 style 的问题不需要去考虑
|
12
speed OP VisaulC++6.0 则会先计算前两个 i 的值为 12 ,第三个 i 的值变成了加三次以后的值为 13 ,因此结果是 12+12+13=37 。作者是这样回答的。。。
@kokdemo 我也没看懂,呵呵 |
13
publicID001 2015-08-24 11:02:53 +08:00 via Android
Modifying a variable more than one time in a expression is asking for trouble.
|
14
speed OP |
15
lissome 2015-08-24 11:18:59 +08:00
a 是计算后再 i = i + 1 三次,所以 a 是 30
b 是先 j = j + 1 三次,再计算,所以 b 是 39 |
16
seki 2015-08-24 11:20:53 +08:00
不要搞这些花活,这种代码除了炫以外,就剩下坑了
|
17
leavic 2015-08-24 11:22:37 +08:00
C 的问题看汇编可解
|
18
ljbha007 2015-08-24 11:30:41 +08:00
这种代码审核的时候会被毙掉
|
20
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 |
22
qwlhappy 2015-08-24 12:40:34 +08:00
感觉顺序点和编译器关系很大
似乎有一些顺序点是标准 c 里面有规定的,就好像分号,或者其他一些杂七杂八的东西 似乎相关博客很多?搞不懂的话不如直接看汇编咯 |
23
broodnes 2015-08-24 12:42:03 +08:00
我晕了, vs2015 的结果是 a=30 , b=39
|
24
wwwqq2com 2015-08-24 13:00:43 +08:00
不要再用 VC6.0 了,这玩意儿比 C++标准出现还早
|
25
loading 2015-08-24 13:07:05 +08:00 via Android
我帮你问下大家:
++i ,这玩意大家有几次会用? |
26
zcbenz 2015-08-24 13:11:00 +08:00
怎么还有问这种问题的,楼上凡是尝试解释结果的都应该去看看这个:
http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points |
27
iosx 2015-08-24 13:17:54 +08:00
a=(i++)+(i++)+(i++);
b=(++j )+(++j )+(++j ); 谁要这么写代码,我掐死他。 |
28
danny200309 2015-08-24 13:19:07 +08:00
@zcbenz 其实 6 楼早就说出了问题的关键,楼主没有注意吧
|
29
FrankFang128 2015-08-24 13:20:13 +08:00
把写出这样代码的人开除即可,不需要明白。
|
30
fds 2015-08-24 13:36:42 +08:00
标准里没有定义这种操作的顺序,所以怎么实现都可以,出现什么结果都正常。总之就是不要用。
|
31
Kilerd 2015-08-24 14:00:01 +08:00 1
|
32
dacapoday 2015-08-24 14:02:05 +08:00 via Android
加一个编译器结果:
用安卓的 c4droid a 为 33 b 为 36 |
33
msg7086 2015-08-24 20:22:38 +08:00
返回 30 也好 300 也好 1234567 也好都是正常的。
甚至产生编译错误也是正常的。 因为严格说这不属于合法 C 代码(因为无法唯一地编译成机器语言)。 |