在这种情况下,为什么输出不是4?

Joh*_*Lui 3 c

#include <stdio.h>
int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int *p = arr;
    ++*p;
    p += 2;
    printf("%d", *p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

prefix的优先级++大于dereferencing,因此,p现在应该指向第二个元素.因此,当我们添加2它时,它应该指向第4个元素,答案应该是4.但是,答案是3,为什么呢?

AnT*_*AnT 7

在表达式中,++*p优先级根本不起任何作用.在此表达式中,内部运算符适用于p(*在这种情况下).外部运算符(++)适用于内部运算符的结果.

如果你交换它们来获取*++p,那么++将适用于p,同时*将适用于结果++p.

每当你有一堆unary/postfix操作符位于操作数的同一侧时,它们就会以内向外的顺序应用.

对于右侧示例,在p++[i]运算符中++应用p并[i]应用于结果p++.同时,在p[i]++运营商中[i]适用p并++适用于其结果p[i].

优先权开始在"含糊不清"的情况下发挥作用,如: