请教下 ++i 和i++的区别

youlingsxcn 2008-09-15 10:28:08
int j=5,m;
m=(j++)+(++j)+(j++)
m的值是多少?

如果m=(++j)+(++j)+(j++),m值应该是多少啊?

开始我理解为
j++ 是 j=j+1
但是++J 是提供给别人 J+1 而不是j=j+1



现在 又得到这样一个结果 (++j)+(++j)
和 把第一个 ++J 赋值给一个变量 i,然后 i+(++j) 结果是不一样的


哪位高人 给指点下 实在糊涂~~谢谢~
...全文
293 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xianyuxiaoqiang 2008-09-18
  • 打赏
  • 举报
回复
#include <stdio.h> 


int main(void)
{
int i=0;
int j=i+++i+++i++;
printf("%d", j);
return 0;
}

我的编译器结果是0.
写完这个代码真想吐……
mxling 2008-09-16
  • 打赏
  • 举报
回复
确实没有意义,哪部分先执行?和编译器有关
devil_zuiai 2008-09-16
  • 打赏
  • 举报
回复
只需知道++i,和i++就够了。
i = 8;
j = i++;
结果:j=8,i=9;
i++的返回值是i;i运算完后变成i+1;

i = 8;
j = ++i;
结果:j=9,i=9;
++i的返回值是i+1;i运算完后变成i+1;

m=(++j)+(++j)+(j++)这样的编码显然不合格。
youlingsxcn 2008-09-16
  • 打赏
  • 举报
回复
の, 大家态度很一致~~呵呵 TO:fengyqf

不好意思啊 一个问题,。让你牺牲一本书~~
tfnadnt 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lann64 的回复:]
引用 8 楼 fengyqf 的回复:
c程序是右结合的,也就是从右到左运算,好像是这样的,楼主有兴趣的话,可以再分析一下

从哪本书上看到c是右结合的?把那书烧了吧。
[/Quote]

UP
晨星 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 youlingsxcn 的帖子:]
哪位高人 给指点下 实在糊涂~~谢谢~
[/Quote]
——糊涂就对了,如果在这点上不“糊涂”,就说明还你没有理解C。。。
amwkthh8 2008-09-16
  • 打赏
  • 举报
回复
说的有理~
太乙 2008-09-16
  • 打赏
  • 举报
回复
没意义!
HealthyFish 2008-09-16
  • 打赏
  • 举报
回复
不要在这种问题上浪费人生啊...
mifeixq 2008-09-16
  • 打赏
  • 举报
回复
这个不确定的……和编译器相关
mars_man 2008-09-16
  • 打赏
  • 举报
回复
无意义。。。。
如果是学校老师出的题目,只能说明中国的计算机教育真的是一坨屎了,这摆明是要去避免的问题,居然拿来当考题。
如果是个人的兴趣爱好,劝LZ还是放弃吧
anderzheng 2008-09-16
  • 打赏
  • 举报
回复
考试很喜欢出这种BT题
谁这样写程序,马上被打回重写
tncqsy 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgjxwl 的回复:]
这个没必要深究的...具体由编译器而定

C++中明确规定,不要在同一条语句中多次修改

同一变量的值.因为这是未定义的,也就是说,编译器不知道

该如何来执行,对于不同的编译器,可能会有不同的行为,也会有不同的结果

总之,不要这样写就行,不要依赖于这种未定义行为
[/Quote]
就是这样的
xiansizhe 2008-09-16
  • 打赏
  • 举报
回复
前测试,后测试
CODE163 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 cooler36659266 的回复:]
int j = 5;
m = (++j) + (++j) + (++j);
m = 24;
j = 8;
m = (j++) + (j++) + (j++);
m = 15;
j = 8;

楼主说的那个考虑不清...
[/Quote]
靠 一个也没算对!!!
e_sharp 2008-09-16
  • 打赏
  • 举报
回复
oh
cooler36659266 2008-09-16
  • 打赏
  • 举报
回复
int j = 5;
m = (++j) + (++j) + (++j);
m = 24;
j = 8;
m = (j++) + (j++) + (j++);
m = 15;
j = 8;

楼主说的那个考虑不清...
lann64 2008-09-16
  • 打赏
  • 举报
回复
除了||、$$、(?:)和逗号这几个操作符外,其他操作符都不保证求值顺序。
注意区分,优先级、结合性和求值顺序几个概念,特别是结合性和求值顺序并不是一回事。

所以,象lz那样在一个语句里多次使用同一个变量,且带有自增自减操作的情况,叫做未定义行为。既然未定义,编译器怎么实现都行。
lann64 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fengyqf 的回复:]
c程序是右结合的,也就是从右到左运算,好像是这样的,楼主有兴趣的话,可以再分析一下
[/Quote]
从哪本书上看到c是右结合的?把那书烧了吧。
iGarlic 2008-09-16
  • 打赏
  • 举报
回复
同样的问题
同样的解释……
加载更多回复(8)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧