Tag: 语言 律师

表达式的定义行为

C99标准以6.5.2美元计价。 在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。 此外, 先前的值应该是只读的,以确定要存储的值 。 (我强调) 它继续指出,以下示例是有效的(一开始看似很明显) a[i] = i; 虽然它没有明确说明我和i是什么。 虽然我相信它没有,但我想知道这个例子是否涵盖以下情况: int i = 0, *a = &i; a[i] = i; 这不会更改i的值,而是访问i的值以确定放置值的地址。 或者我们为i分配一个已经存储在i的值是无关紧要的? 请说清楚。 奖金问题; 那a[i]++或a[i] = 1怎么样?

对多维数组的一维访问:它是明确定义的行为吗?

我想我们都同意,通过以一维方式解引用(可能是偏移的)指向其第一个元素的指针来访问真正的多维数组被认为是惯用的C,例如: void clearBottomRightElement(int *array, int M, int N) { array[M*N-1] = 0; // Pretend the array is one-dimensional } int mtx[5][3]; … clearBottomRightElement(&mtx[0][0], 5, 3); 然而,我的语言律师需要说服这实际上是明确定义的C! 特别是: 标准是否保证编译器不会在例如mtx[0][2]和mtx[1][0]之间插入填充? 通常,索引关闭数组的末尾(除了结尾之外)是未定义的(C99,6.5.6 / 8)。 所以以下内容显然未定义: struct { int row[3]; // The object in question is an int[3] int other[10]; } foo; int *p = &foo.row[7]; // ERROR: A […]