1

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

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

4 回答 4

6

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

x[y]

在编译时转换为:

*(x + y)

x + y是相同的y + x

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

因此:x[y]y[x]

于 2013-08-20T01:28:25.880 回答
1

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

有关众所周知的Segmentation Violation error 或Segmentation Fault的更多信息,请查看此处:

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

于 2013-08-20T01:23:03.303 回答
0

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

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

简而言之,具有未定义行为的程序不是有效的 C++ 程序。对于整个程序都是如此,而不仅仅是在未定义的行为之后。编译器可以完全免费地将您的程序编译为无操作。

于 2013-08-20T02:10:45.920 回答
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

它只是 &(array+0) 和 &(array+1)..

于 2013-08-20T06:07:48.820 回答