int main()
{
int a[] = {2,5,8};
int *p = a;
printf("%d \n,%d",(*p++)-1,*p);
}
*p++ 的意思是取p所指向的变量值,再将p增1。p指向首元素,则获取到了2,再用2-1得到1,由于p增了1所以有指向了数组第二位,则*p就是5。 所以得到了1,5 。
你说的是P指针是取首地址的值是2-1,然后++的值是下一次才会用到是吗?就想i++一样,开始是1,用1计算过后I的值变为2?是这个意思吗?
@静静流: 你这是没搞懂单目运算符的运算法则。要用单目运算符你一定要确定运算符作用到了谁的身上。你仔细看看++*p、(*p)++、*p++、和*++p 这四个。第一个是*作用到了p上,而++作用到了(*p)上,所以是先执行*p在执行了对(*p)进行++;第二个是*作用到了p上++作用到了(*p )上所以也是先执行了*p再执行了对(*p)进行++;第三个是*作用到了p上,且++也作用到了p上所以是先执行了*p,在对P进行++;第四个是++作用到了p上*作用到了(++p)上所以,你懂得.....先执行了(++p),再对(++p)进行*。
另外,你也知道后++是 先用值,再执行。这几条原则放在一起,你在去思考一下你的问题。
@梦再笑: 恩,你解释的我明白了,很清楚!我的问题解决了,谢谢!
不要纠结这些东西.所有的问题都可以通过加括号来解决.
比如printf("%d \n,%d",((*p)++)-1,*p);或者printf("%d \n,%d",(*(p++))-1,*p);
你的问题终归是这2个种情况哪个是对的.这个就是运算符结合性和优先级的问题.
但这种知识一点意义都没有.唯一的意义就是装逼.正常情况下大家都会通过加括号来规避这种问题.
不是啊,我觉得答案是4和5,可以代码运行出来是1和5,我就不知道是为什么啊
@静静流: 我回答是.别纠结这种没有意义的东西.想要什么样的答案直接加什么样的括号就行.
你是在猜编译器的编译方式.
尤其是对C来说.很多编译器都有不同的结果.这种没啥好纠结的.
不一样只能说明这个编译器不是按你的想法在执行而已.对你学习C没有任何帮助.
答案是1的原因很明显先*p了.取出2,然后是2++.表达式2++的值为2.2-1自然是1.
这是一个p++ 还是++p的问题么?
你确定你给的答案是正确的么 我在我的电脑上运行了一下,答案是1和2 而且这个结果也是解释通的 楼上几位给出的解释说的道理是对的 但是*p++(此时的p可以理解为数字2) 它减去1当然是1了,这个没有疑问,
http://baike.baidu.com/view/262524.htm 请查阅里面C语言的优先级列表,(后置++) 是优先的。