C语言 运算符和指针优先级

h43kikqp  于 2022-12-11  发布在  其他
关注(0)|答案(2)|浏览(158)

下面是我在网上发现的问题。

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

j7dteeu8

j7dteeu81#

因为(*p--)(*--p)在编译器中给予相同的结果。
不,它们不会。*p--会递减p,但会将*套用至递减前的p值。*--p会将*套用至递减后的p值。
(++*--p)(++*p--)之间有什么区别?
++*--p递减p,并递增递减后所指向的对象。
++*p--递减p,但递增递减前它所指向的对象。

xtfmy6hx

xtfmy6hx2#

(++*--p)(++*p--)之间有什么区别?
区别在于--p递减p并解析为新值p,而p--递减p并解析为旧值p
++*对这两个函数的作用相同--对p执行间接寻址,递增p指向的值,并解析为这个新值。

#include <stdio.h>

int main(void)
{   
    int a = 10;         
    int b = 10;         
                       
    /* This prints 9, and `a` is now 9 */
    printf("%d\n", --a);
    /* This prints 10, and `b` is now 9 */
    printf("%d\n", b--);
    
    /* This prints 9 and 9 */
    printf("%d %d\n", a, b);
}

这两个不是应该给予相同的结果吗?因为(*p--)(*--p)在编译器中给出相同的结果。
这里的顺序很重要,在(*p--)之前使用(*--p)将解析为相同的元素两次。在(*--p)之前使用(*p--)将解析为不同的元素。

#include <stdio.h>

int main(void)
{
    int a[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    int *p = a + 4;
    
    /* 4 then 4 */
    printf("%d ", *--p);
    printf("%d\n", *p--);
    
    p = a + 4;
    /* 5 then 3 */
    printf("%d ", *p--);
    printf("%d\n", *--p);
        
}

相关问题