2013-07-23 57 views

回答

4

ab之一必须是指针,而另一个必须是任何整数类型。证明如下。

a[b]由于是相同的(*((a)+(b)))的每个C 2011(n1570)6.5.2.1 2,ab可以使得后者表达式定义的任何类型。

根据6.5.3.2 2,一元运算符*运算符必须具有指针类型。因此,(a)+(b)的结果必须具有指针类型。

每6.5。在图6中,二进制运算符接受各种类型的组合,但是唯一产生指针类型的组合是指针和整数的组合,如6.5.6所述8.

根据6.5.6 8,一个整数可以被添加到一个指针,并且结果具有指针操作数的类型。第6.5.6条对+的操作数的顺序没有区别,因此它们可以按任何顺序排列。因此,ab之一可能是指针,而另一个将是整数。

+1

+1用于演示。 – Xaqq

+0

我会一直比较喜欢'[]'里面的'int',因为它最流行,也是'int [array]'不如base/index清晰。第二个'array [++ i]'对我来说是理解的,但是'++ i [array]'不是(传染都是不一样的),而且'array [array [array]'是错误的。 –

+0

只有当你可以假设你的数组不是很大时,这几乎总是真的(除非当然不是这样)。见http://ewontfix.com/9/ :) – loreb

0

b被称为索引这是一个数字。所以你可以把它作为整数处理。 a[b]将访问b数组a的第th个元素。

*(a + b)将在(a + (b * sizeof(data type of array element)))

0

给值少数种类可以正常工作,由于隐式转换。

A char将被提升为intintunsigned int也可以工作。 shortunsigned short也是有效的类型。

即使a[b]相同*(a + b)b不能是一个指针,因为a已经是一个指针。二元运算符+不接受两个指针。

+1

当'a'是任何整数类型,'b'是指针时,表达式'a [b]'在C中是合法的,反之亦然。二进制'+'运算符确实接受指针和整数或整数和指针。 –

+0

@EricPostpischil现在编辑清楚,我的意思是两个指针。你的评论是真实的,但我从来没有反对过它。 – Xaqq

5

从C标准(ISO/IEC 9899:TC2)二段6.5.2.1数组下标

后缀表达式,随后在方括号[]一个表达式是一个下标一个指定 数组对象的元素。下标运算符[] 的定义是E1[E2](*((E1)+(E2)))相同。因为 适用于二元+运算,如果E1是一个数组对象(等同于一个指针数组对象的 初始元件)和E2是整数转换规则的,E1[E2]指定的E2-th 元件E1(从零开始计数)。

+0

假设,会长时间工作吗?或者它会被转换为整数? – zztops

+0

@zztops:任何整数类型都可以工作,包括“long”。 –

相关问题