C 错误的数组索引不会导致错误
考虑以下计划:C 错误的数组索引不会导致错误,c,arrays,indexing,comma-operator,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; } 显然,在例如Python中,访问一维数组a就像访问二维数组一样。但是,此代码编译时会出现未使用值警告。我希望它会产生一个错误,因为我一直认为这对于C中的多重索引是错误的
#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;
}
显然,在例如Python中,访问一维数组a就像访问二维数组一样。但是,此代码编译时会出现未使用值警告。我希望它会产生一个错误,因为我一直认为这对于C中的多重索引是错误的,请参见K&R第112页。令我惊讶的是,上面的代码确实打印出了数组元素
如果将第六行的[0,i]更改为[i,0],则第一个数组元素将打印三次。如果使用[i,1],第二个元素将打印三次
一维数组上语法错误的多索引如何转换为指针算术,以及[i,0]的结果的哪个值未使用
是的,我知道如何在C中进行多重索引。0,我在C中是一个有效的表达式。逗号是一个运算符,用于计算两个操作数并丢弃左操作数的结果。在[0,i]中使用时,它相当于[i]。a[i,0]等于a[0]
注意,在fa、b、c等函数调用中,逗号是参数分隔符。这是C语法的一个不同部分,逗号在此上下文中不是运算符。此处的逗号是运算符。它不是一个理想的[0][i]或[i][0]形式的多重索引
引用C11,第§6.5.17章
逗号运算符的左操作数作为空表达式计算;有一个
其求值与右操作数求值之间的序列点。然后右转
计算操作数;结果有其类型和值
所以,在你的情况下
a[0, i]
与
a[i]
及
与
a[0]
您混淆了逗号运算符a、b和多维数组索引[a][b]。
a[0]