错误的数组索引不会导致错误

Max*_*ers 0 c arrays indexing comma-operator

考虑以下程序:

#include <stdio.h>
int main(void)
{
    int a[] = {1, 2, 3};

    for (size_t i = 0; i < 3; i++)
        printf ("%i\n", a[0, i]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

显然,a例如在Python中,像二维数组一样访问一维数组。但是,此代码的确带有unused-value警告。我希望它会产生错误,因为我一直认为这是因为在C中多索引是完全错误的(请参见K&R第112页)。令我惊讶的是,以上代码确实打印出了数组元素。

如果将a[0, i]第六行更改为a[i, 0],则第一个数组元素将被打印3次。如果您使用a[i, 1]第二个元素,则将打印三遍。

如何将一维数组上语法错误的多索引转换为指针算术,并且a[i, 0]未使用结果的什么值?

而且,是的,我知道如何在C中进行多索引。

Eri*_*hil 8

0, i是C中的有效表达式。逗号是一个运算符,它同时计算两个操作数并丢弃左操作数的结果。当用于时a[0, i],它等效于a[i]。和a[i, 0]等效于a[0]

(请注意,在诸如之类的函数调用中f(a, b, c),逗号是参数分隔符。这是C语法的不同部分,在这种情况下,逗号不是运算符。)