| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2577 人关注过本帖
标题:请教VC++中 ++的问题
只看楼主 加入收藏
rswl3322
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-10-4
结帖率:0
收藏
已结贴  问题点数:20 回复次数:18 
请教VC++中 ++的问题
a=5;p=++a+(++a);是多少?p=(++a)+(++a)+(++a);是多少?为什么?
2016-10-04 15:31
cpxuvs
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:45
专家分:142
注 册:2015-12-22
收藏
得分:3 
++优先级比+高
程序先计算++a,再计算+
所以第一个经过两次++a后,a=7,7+7=14
同理 第二个 8+8+8=24
2016-10-04 16:44
rswl3322
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-10-4
收藏
得分:0 
可第二个答案是22
2016-10-04 16:46
cpxuvs
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:45
专家分:142
注 册:2015-12-22
收藏
得分:0 
我输出是24
2016-10-04 18:37
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:3 
这问题,看编译器心情了。
2016-10-04 19:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:3 
未定义行为
2016-10-04 19:51
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:3 
;p=++a+(++a)

我们只能确定++a 自增运算会比 + 加法运算先执行。
但是没有规定一定是左边的++a先执行还是右边的(++a)先执行。也没有规定说加法运算非得等两个自增运算都执行过后再去取a的值做计算(即p=7+7)。它是有可能在计算过程中就把计算结果放到p去(即p=6+7或者p=7+6)

所以题主在测试p=(++a)+(++a)+(++a)  的时候可能p=6+7+8 而cpxuvs计算的是p=8+8+8

C语言的运算规则和数学不太一致就在这里,虽然也是从高到低,但不一定从左往右。我个人揣测这可能和并行运算有关系,这里的几个同级运算++a说不定在单线程里是从左往右依次执行,但是在多线程里面他可能就分别独立计算,这时候谁也管不了哪部分会先计算出结果来。。。这是我理解的方式,没有任何理论依据。只是为了让自己记住

int fun(int a){
if(a==0)return 1;
if(a==1)return 1;
else return fun(a-1)+fun(a-2);//好像这个递归循环,我们也不会知道到底是fun(a-1)先执行还是fun(a-2),属于未定义行为
}

φ(゜▽゜*)♪
2016-10-05 10:02
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:3 
回复 7楼 书生牛犊
我输出22,既不是6+7+8又不是8+8+8. 这什么逻辑?我投降了。
2016-10-05 10:36
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
所以在运算式中最好不要用a++,++a,a--,--a,各种编译器执行先后顺序不一样,很容易出错,而你又不知道为什么。
2016-10-05 10:42
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 8楼 yangfrancis
这说明你没抓住重点,,,,

++a1 + ++a2 + ++a3

没人规定++a1 一定先执行  也没规定++a2 一定先执行,更没规定 加法运算会是等所有自增结束以后才去读各个a,他完全可以在做完a1a2自增就执行+运算,这时取出的a就可能是两个7,然后+再取到8,计算结果就是7+7+8=22。甚至连++哪个先运算都是未知的。
我们根本不知道在这个自增的过程中各个a1,a2,a3到底是多少,自然就不知道把加到p的a到底是多少。  我们唯一可以确定的就是这行代码执行过后a=8.

所以p=7+7+8  8+7+7  7+8+7 8+8+8 6+7+8 都是可能的。

这是“未定义行为”!!!


[此贴子已经被作者于2016-10-5 11:30编辑过]


φ(゜▽゜*)♪
2016-10-05 10:46
快速回复:请教VC++中 ++的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017732 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved