首页 新闻 会员 周边 捐助

谁能知道为什么答案不是4和5 而是1和5

0
悬赏园豆:30 [已解决问题] 解决于 2016-12-05 09:11

int main()
{
int a[] = {2,5,8};

int *p = a;

printf("%d \n,%d",(*p++)-1,*p); 

}


静静流的主页 静静流 | 初学一级 | 园豆:11
提问于:2016-12-01 17:59
< >
分享
最佳答案
0

*p++ 的意思是取p所指向的变量值,再将p增1。p指向首元素,则获取到了2,再用2-1得到1,由于p增了1所以有指向了数组第二位,则*p就是5。  所以得到了1,5 。

收获园豆:30
梦再笑 | 初学一级 |园豆:55 | 2016-12-01 18:41

你说的是P指针是取首地址的值是2-1,然后++的值是下一次才会用到是吗?就想i++一样,开始是1,用1计算过后I的值变为2?是这个意思吗?

静静流 | 园豆:11 (初学一级) | 2016-12-02 09:05

@静静流: 你这是没搞懂单目运算符的运算法则。要用单目运算符你一定要确定运算符作用到了谁的身上。你仔细看看++*p、(*p)++、*p++、和*++p 这四个。第一个是*作用到了p上,而++作用到了(*p)上,所以是先执行*p在执行了对(*p)进行++;第二个是*作用到了p上++作用到了(*p )上所以也是先执行了*p再执行了对(*p)进行++;第三个是*作用到了p上,且++也作用到了p上所以是先执行了*p,在对P进行++;第四个是++作用到了p上*作用到了(++p)上所以,你懂得.....先执行了(++p),再对(++p)进行*。

另外,你也知道后++是 先用值,再执行。这几条原则放在一起,你在去思考一下你的问题。

梦再笑 | 园豆:55 (初学一级) | 2016-12-02 17:58

@梦再笑: 恩,你解释的我明白了,很清楚!我的问题解决了,谢谢!

静静流 | 园豆:11 (初学一级) | 2016-12-05 09:14
其他回答(5)
0

不要纠结这些东西.所有的问题都可以通过加括号来解决.

比如printf("%d \n,%d",((*p)++)-1,*p);或者printf("%d \n,%d",(*(p++))-1,*p);

你的问题终归是这2个种情况哪个是对的.这个就是运算符结合性和优先级的问题.

但这种知识一点意义都没有.唯一的意义就是装逼.正常情况下大家都会通过加括号来规避这种问题.

吴瑞祥 | 园豆:29449 (高人七级) | 2016-12-01 18:08

不是啊,我觉得答案是4和5,可以代码运行出来是1和5,我就不知道是为什么啊

支持(0) 反对(0) 静静流 | 园豆:11 (初学一级) | 2016-12-02 09:02

@静静流: 我回答是.别纠结这种没有意义的东西.想要什么样的答案直接加什么样的括号就行.

你是在猜编译器的编译方式.

尤其是对C来说.很多编译器都有不同的结果.这种没啥好纠结的.

不一样只能说明这个编译器不是按你的想法在执行而已.对你学习C没有任何帮助.

答案是1的原因很明显先*p了.取出2,然后是2++.表达式2++的值为2.2-1自然是1.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-12-02 09:22
0

这是一个p++ 还是++p的问题么?

hahanonym | 园豆:1460 (小虾三级) | 2016-12-01 19:37
0

你确定你给的答案是正确的么  我在我的电脑上运行了一下,答案是1和2  而且这个结果也是解释通的  楼上几位给出的解释说的道理是对的  但是*p++(此时的p可以理解为数字2) 它减去1当然是1了,这个没有疑问,

极客wolf | 园豆:206 (菜鸟二级) | 2016-12-01 20:06
0

http://baike.baidu.com/view/262524.htm  请查阅里面C语言的优先级列表,(后置++) 是优先的。

幻天芒 | 园豆:37207 (高人七级) | 2016-12-01 22:06
0

运算顺序和IDE有关系。

在一个表达式里面多次改变一个变量的值属于未定义行为,未定义行为c标准不做规定全权交予编译器处理

http://bbs.csdn.net/topics/370153775

正怒月神 | 园豆:183 (初学一级) | 2016-12-02 09:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册