求一个C的运行结果 int a[]={1,3,5,7,9},*p=a; printf("%d,%d",(*(++p)++),*p++}; printf("%d",a[2]);

inta[]={1,3,5,7,9},*p=a;printf("%d,%d",(*(++p)++),*p++};printf("%d",a[2]);结果是3,1,5还是5... int a[]={1,3,5,7,9},*p=a;
printf("%d,%d",(*(++p)++),*p++}; printf("%d",a[2]);
结果是3,1,5
还是5,1,6??
望大神帮一下忙!!!
展开
 我来答
君上沙夏
2013-07-08 · TA获得超过484个赞
知道小有建树答主
回答量:182
采纳率:50%
帮助的人:118万
展开全部

第一句输出错了个大括号,结果是 3,3 5

如果改为如下:

 int a[]={1,3,5,7,9},*p=a; printf("%d,%d",(*(++p)++),(*p)++); printf("%d",a[2]);

结果就是 3,3 6.

不明白可以问。

追问
谢谢回答~~~
还想问一下是(*(++p)++)和*p++同时执行么???还是从左至右或从右至左???
第二个3是怎么得到的???
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yuantailing
2013-07-08 · TA获得超过2545个赞
知道小有建树答主
回答量:1167
采纳率:92%
帮助的人:635万
展开全部

实测了一下(Visual Studio 2012),结果是5,3,5。


	int a[]={1,3,5,7,9},*p=a;
printf("%d,%d,",(*(++p)++),*p++); printf("%d",a[2]);

 好像C/C++标准没有规定printf的参数入栈顺序吧,这样的话编译器不同就可能不同。

追问
哦~
书上没有写printf从左至右、从右至左还是平行输出。但是我在一个参考书上看到从右至左。
应该是编译器的问题吧。谢谢啦!!!
追答

首先这个程序必须用C++编译器来编译,不能用C编译,因为C里++p没有左值,不能(++p)++。

楼主分析得对,大部分编译器实现都是从右往左传。

Dev-Cpp编译main.cpp以下内容,结果是5,1,5,这样就好解释了吧。首先p++的值是&a[0](*p++==1),执行完后p==&a[1];然后++p的值是&a[2],执行完后p==&a[2];最后(++p)++的值是&a[2](*(++p)++==5),执行完后p==&a[3]。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[]={1,3,5,7,9},*p=a;
    printf("%d,%d,",(*(++p)++),*p++);
    printf("%d",a[2]);
    system("pause");
    return 0;
}

Dev-Cpp用GNU的内核,比较贴近C/C++标准的。

Visual Studio 2012也是从右往左传的,但它并不是先算出最右边的参数,再开始计算第二个参数,而是两个参数穿插着算的。因此在printf等函数调用中使用有副作用的表达式要小心。


楼主提到“理论上是5,1,6",是没有注意到*(++p)++的运算顺序是p、++p、(++p)++、*(++p)++,那个后置++是作用在(++p)上的,不是作用在*(++p)上的。

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
White_MouseYBZ
2013-07-08 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6291万
展开全部
应该是3,35。但这与编译器有关,不过不论哪种编译器也不会把35位置的数用逗号拆成两个。
追问
恩恩。。。太大意了。嘿嘿
追答
在计算机中,无论什么表达式都不可能同时执行。在printf("%d,%d,",(*(++p)++),*p++);中,变量列表是从右至左执行的,即先执行*p++将结果压栈,再执行(*(++p)++),再将结果压栈。这里要注意的是p是指向数组的指针,数组是按下标操作的,所以像计算*p++时并不是将a[0]=1这个值1压入栈而是只压入指针变量p(这时p=a);然后计算(*(++p)++),它的++p使p指向了a[1]=3,同样压入的是p(这时p=a+1)。从左至右弹出来时先取p=a+1的值a[1]=3并输出,按控制符再输出一个逗号,紧接着弹出先压入的p——这里有一点要理解一下——压入的是指针变量p ,它原来等于a,而现在p被++p操作成等于a+1了,所以取出的数值也是a[1]=3。最后由printf("%d",a[2]);接着输出a[2]=5,所以最后的结果是3,35。且,这还与编译器有关,一些编译器在细节上可能不这样处理……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2013-07-08 · TA获得超过527个赞
知道小有建树答主
回答量:307
采纳率:0%
帮助的人:167万
展开全部
又看到这种SB问题,我想骂人了。

什么运行结果自己不可以试一下吗?

再说不同的编译器,运行结果也可以不相同。

如果你来做编译器,你会怎么处理?
追问
我试过了,用vc6.0试出来是3,1,5
但是理论分析应该是5,1,6
所以才想问问
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式