奇怪的后缀++

czcwzw 2009-08-10 01:24:50
第一个代码片段:

int p[3]={1,2,3};
int i=0;

p[i++]=p[i++];
根据我的理解,=右边的p[i++]由于i=0,而且是后缀++,所以相当于p[0],而=左边的p[i++],由于i在=右边已经加过一次了
,所以应该是p[1],所以就是把p[0]的值付给p[1],但在vc6.0下完全不是这样的,执行后数组p里面的值不变。


第二个代码片段:
int b,a=2;

b=(a++)+(a++);
b+=(a++);
执行之后b=8,跟我想的不一样,我是这样认为的
3 2
b=(a++)+(a++);
4
b+=(a++);
所以我是认为b应该是=9才对啊.
...全文
128 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙凤呈祥焱 2009-08-10
  • 打赏
  • 举报
回复
学一下还是有好处的,至少让你知道更多,
知道不好,以后才能在工作中避免,学的时候问这个比在工作中出现这种情况好.
mwj1984 2009-08-10
  • 打赏
  • 举报
回复
最好不要多个++连用,很容易出问题
lyhui2008 2009-08-10
  • 打赏
  • 举报
回复
挣个分
favorxx 2009-08-10
  • 打赏
  • 举报
回复
看了下,还算可以,不算太变态的那一种,下面全部解释一下
第一个片段int p[3]={1,2,3};
int i=0;
p[i++]=p[i++];

解释:i++中的++是等式运算后才执行,因此 p[i++]=p[i++]; 相当于
p[i] = p[i]; // 也就是p[0] = p[0];
i++;
i++;
所以对数组没有影响

第二个代码片段:
int b,a=2;

b=(a++)+(a++);
b+=(a++);

原理同第一个
b=(a++)+(a++);
相当于
b=a+a; // b = 4;
a++;
a++; // a = 4

b+=(a++);
相当于
b+=a; // 由于此时a=4, 因此 b=8;
a++; // a=5;但此时已与b没有关系

建议:自己写代码的时候千万别用,考试题的话就另当别论了


roman_v 2009-08-10
  • 打赏
  • 举报
回复
这种代码只有考试时候才会有……
实际编码中遇到会搞死人的……那么多++谁看得懂……
MoXiaoRab 2009-08-10
  • 打赏
  • 举报
回复
这东西多纠缠一点意思也没有。
编译器什么样你就怎么搞
幸福官 2009-08-10
  • 打赏
  • 举报
回复
纯编译器问题,刚接触VC前我就用java编译过一个相关类型的题目,结果用VC编译后结果就不同了。
jyh_baoding 2009-08-10
  • 打赏
  • 举报
回复
同意楼上各位意见
alfredzz 2009-08-10
  • 打赏
  • 举报
回复
同意!
wltg2001 2009-08-10
  • 打赏
  • 举报
回复
++运算的行为一般由编译器决定,可能是自增行为是一个语句之后才开始的,所以p[i++]=p[i++]; 才会出现值没有变化的情况。
对于int b,a=2;

b=(a++)+(a++);
b+=(a++);
也是一样的,执行第一句结束时++才开始效,所以b=4,两次++后a=4,后面b才会为8。换个编译器可能结果又不一样了。
DarkChampion 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 czcwzw 的回复:]
放心,不会纠缠很久,看书的时候,书上有提到,所以问了下

[/Quote]

尽信书不如无书
danxuezx 2009-08-10
  • 打赏
  • 举报
回复
编程序试验最快。
czcwzw 2009-08-10
  • 打赏
  • 举报
回复
放心,不会纠缠很久,看书的时候,书上有提到,所以问了下
shakeyou123 2009-08-10
  • 打赏
  • 举报
回复
这些是C++未定义的,视各编译器而定
zhangyan_wt 2009-08-10
  • 打赏
  • 举报
回复
同意大家的观点,整点有用的吧,别纠缠这些玩意
不动如岳 2009-08-10
  • 打赏
  • 举报
回复
++这东西确实是编译器不同,结果不同!
我以前还不知道,有次有.net运行了一个程序,咋跟想的不一样?
有用vc运行了一次,才发现,真的不一样啊1
gamedragon 2009-08-10
  • 打赏
  • 举报
回复
这个在语言里属于未定义的操作,完全依赖于编译器,所以LZ不要纠缠于这种东西。
副组长 2009-08-10
  • 打赏
  • 举报
回复
别纠缠这些没意义的事儿,手头有项目赶紧干,没事儿的抓紧时间学习点什么有用的。

无言猪 2009-08-10
  • 打赏
  • 举报
回复
++在该段语句执行完后才+.
也就是
int p[3]={1,2,3};
int i=0;

p[i++]=p[i++];
实际上是p[0] = p[0];
int b,a=2;

b=(a++)+(a++);
b+=(a++);
是b = 2 + 2;
b += 4;
hurryboylqs 2009-08-10
  • 打赏
  • 举报
回复
这种操作符你还是少用点吧
不同编译器的实现都有可能得出不一样的结果

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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