在c ++ 2中处理int数组

时间:2013-08-20 01:13:16

标签: c++ cout

大家好,任何人都可以解释为什么这个程序正确甚至有点像starnge:

int main()
{

int array[7]={5,7,57,77,55,2,1};

for(int i=0;i<10;i++)
   cout<<i[array]<<", "; //array[i]
cout<<endl;

return 0;
}

为什么程序编译正确?

4 个答案:

答案 0 :(得分:6)

表达式(涉及基本类型),例如:

x[y]

在编译时转换为:

*(x + y)

x + yy + x

相同

因此:*(x + y)*(y + x)

相同

因此:x[y]y[x]

相同

答案 1 :(得分:1)

在你的程序中,你试图将数组索引到其边界之外。这可能会导致 Segmentation Violation 错误,这意味着在您的程序中,CPU尝试访问无法物理寻址的内存(认为它没有为数组分配,因为它超出了它的范围)。此错误是运行时错误,这意味着编译器不负责检查它,但是它会在硬件通知后从操作系统引发。编译器的“错误”职责是词法和语法错误检查,以便将代码正确编译为机器代码,最后是二进制文件。

有关分段违规错误或分段错误的详细信息,请参阅此处:

http://en.wikipedia.org/wiki/Segmentation_fault

答案 2 :(得分:0)

您遇到了未定义的行为。这意味着允许编译器对您的程序执行任何操作 - 包括编译它而不会出现警告或错误。此外,它可以为未定义行为的情况生成它想要的任何代码,包括假设它不会发生(常见的优化)。访问数组越界是未定义行为的一个示例。其他是有符号整数溢出,数据争用和无效指针创建/使用。

理论上,编译器可以发出调用shell并执行rm -rf / *的代码(删除你有权删除的每个文件)!当然,没有合理的编译器可以做到这一点,但你明白了。

简单地说,具有未定义行为的程序不是有效的C ++程序。这对整个程序来说都是如此,而不仅仅是在未定义的行为之后。编译器可以完全自由地将程序编译为无操作。

答案 3 :(得分:0)

添加到Benjamin Lindley,编译以下代码,您将看到如何计算地址:

int main()
{

int array[7]={5,7,57,77,55,2,1};

cout<<&(array[0])<<endl;
cout<<&(array[1])<<endl;
return 0;
}

输出:(对我来说);-) 0x28ff20 0x28ff24

它只是&amp;(数组+ 0)和&amp;(数组+ 1)..