【问题标题】:In which precedence is this statement evaluated?该语句的评估优先级是什么?
【发布时间】:2015-07-15 22:12:50
【问题描述】:
++*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的值,然后取消引用,然后增加取消引用的值,我错了吗?

【问题讨论】:

  • 优先级和评估彼此无关。优先级决定了源代码序列的含义(它是解析规则的一部分)。评估是关于确定表达式的值。在计算它的价值之前,您需要先了解它的含义。

标签: c operator-precedence associativity


【解决方案1】:

优先级是正确的

++(*(P--))

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

【讨论】:

    【解决方案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-- 中的一元运算符++ 和* 从右到左分组。因此,首先将运算符 * 应用于表达式,然后再应用运算符 ++。

    【讨论】:

      猜你喜欢
      • 2010-10-23
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2016-12-31
      • 2011-07-24
      • 1970-01-01
      • 2023-04-01
      • 2011-01-10
      相关资源
      最近更新 更多