C语言自增自减问题

#include<stdio.h>voidmain(){intx=5,p;p=(++x)+(++x)+(++x);printf("%d,%d\n",x,p);}我自己的算... #include <stdio.h>
void main()
{
int x = 5,p;
p=(++x)+(++x)+(++x);
printf("%d,%d\n",x,p);
}
我自己的算法是p=6+7+8=21,但是VC++给出的是P=22,WIN TC给出的是24,脑壳完全乱了,求大神,到底是怎么回事啊?
展开
 我来答
xshrim
推荐于2016-02-24 · TA获得超过2157个赞
知道小有建树答主
回答量:688
采纳率:66%
帮助的人:526万
展开全部
  其实呢,各个编译器对这个问题的处理方式是不同的。
  要弄明白这个问题,首先得明确两点:
  1、括号运算符的优先级是最高的,高于自增自减运算和加减乘除运算。因此括号内的表达式首先计算;
  2、++i这个自增表达式的意思是i的值加1,然后再使用i。(++i)就表示先把i的值加1,然后再将i用在运算中。
  因此。p=(++x)+(++x)+(++x);这个语句最终在本质上是p=i+i+i。而不是你认为的每次算出括号表达式中的结果然后依次相加。这一点非常重要。

  而至于最终的p=i+i+i中i的值是多少呢,不同的编译器之间就产生了分歧。
  其中vc和gcc认为按照加号运算从左到右的运算顺序来。也就是先计算第一个加法,然后再计算第二个。具体的过程就是:
  先计算第一个(++i),这个时候i自增成6,得到i;
  再计算第二个(++i),这个时候i自增成7,得到i;
  现在i=7了,计算第一个加法(++x)+(++x),也就是i+i,即7+7=14;结果存在临时变量temp中;
  然后计算第三个(++i),由于之前i=7,因此现在i自增成8,得到i;
  最后计算第二个加法(++x)+(++x)+(++x),也就是temp+i。于是就是14+8=22。
  而在TC中则认为必须先把高优先级的计算完再直接计算低优先级运算。于是就是直接先将i进行三次自增,i变成8。然后直接计算i+i+i,所以得到24。
七鑫易维信息技术
2024-09-02 广告
Play Video 七鑫易维是致力于机器视觉和人工智能领域的高新科技企业,迄今已专注眼球追踪技术的研发、创新与应用超过14年,拥有完全自主知识产权,全球专利总量655余项。 作为眼球追踪技术领域的全球知名品牌,七鑫易维的产品体系覆盖眼动分... 点击进入详情页
本回答由七鑫易维信息技术提供
俞西初琲瓃
2019-01-21 · TA获得超过3809个赞
知道大有可为答主
回答量:3137
采纳率:29%
帮助的人:175万
展开全部
i=5;
//应该是a=5吧?
x=(++a)+(++a)+(++a);
//这种问题没有必要分析的。在不同的编译系统下,答案不一样,在VC++下,答案是24。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
伊蕊那拉若骞
2020-05-06 · TA获得超过3642个赞
知道大有可为答主
回答量:3055
采纳率:29%
帮助的人:217万
展开全部
很直接了当的告诉你,这个无意义的运算在不同的编译器上可能会有两种不同的结果.
都已经告诉你了...
有从左往右,也有从右往左,难道还不明白吗?
这取决于编译器
此类问题是毫无意义的.
因为[像你这样公式的输出]

[他的所输出的值取决于你用什么样的编译器]
~
你还不明白那就真是说不通了,只能说:
无意义
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fastfs
2015-04-11 · TA获得超过1423个赞
知道大有可为答主
回答量:2659
采纳率:62%
帮助的人:808万
展开全部
这种代码可移植性很差,因为每个编译器的解释不太一样,GCC里根本编译不过。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
abidughw
2015-04-11 · TA获得超过904个赞
知道小有建树答主
回答量:572
采纳率:66%
帮助的人:287万
展开全部
这种题目就是回字有几种写法,毫无意义。
如果按照C++的语意,答案应该是22.但其中又存在编译优化或者编译器不遵守规范,可能导致结果是24.
对于这种不确定而且无意义的题目,我们只需要确定其考点在于++的优先级和返回值的语意,答案随着编译和优化是不定的。
答案24的由来:
T& operator++()

{
this.val++;
return *this;
}
T operator+(const T&a){
this.val=this.va+a.val;
}

T o=5;
按照语意:
o.operater++().operater+(o.operater++()).operator+(o.operater++())
=o(6).operater+(o.operater++()).operator+(o.operater++())
=o.operator(o(7)).operator+(o.operater++())
=T(14).operator+(o(8))
=22
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式