C++ 在c+中处理int数组+;2.

C++ 在c+中处理int数组+;2.,c++,cout,C++,Cout,嗨,伙计们,有人能解释一下为什么这个程序是正确的,即使是有点开始的: 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; } intmain() { int数组[7]={5,7,57,77,55,2,1}; 对于程序中的(int i=0;i,您试图将

嗨,伙计们,有人能解释一下为什么这个程序是正确的,即使是有点开始的:

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;
}
intmain()
{
int数组[7]={5,7,57,77,55,2,1};

对于程序中的(int i=0;i,您试图将数组索引超出其界限。这可能会导致分段冲突错误,这意味着在程序中,CPU试图访问无法物理寻址的内存(认为它没有分配给数组,因为它超出了它的界限)。此错误是一个运行时错误,这意味着编译器不负责检查此错误,但会在硬件通知后从操作系统中引发。编译器的“错误”责任是词法和语法错误检查,以便将代码正确编译为机器码并最终y、 二进制的

有关分段冲突错误或分段错误(通常称为分段错误)的更多信息,请参见此处:


在您的程序中,您试图将数组索引超出其界限。这可能会导致分段冲突错误,这意味着在您的程序中,CPU试图访问无法物理寻址的内存(认为它没有分配给数组,因为它超出了其界限)。此错误是一个运行时错误,这意味着编译器不负责检查此错误,但会在硬件通知后从操作系统中引发。编译器的“错误”责任是词法和语法错误检查,以便将代码正确编译为机器码并最终y、 二进制的

有关分段冲突错误或分段错误(通常称为分段错误)的更多信息,请参见此处:

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

x[y]
在编译时转换为:

*(x + y)
x+y
y+x

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

因此:
x[y]
y[x]
一个表达式(涉及基本类型)相同,例如:

x[y]
在编译时转换为:

*(x + y)
x+y
y+x

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


因此:
x[y]
y[x]相同

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

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


简单地说,一个具有未定义行为的程序不是一个有效的C++程序。对于整个程序来说,这是正确的,而不仅仅是在未定义的行为之后。编译器将完全自由地编译程序到NO-op.< /P> < P>您遇到过“强>未定义的行为< /强>。这意味着编译器被允许做W。它可以在没有警告或错误的情况下编译程序。此外,对于未定义的行为,它可以生成它想要的任何代码,包括假设它不发生(一种常见的优化)。访问超出边界的数组是未定义行为的一个示例。有符号整数溢出、数据争用和无效指针创建/使用是其他行为

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


简单地说,一个具有未定义行为的程序不是一个有效的C++程序。对于整个程序,这是正确的,不仅仅是在未定义的行为之后。编译器将完全自由地编译程序到NO-op.< /P> < P> >添加到Benjamin Lindley,编译下面的代码,您将看到地址是如何计算的:

int main()
{

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

cout<<&(array[0])<<endl;
cout<<&(array[1])<<endl;
return 0;
}
intmain()
{
int数组[7]={5,7,57,77,55,2,1};

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

int main()
{

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

cout<<&(array[0])<<endl;
cout<<&(array[1])<<endl;
return 0;
}
intmain()
{
int数组[7]={5,7,57,77,55,2,1};

coutSome编译器会在代码中检测到明显的逻辑错误,但这不是它们的主要工作。编译器可能会捕捉到您的示例,但这取决于每个编译器寻找什么。如果使用std::vector,调试器会在访问越界时警告您。某些编译器会在代码中检测到明显的逻辑错误,但事实并非如此他们的主要工作。你的示例可能会被编译器捕获,但这取决于每个编译器寻找什么。如果你使用std::vector,调试器在访问越界时会警告你。好的,但是x是指向数组第一个元素的常量字符指针,那么当你添加一个整数时,我们如何将整数“y”和指向字符“x”的指针相加(假设:N)指向一个指针(假设:P),你会得到一个指向元素的指针,该元素与P指向的元素相差N个元素。好的,但是x是指向数组第一个元素的常量字符指针,那么当你向指针(假设:P)添加一个整数(假设:N)时,我们如何将整数“y”和指向字符“x”的指针相加,则会得到一个指针,该指针指向与P指向的元素相距N个元素的元素。