| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1401 人关注过本帖
标题:c中的运算优先级问题,据说连老师都被问倒了
只看楼主 加入收藏
forestpeak
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-12-12
结帖率:66.67%
收藏
已结贴  问题点数:10 回复次数:13 
c中的运算优先级问题,据说连老师都被问倒了
#include<stdio.h>

void main()
{
    int a[5]={5,8,2,6,9},b[5]={5,8,2,6,9},*p,y;
   
    p=&a[1];
    y=(*p--)++;
    printf("%d,%d,%d,%d\n",y,a[1],a[0],*p);

    p=&b[1];
    y=(*--p)++;
    printf("%d,%d,%d,%d",y,b[1],b[0],*p);
}

实际输出结果:8,9,5,5
              5,8,6,6
到底为什么会是这种结果啊,我都搞晕了,老师也讲不清楚。(已证明p中的地址在变化)
搜索更多相关主题的帖子: 老师 运算 
2010-12-13 00:01
heartnheart
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:335
专家分:1096
注 册:2009-7-10
收藏
得分:1 
括号优先级最高,*与++ 和--优先级相同,但是因为是右结合的,所以y=(*p--)++;等价于y=(*(p--))++;
 y=(*--p)++;等价于 y=(*(--p))++;至于p--与--p的区别,你应该很清楚了

2010-12-13 00:15
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:1 
老师是伟大的,最恨人去整老师

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2010-12-13 00:31
newshou
Rank: 2
等 级:论坛游民
帖 子:10
专家分:28
注 册:2010-12-12
收藏
得分:1 
我想,这道问题,纠结的地方不在这。他老师不一定牛X,但不至于这点看不出来,纠结的地方在于
(*p--)++
是先--呢,还是先++,
如果小括号内的--先算,那么输出应该是
8,8,5,5。
按照输出的结果显示,看似应该是外面的++先算,但这和优先级矛盾。

简单的说:y的值赋完后,到底是先p--,还是先算++。
2010-12-13 01:05
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:1 
怎么老说自己老师不行啊?

这些蛋问题能看出水平高还是怎么的?
2010-12-13 09:47
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:1 
程序代码:
#include<stdio.h>

void main()
{
    int a[5]={5,8,2,6,9},b[5]={5,8,2,6,9},*p,y;
   
    p=&a[1];
    y=(*p--)++;//先执行了()  二级运算符从右到左 p--先执行  把--当做一个函数
    //它的返回值还是p  然后再把p-1 那么(*p--)实际上就是a[1]  同样的道理y=a[1]++
    //y就是8  然后a[1]+1=9 所以a[1]就变成了9
    //a[0]=5不解释   上面的“然后再把p-1”就是p指向了 a[0] 所以*p=5
    printf("%d,%d,%d,%d\n",y,a[1],a[0],*p);

    p=&b[1];
    y=(*--p)++;
    //首先--p返回了p-1 也就是b[0]的地址 p指向了b[0]   再加*就是b[0]  也就是5
    //y=b[0]++   那么y=b[0]=5   然后把b[0]+1=6
    //b[1]=8 不解释   前面的“p指向了b[0] ”和“然后把b[0]+1=6”  也就是*p=b[0]=6
    printf("%d,%d,%d,%d",y,b[1],b[0],*p);
}
其实++ -- 这些东西 相当于函数   他只是没有参数  但是有返回值的
把这些东西的返回值弄清楚  这些东西很简单

                                         
===========深入<----------------->浅出============
2010-12-13 10:05
mengcong3959
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:113
注 册:2010-12-6
收藏
得分:1 
对于不同的编译器y=(*p--)++中各式的运算顺序是不同的,,有的编译器进行完*p之后
接着进行--运算,,有的是进行完++后再进行--运算,,所以一般写的程序最好不要出现这种有不确定性的程序。
2010-12-13 13:28
Kabie
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:69
专家分:185
注 册:2009-8-21
收藏
得分:1 
以下是引用mengcong3959在2010-12-13 13:28:47的发言:

对于不同的编译器y=(*p--)++中各式的运算顺序是不同的,,有的编译器进行完*p之后
接着进行--运算,,有的是进行完++后再进行--运算,,所以一般写的程序最好不要出现这种有不确定性的程序。


任何正确的C实现都应当是先p--

这个问题本身毫无问题……输出也和期望是相符的

[ 本帖最后由 Kabie 于 2010-12-13 19:06 编辑 ]
2010-12-13 19:01
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:1 
结果是正确的

悲剧源于生活。
2010-12-13 19:17
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:0 
很东西,你只要是先执行哪个就行了,不必过深入的去追究。

悲剧源于生活。
2010-12-13 19:17
快速回复:c中的运算优先级问题,据说连老师都被问倒了
数据加载中...
 
   



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

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