大家好,任何人都可以解释为什么这个程序正确甚至有点像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;
}
为什么程序编译正确?
答案 0 :(得分:6)
表达式(涉及基本类型),例如:
x[y]
在编译时转换为:
*(x + y)
x + y
与y + x
因此:*(x + y)
与*(y + x)
因此:x[y]
与y[x]
答案 1 :(得分:1)
在你的程序中,你试图将数组索引到其边界之外。这可能会导致 Segmentation Violation 错误,这意味着在您的程序中,CPU尝试访问无法物理寻址的内存(认为它没有为数组分配,因为它超出了它的范围)。此错误是运行时错误,这意味着编译器不负责检查它,但是它会在硬件通知后从操作系统引发。编译器的“错误”职责是词法和语法错误检查,以便将代码正确编译为机器代码,最后是二进制文件。
有关分段违规错误或分段错误的详细信息,请参阅此处:
答案 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)..