下面是我在网上发现的问题。
int main()
{
int a[4] = { 10, 21, 32, 43};
int *p = a + 3;
++*--p;
++*p--;
p[2] += p[1];
for (int i = 0; i < 4; ++i)
printf("%d - %d\t", a[i]);
return 0;
}
//输出结果是什么?
答复:10 21 34 77
我明白了很多事情,但我唯一的困惑是:(++*--p)
和(++*p--)
之间有什么区别?
这两个不是应该给予相同的结果吗?因为(*p--)
和(*--p)
在编译器中给出相同的结果。我使用的编译器是Code::Blocks
2条答案
按热度按时间j7dteeu81#
因为
(*p--)
和(*--p)
在编译器中给予相同的结果。不,它们不会。
*p--
会递减p
,但会将*
套用至递减前的p
值。*--p
会将*
套用至递减后的p
值。(++*--p)
和(++*p--)
之间有什么区别?++*--p
递减p
,并递增递减后所指向的对象。++*p--
递减p
,但递增递减前它所指向的对象。xtfmy6hx2#
(++*--p)
和(++*p--)
之间有什么区别?区别在于
--p
递减p
并解析为新值p
,而p--
递减p
并解析为旧值p
。++*
对这两个函数的作用相同--对p
执行间接寻址,递增p
指向的值,并解析为这个新值。这两个不是应该给予相同的结果吗?因为
(*p--)
和(*--p)
在编译器中给出相同的结果。这里的顺序很重要,在
(*p--)
之前使用(*--p)
将解析为相同的元素两次。在(*--p)
之前使用(*p--)
将解析为不同的元素。