++i和i++的使用
int main(void) {int a =1;
int b =0;
b = (a++)+(++a)+(++a);
printf("b的值为%d,a的值为%d",b,a);
return 0;
}
结果为:b的值为8,a的值为4
疑问: 执行的顺序是什么?
自己认为的执行顺序:
1.++a a变成2
2.++a a变成3
3. 执行 b = 3 + 3 +3 =9
4.a++ a变成4
结果为 b=9 a =4 后面两个++a先执行,分别得到3+2然后再+3得到8赋值给b最后a++得a等于4 BngThea 发表于 2017-11-16 21:45
后面两个++a先执行,分别得到3+2然后再+3得到8赋值给b最后a++得a等于4
你的意思 是不是第一个 ++a 使得a变成了2 ,然后再执行 ++a ,a变成3 ,变成 2+3 ,然后计算a++,变成
3+2+3呀?? 午饭加肉丝 发表于 2017-11-16 22:08
你的意思 是不是第一个 ++a 使得a变成了2 ,然后再执行 ++a ,a变成3 ,变成 2+3 ,然后计算a++,变成 ...
如果是的话,那 y= (++x)+(++x)+(++x), x=1;执行后的结果应该为2+3+4,但编译器是12. 我想了好久了,想到哭啊, 各个编译器的处理过程是不同的。
在VC6.0中b = (a++)+(++a)+(++a) 最终结果为7,假设b = (i++)+(++j)+(++k),i = j = k = 0, (字母进行区别主要为了说明),那么执行时,首先执行 ++j,然后将 i 与++j进行相加,即 sum = i + (++j) =0 +1, 再将 sum = sum + (++k) = 1 + 1, 然后 i才++。这是我反编译看到的结果。其它编译器应该还有其它结果。
尽量不要这样写代码。 午饭加肉丝 发表于 2017-11-16 22:08
你的意思 是不是第一个 ++a 使得a变成了2 ,然后再执行 ++a ,a变成3 ,变成 2+3 ,然后计算a++,变成 ...
因为不同编译器会对这样的代码进行所以得"优化",实际执行起来不同编译器会得到不同结果,我跟你的解答是为了得到8而进行的一种可能得优化结果
所以这样的代码在实际中应该尽量避免,于人于己都没什么好处,也就某些考试才会要求去考虑这样的代码 ++i是先i=i+1 然后再调用i,i++ 则是先调用i 额应该是1+3+4吧
事实上编译器是两个两个的运算
也就是(a++)+(++a)+(++a)就相当于((a++)+(++a))+(++a)
第一个a++==1a==2
然后++a==3
再++a==4
所以是1+3+4啊
如果你试试(++a)+(++a)+(++a) a=5结果会是22的一样的道理也就是7+7+8
详细的你可以看看这个http://bbs.fishc.com/forum.php?mod=viewthread&tid=98824 感觉计算机二级才会考这种题 这两个 你可以看作是两 不同的 函数 来用 就可以了
如:
int(int& n)++
{
inttemp = n;
n = n + 1;
return temp;
}
int++(int& n)
{
n = n + 1;
return n;
}
本帖最后由 zqianglh 于 2017-11-19 01:01 编辑
午饭加肉丝 发表于 2017-11-16 22:11
如果是的话,那 y= (++x)+(++x)+(++x), x=1;执行后的结果应该为2+3+4,但编译器是12. 我想了好久了 ...
2+3+4也是对的
4+4+4
1+3+4
1+1+1+1 午饭加肉丝 发表于 2017-11-16 22:11
如果是的话,那 y= (++x)+(++x)+(++x), x=1;执行后的结果应该为2+3+4,但编译器是12. 我想了好久了 ...
我个人觉得是(1+1)+(2+1)+(5+1).每次调用前缀++前对x加一在进行加法运算
页:
[1]