我很好奇
众所周知,c++二维数组可以这样写:int a;
但是我今天发现,这样写也不会报错?
int a = {0};
并且a也不是0,这是怎么回事???0去哪了?
@高山 @元豪 @zhangjinxuan @liuhongrun2022 @编程追风梦
#include <bits/stdc++.h>
using namespace std;
int main() {
int a = {0, 1, 2, 3, 4, 5, 6, 7, 8};
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
printf("%d ", a);
}
puts("");
}
return 0;
}
数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。 本帖最后由 学习编程中的Ben 于 2023-8-4 14:34 编辑
问题:为什么在C++中使用 int a = {0}; 声明二维数组后,a 不是 0?
在C++中,当你声明一个二维数组并使用大括号进行初始化时,只有第一个维度的元素会被初始化为指定的值,而剩余的元素会被默认初始化为0。因此,对于 int a = {0}; ,a 并不是0,而是剩余元素都被默认初始化为0。
这是因为C++对于多维数组的初始化有特殊的规定。大括号初始化只会作用于数组的第一维,对于剩余维度的元素,默认初始化规则适用。
如果你希望所有的元素都被初始化为0,可以使用以下代码:
int a = {{0}};
这样,在大括号内的0会递归地应用于每一个元素,确保整个二维数组中的元素都被初始化为0。
请注意,如果二维数组的元素类型不是基本数据类型(例如对象),默认初始化规则可能会有所不同,具体取决于元素类型的构造函数和默认构造函数的定义。
如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}
这是因为在C++中,如果你声明一个数组并且为其提供了初始值,但是提供的初始值少于数组的大小,那么剩余的元素将会被默认初始化为0。
在你的例子中,你声明了一个100x100的二维数组 a ,并且为其提供了初始值 {0} 。这个初始值将会被用来初始化数组的第一个元素 a ,而剩余的元素将会被默认初始化为0。所以 a 是0,而其他的元素也都是0。
如果你想将数组的所有元素都初始化为0,你可以使用以下两种方法:
1. 使用循环来逐个赋值:
int a;
for(int i = 0; i < 100; i++) {
for(int j = 0; j < 100; j++) {
a[ i] = 0;
}
}
2. 使用初始化列表来初始化数组:
int a = {{0}};// 所有元素都被初始化为0
希望能帮到你!如果还有其他问题,请随时提问。 问题:为什么在C++中 int a = {0} 的情况下,a不是0?
在C++中,当你声明并初始化二维数组时,只提供一个初始值时,该初始值将被用于所有元素。因此,在你的示例中,int a = {0} 表示将所有元素初始化为0。
然而,a 并不是指向整个二维数组的第一行,而是指向数组中的第一个一维数组(即 a)。因此,a 的值实际上是第一个一维数组的地址,而不是它的内容。
如果你打印出 a 的值,你将看到它是一个指针,指向 a 的地址。要访问和修改特定的元素,你需要使用双重索引,如 a、a 等。
以下是一个示例代码,演示了这个问题:
#include <iostream>
using namespace std;
int main() {
int a = {0};
cout << a << endl;// 输出第一个一维数组的地址
return 0;
}
输出结果可能类似于:0x7ffc5caf5e40
如果你想将 a 指向的一维数组中的所有元素都初始化为0,你可以使用循环来逐个初始化,例如:
int a;
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
a = 0;
}
}
这样可以确保每个元素都被正确初始化为0。 不对啊,我记得这样写是初始化为0啊 a是0啊 https://img1.imgtp.com/2023/08/04/qfsYJzh3.png
给个最佳答案呗!求你了!!!{:10_254:} 本帖最后由 zhangjinxuan 于 2023-8-4 14:45 编辑
并且a也不是0,这是怎么回事???0去哪了?
你这个实验不严谨额
#include <bits/stdc++.h>
using namespace std;
int main() {
int a = {114514};
printf("%d\n", a);
return 0;
}
输出的仍然是 114514。
而且对于二维数组而言,a 是一个指针好不好
本帖最后由 编程追风梦 于 2023-8-4 14:59 编辑
长话短说,就撒原因:
1.就是零,要么你眼花了,要么你计算机眼花了
2. 为啥是零?来你看看这段代码来:“int a”这行代码声明了一个二维整数数组a,有100行和100列,但是你没明确地初始化数组,所以显然!数值未定义,你要是不懂的话,换句话说就是它的元素值是不确定的,可能是垃圾值,那么这个时候a值不确定,因为它们有可能是随机值啊,这就好比你从地下捡起来个苹果,而且还是被咬一口的,你说你吃不吃吧(疫情期间)
3.还没明白你看这个: “int a = {0}”看见问题没?这行代码生命的东东跟上边一样,同时用0初始化了数组的所有元素,但是你注意你这里面用了单个0,不是两层括号的写法,所以即便你没有为每个元素都设定准确的初始值,但是这种写法还是会将数组所有元素都初始化为0
打个比方,a、a、a,以及其他所有元素初始化为0,
然后a、a、a等等,也都被初始化为0,众所周知这玩意叫零初始化
好那么现在如果你不对数组进行初始化,数组的元素值就是未定义的,可能是任意的随机值,也就是你吃了那个苹果,你有一定的概率去找上帝愉快地玩耍,也有概率去医院办至尊VIP年卡,所以,为了确保数组中的元素有明确定义的值,也为了确保你能在家老老实实的做作业不去办卡也不去玩耍,建议在声明数组时进行初始化,也建议你把那个苹果扔了,或者在之后对每个元素明确赋值
哦对了,你要是查明白这个苹果没毒,咱商量商量,你送我行不?
求求给个最佳答案!别人都有了,我这个月还没业绩呢~呜呜呜
编程追风梦 发表于 2023-8-4 14:54
长话短说,就撒原因:
1.就是零,要么你眼花了,要么你计算机眼花了
兄弟咱就是说,咱们说的不是一件事,你在讲怎么初始化默认值全是0,不然怎么怎么样,我都懂,就是不懂那个0哪去了,有人帮我解答了 zhangjinxuan 发表于 2023-8-4 14:28
数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。
懂了,是线性的,原来如此 zhangjinxuan 发表于 2023-8-4 14:28
数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。
我很好奇,你怎么比脚本还快{:10_257:} isdkz 发表于 2023-8-4 15:15
我很好奇,你怎么比脚本还快
哪里比脚本快?
肯定是脚本有问题{:10_256:} zhangjinxuan 发表于 2023-8-4 15:20
哪里比脚本快?
肯定是脚本有问题
不可能吧,脚本应该在十几秒内就回复了,但是你为什么在二楼的位置,难不成你看帖子思考加打字的时间就十几秒{:10_257:} isdkz 发表于 2023-8-4 15:24
不可能吧,脚本应该在十几秒内就回复了,但是你为什么在二楼的位置,难不成你看帖子思考加打字的时间就十 ...
https://fishc.com.cn/forum.php?mod=viewthread&tid=229010 zhangjinxuan 发表于 2023-8-4 15:25
https://fishc.com.cn/forum.php?mod=viewthread&tid=229010
好吧,看来是系统bug,有时候被设为最佳不会被改成2楼的 陈尚涵 发表于 2023-8-4 15:11
兄弟咱就是说,咱们说的不是一件事,你在讲怎么初始化默认值全是0,不然怎么怎么样,我都懂,就是不懂那 ...
呜呜呜,好吧
页:
[1]