C++ 这两个作业有什么区别?

C++ 这两个作业有什么区别?,c++,arrays,C++,Arrays,下面是一种为数组赋值的方法 char s[2][2]; s[0][0] = 1; s[0][1] = 2; s[1][0] = 3; s[1][1] = 4; cout << s[0][2]; chars[2][2]; s[0][0]=1; s[0][1]=2; s[1][0]=3; s[1][1]=4; couts[j][i]; } CUT> P> >使C和C++快速的一个原因是它不< /强>检查是否越过数组的边界。< /P> 相反,你得到了。当你触发这个,任何事情都可能发生。您

下面是一种为数组赋值的方法

char s[2][2];
s[0][0] = 1;
s[0][1] = 2;
s[1][0] = 3;
s[1][1] = 4;
cout << s[0][2];
chars[2][2];
s[0][0]=1;
s[0][1]=2;
s[1][0]=3;
s[1][1]=4;
couts[j][i];
}

CUT> P> >使C和C++快速的一个原因是它<强>不< /强>检查是否越过数组的边界。< /P> 相反,你得到了。当你触发这个,任何事情都可能发生。您的程序可能会崩溃,看起来工作正常,或者可能会产生奇怪的结果


首先,它不应该抱怨我们使用的数组超出了它的索引吗

不可以。该标准没有规定,如果使用数组超出范围,程序应进行投诉。该标准规定该行为未定义

第二,为什么会有这么大的差异


这种行为没有定义。在这两种情况下。

s[0][2]
不是数组中的元素。尝试访问此元素会导致错误。一旦您输入了未定义的行为,就没有任何保证,您的程序可以做任何事情。您有非nul终止的字符串。您可以在数组的最后一个元素之后访问该数组。听起来像很多未定义的Baaviv. C++和C是不同的语言。您的代码不在它们的交叉点。标记已编辑。@Gerhardh他打印的是单个字符,而不是
char*
。不需要字符串终止符。“难道它不应该抱怨我们使用的数组超出了它的索引吗?”不-你可以自食其果。所以在某些情况下,第二个代码无法确定?@DenisKa在这两种情况下,你不能依赖结果<代码> s [ 0 ] [ 2 ] < /COD>不是有效的数组索引。@ dBue>代码> S [0 ] [2 ] < /C> >等效于<代码> S[1 ] [0 ] < /C> >,因为C++需要多维数组的行主存储。
 char s[2][2];
for (int i = 0, j = 0; i <= 2; i++){
    if(i == 2)
    {
        j++;
        i = 0;
    }
    if(j == 2) break;
    cin >> s[j][i];
}
cout << s[0][2];