数组、索引数组、编译器特性或语言特性的可能性。第二个怎么可能?
发布于 2009-05-25 07:30:03
编译器将转
index[array]转到
*(index + array)如果使用普通语法,就会发生变化。
array[index]转到
*(array + index)因此,您可以看到,这两个表达式的计算值相同。这对于C和C++都适用。
发布于 2009-05-25 07:29:09
从C的早期开始,表达式a[i]就是添加到i中的一个地址(按a的大小进行缩放),然后取消引用。事实上,所有这些都是等同的:
a[i]
i[a]
*(a+i)==== 我唯一关心的就是真正的离题。虽然它们都生成相同的地址,但如果
a和i的类型不同,则取消引用可能会引起关注。 例如:
int i = 4;
long a[9];
long x = a[i]; //get the long at memory location X.
long x = i[a]; //get the int at memory location X?我还没有真正测试过这种行为,但这是你可能需要注意的事情。如果它确实改变了被取消引用的内容,那么它可能也会导致对象数组的各种问题。 ====
更新:
您可能可以安全地忽略=====行之间的位。我在Cygwin下做了短时间和长时间的测试,看起来还不错,所以我想我的担心是没有根据的,至少在基本的情况下是这样。我仍然不知道更复杂的事情会发生什么,因为这不是我想要做的事情。
发布于 2009-05-25 08:59:20
正如Matthew在http://www.imperfectcplusplus.com/中所讨论的那样,可以通过防止在定义下标运算符的类型的实例中使用DIMENSION_OF()-like宏来执行C++中的类型安全,如下所示:
#define DIMENSION_OF_UNSAFE(x) (sizeof(x) / sizeof((x)[0]))
#define DIMENSION_OF_SAFER(x) (sizeof(x) / sizeof(0[(x)]))
int ints[4];
DIMENSION_OF_UNSAFE(ints); // 4
DIMENSION_OF_SAFER(ints); // 4
std::vector v(4);
DIMENSION_OF_UNSAFE(v); // gives impl-defined value; v likely wrong
DIMENSION_OF_SAFER(v); // does not compile对于处理指针,还有更多,但这需要一些额外的模板智能。查看STLSOFT_NUM_ELEMENTS()在STLSoft库中的实现,并阅读http://www.imperfectcplusplus.com/第14章中的所有相关内容。
编辑:一些评论者建议,实现不拒绝指针。它确实(以及用户定义的类型),如下面的程序所示。您可以通过未注释的第16行和第18行来验证这一点。(我刚刚在Mac/ on 4上这样做,它拒绝这两种形式)。
#include <stlsoft/stlsoft.h>
#include <vector>
#include <stdio.h>
int main()
{
int ar[1];
int* p = ar;
std::vector<int> v(1);
printf("ar: %lu\n", STLSOFT_NUM_ELEMENTS(ar));
// printf("p: %lu\n", STLSOFT_NUM_ELEMENTS(p));
// printf("v: %lu\n", STLSOFT_NUM_ELEMENTS(v));
return 0;
}https://stackoverflow.com/questions/905724
复制相似问题