我想对visual studio C ++的立场进行正式解释,以及在创建数组时它的作用如下:
int a[3] = {1, 2, 3};
然后你做了类似的事情:
cout << a[4];
经过测试,它将打印出存储在该存储位置的垃圾。为什么它允许程序员这样做,而像javaScript这样的语言会阻止用户这样做?
通过不让编译器在C ++中禁止用户的这种行为,流行的哲学是什么?这是从C继承的吗?
这些只是我的一些小小的好奇心,也许回答的人可以告诉我在哪里可以找到这样的信息。关于正在发生什么的答案不是我要问的,而是我感兴趣的为什么。
谢谢。
答案 0 :(得分:2)
它与编译器无关,但语言是以允许的方式定义的。它将导致未定义的行为,但内容是不确定。
至于允许的原因,请考虑下标(数组索引)运算符的定义(来自ISO / IEC 14882:2011(E)§5.2.1/ 1 [expr.sub] ):
后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达式应具有“ 指向
相同(根据定义)T
”的类型,而另一个表达式应具有无范围的枚举或整数类型。结果是类型为“T
的左值”。类型“T
”应是完全定义的对象类型。表达式E1[E2]
与*((E1)+(E2))
[强调我的]
由于上述原因,所发生的是数组E1
被衰减为指向第一个元素的指针(即它等同于&(E1)[0]
),然后编译器执行指针算术{{1 }}。由于数组已经衰减为指针,因此不可能进行边界检查。