你能告诉我这是怎么回事

时间:2019-12-18 00:37:01

标签: c

此行中发生的事情:

-1[0[ptr]][0] 

1 个答案:

答案 0 :(得分:1)

从技术上讲,这是有效的C代码,但不值得这样写。考虑这个愚蠢的例子。

char v = array[3];

现在,我们可以用指针算法重写它。例如

char v = *(array + 3);

但是,由于加法是可交换的,因此这也是有效的:

char v = *(3 + array);

并且由于加法是可交换的,因此可以得出数组括号也是可交换的。因此,这在C语言中完全有效:

char v = 3[array];

如果您希望解开已发布的代码,则可以分步进行。...

float f0(float*** ptr)
{
    return -1[0[ptr]][0];
}
float f1(float*** ptr)
{
    return -1[ptr[0]][0];
}
float f2(float*** ptr)
{
    return -ptr[0][1][0];
}

这是它们相同的证明:

https://godbolt.org/z/_gSUXF

(f2和f3只会导致对f1的尾部调用)

/ edit我想问这个问题对你如此严厉地惩罚是有点不公平的。实际上,这是一个很少有人知道的C / C ++怪癖。