为什么下面代码中的printf语句打印的是值而不是垃圾值?

use*_*555 2 c arrays pointer-arithmetic subscript-operator

int main(){
    int array[] = [10,20,30,40,50] ;
    printf("%d\n",-2[array -2]);
    return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释-2 [array-2]是如何工作的,为什么[]在这里使用?这是我的任务中的一个问题,它给输出"-10",但我不明白为什么?

Sou*_*osh 5

从技术上讲,这会调用未定义的行为.引用C11,章节§6.5.6

如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.[....]

所以,(array-2)是未定义的行为.

然而,大多数的编译器将读取的索引,并且将有可能能够以消除+2-2索引,[ 2[a]是相同a[2]是相同*(a+2),因此,2[a-2]*((2)+(a-2))],并且只考虑剩余的表达进行评估,其是*(a)或,a[0].

然后,检查运算符优先级

-2[array -2]实际上是一样的-(array[0]).因此,结果是价值array[0]-ved.