阵列的第二个维度尚不清楚。此数组的大小为48,其中int
为2个字节,但int a[6][4]
和int a[6][(2,2)]
之间的确切差异是什么?
答案 0 :(得分:14)
int a[6][4]
和inta[6][(2,2)]
的确切区别是什么?
有很大的不同。 int a[6][(2,2)]
大致相当于int a[6][2]
。 (2,2)
表达式涉及comma operator并评估为2
。
微妙的区别(参见@Virgile的评论)是(2,2)
不是C中的常量表达式。所以int a[6][(2,2)]
实际上是一个大小为6的数组可变长度数组< / em>的。从技术上讲,它确实等同于
int n = 2;
int a[6][n];
答案 1 :(得分:3)
在您的代码中
int a[6][(2,2)]
基本上是
int a[6][2];
说明强>
根据C11
标准,章节§6.5.17
,逗号运算符,
逗号运算符的左操作数被计算为void表达式;它的评估与右操作数之间存在一个序列点。然后评估右操作数;结果有其类型和价值。
int a[6][(2 , 2)];
^ ^
| |
[A] |
[B]
我们假设A
和B
是,
运算符的两个操作数。然后,顺序
A
评估为2
(作为void expression;
)。结果被丢弃。B
评估为2
。由于,
运算符具有右侧操作数的类型和值,因此最终结果为2
。基本上,int a[6][(2,2)];
变为int a[6][2];
答案 2 :(得分:1)
int a[6][(2,2)] = int a[6][2];
逗号(,
)运算符的识别率最低,因此您可以获得上面的数组。
你可以自己测试一下
int main(void) {
int a[6][4];
int b[6][(2,2)];
printf("%d\n",sizeof(int));
printf("%d %d\n",sizeof(a),sizeof(b));
return 0;
}
int x = (3,4);
那么您期望x
的价值是什么?
评估结果为x=4
同样适用于您的数组。