Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 来自2D数组的意外初始化结果_C++_Arrays_Initialization - Fatal编程技术网

C++ 来自2D数组的意外初始化结果

C++ 来自2D数组的意外初始化结果,c++,arrays,initialization,C++,Arrays,Initialization,要初始化2D数组,通常可以这样做: int matrix[3][4] = { {1,1,1,1}, {2,2,2,2}, {3,3,3,3} }; 然而,当我使用各种组合进行测试时,以下代码的编译超出了我的预期: int matrix[3][4] = {1,2,3,4,5,6,7}; 当我以2D表格形式打印输出时,我得到: 1,2,3,4, 5,6,7,0, 0,0,0,0, 我理解为什么其余的值都是零 我的问题是:假设超过一行边界的数字总是“流动”到下一行,这是初始化2D数组的合法方法之

要初始化2D数组,通常可以这样做:

int matrix[3][4] = { {1,1,1,1}, {2,2,2,2}, {3,3,3,3} };
然而,当我使用各种组合进行测试时,以下代码的编译超出了我的预期:

int matrix[3][4] = {1,2,3,4,5,6,7};
当我以2D表格形式打印输出时,我得到:

1,2,3,4,
5,6,7,0,
0,0,0,0,
我理解为什么其余的值都是零


我的问题是:假设超过一行边界的数字总是“流动”到下一行,这是初始化2D数组的合法方法之一吗?或者这是我在C++中应该避免的另一个陷阱?

< P>是的,这是完全正确的。引述:

嵌套初始值设定项列表周围的大括号可以省略 (省略),在这种情况下,需要尽可能多的初始条款 用于初始化对应对象的每个成员或元素 子集合,以及随后的初始值设定项子句用于 初始化对象的以下成员

以及:

如果初始值设定项子句的数目小于 成员或初始值设定项列表完全为空,其余成员 由执行值初始化的空列表初始化


初始化
int
的值将其设置为
0

是的,这非常好。引述:

嵌套初始值设定项列表周围的大括号可以省略 (省略),在这种情况下,需要尽可能多的初始条款 用于初始化对应对象的每个成员或元素 子集合,以及随后的初始值设定项子句用于 初始化对象的以下成员

以及:

如果初始值设定项子句的数目小于 成员或初始值设定项列表完全为空,其余成员 由执行值初始化的空列表初始化


初始化
int
的值将其设置为
0

,这是完全合法的。标准化以来,它一直是C和C++的一部分。虽然你可能认为更明确的版本更容易阅读。@阿兰斯多克斯感谢你的回复,但我很惊讶地知道它是合法的,因为我认为它是编译的,因为C++没有检查界限,而且数字只是坐在下一个可用内存上。或者我可以这么说,因为下一个可用内存也是作为阵列的一部分“保留”的。这样做可以吗?@user3437460如果不检查边界,编译器如何将任何值设置为0?如果超出边界,将导致编译器错误。总结所有的初始化规则并不容易,所以我就离开这里。@user6276096-Hmm,是的,你是对的。它会在编译时检查初始化者的数量,这是完全合法的。标准化以来,它一直是C和C++的一部分。虽然你可能认为更明确的版本更容易阅读。@阿兰斯多克斯感谢你的回复,但我很惊讶地知道它是合法的,因为我认为它是编译的,因为C++没有检查界限,而且数字只是坐在下一个可用内存上。或者我可以这么说,因为下一个可用内存也是作为阵列的一部分“保留”的。这样做可以吗?@user3437460如果不检查边界,编译器如何将任何值设置为0?如果超出边界,将导致编译器错误。总结所有的初始化规则并不容易,所以我就离开这里。@user6276096-Hmm,是的,你是对的。它会在编译时检查初始值设定项的数量。