0
++*P--;

这是考试中的一个问题,如果P指向数组中的任何元素的指针,请解释该语句的真正作用。

我什至写了一个简单的代码来评估它:

  int i;
    int* array = calloc(10, sizeof(int));
    for (i = 0; i < 10; i++) {
        array[i] = i;
        printf("%d,", array[i]);
    }
    int* P = array + 5;
    printf("\n %p", P);
    printf("\n %d", *P);

    ++*P--;
    printf("\n %p", P);
    printf("\n %d \n", *P);
    for (i = 0; i < 10; i++) {
        printf("%d,", array[i]);
    }

但输出让我更加困惑:

0,1,2,3,4,5,6,7,8,9,
 0x100105534
 5
 0x100105530
 4 
0,1,2,3,4,6,6,7,8,9,

看起来它首先取消引用P,然后增加它的值,然后减少指针的值P,但为什么呢?

根据 p53 中的 K&R 表 2-1(见下图)++、- 和 *(取消引用)从右到左具有相同的优先级和关联性。所以第一步应该是减少 的值P然后取消引用,然后增加取消引用的值,我错了吗?

在此处输入图像描述

4

2 回答 2

3

你是对的,优先级是

++(*(P--))

但请注意,减量是一个后缀操作:即使更改首先P发生,表达式的其余部分仍使用 的旧值P。因此,在您的示例中, firstP递减为array+4,但值为P--array+5因此array[5]递增。

于 2015-07-15T22:19:17.003 回答
2

你可以想象这个表情

++*P--

以下方式

int *tmp = p;
--p;
int value = *tmp;
++value;

这是一个演示程序

#include <stdio.h>

int main( void )
{
    char s[] = "Hello World";
    char *p = s + 6;

    std::printf( "%c\n", ++*p-- );
    std::printf( "%s\n", s );

    p = s + 6;
    char *tmp = p--;
    char value = *tmp;
    ++value;

    std::printf( "%c\n", value );
    std::printf( "%s\n", s );
}

程序输出为

X
Hello Xorld
Y
Hello Xorld

输出字符串的区别在于,表达式++*p--改变了字符串本身,而表达式++value;改变了一个单独的对象。但逻辑是相似的。

后缀表达式p--具有最高优先级,但其值是p递减前的值。

表达式组中的一元运算符 ++ 和 *++*p--从右到左。因此,首先将运算符 * 应用于表达式,然后再应用运算符 ++。

于 2015-07-15T22:33:22.383 回答