陈尚涵 发表于 2023-8-4 14:28:53

我很好奇

众所周知,c++二维数组可以这样写:
int a;
但是我今天发现,这样写也不会报错?
int a = {0};
并且a也不是0,这是怎么回事???0去哪了?
@高山 @元豪 @zhangjinxuan @liuhongrun2022 @编程追风梦

zhangjinxuan 发表于 2023-8-4 14:28:54

#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:29:08

本帖最后由 学习编程中的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:}

isdkz 发表于 2023-8-4 14:29:08

这是因为在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


希望能帮到你!如果还有其他问题,请随时提问。

Mike_python小 发表于 2023-8-4 14:29:14

问题:为什么在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。

学习编程中的Ben 发表于 2023-8-4 14:35:01

不对啊,我记得这样写是初始化为0啊

歌者文明清理员 发表于 2023-8-4 14:35:31

a是0啊

学习编程中的Ben 发表于 2023-8-4 14:39:31

https://img1.imgtp.com/2023/08/04/qfsYJzh3.png
给个最佳答案呗!求你了!!!{:10_254:}

zhangjinxuan 发表于 2023-8-4 14:43:27

本帖最后由 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:54:53

本帖最后由 编程追风梦 于 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 15:11:03

编程追风梦 发表于 2023-8-4 14:54
长话短说,就撒原因:

1.就是零,要么你眼花了,要么你计算机眼花了


兄弟咱就是说,咱们说的不是一件事,你在讲怎么初始化默认值全是0,不然怎么怎么样,我都懂,就是不懂那个0哪去了,有人帮我解答了

陈尚涵 发表于 2023-8-4 15:11:47

zhangjinxuan 发表于 2023-8-4 14:28
数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。

懂了,是线性的,原来如此

isdkz 发表于 2023-8-4 15:15:29

zhangjinxuan 发表于 2023-8-4 14:28
数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。

我很好奇,你怎么比脚本还快{:10_257:}

zhangjinxuan 发表于 2023-8-4 15:20:18

isdkz 发表于 2023-8-4 15:15
我很好奇,你怎么比脚本还快

哪里比脚本快?

肯定是脚本有问题{:10_256:}

isdkz 发表于 2023-8-4 15:24:07

zhangjinxuan 发表于 2023-8-4 15:20
哪里比脚本快?

肯定是脚本有问题

不可能吧,脚本应该在十几秒内就回复了,但是你为什么在二楼的位置,难不成你看帖子思考加打字的时间就十几秒{:10_257:}

zhangjinxuan 发表于 2023-8-4 15:25:11

isdkz 发表于 2023-8-4 15:24
不可能吧,脚本应该在十几秒内就回复了,但是你为什么在二楼的位置,难不成你看帖子思考加打字的时间就十 ...

https://fishc.com.cn/forum.php?mod=viewthread&tid=229010

isdkz 发表于 2023-8-4 15:27:47

zhangjinxuan 发表于 2023-8-4 15:25
https://fishc.com.cn/forum.php?mod=viewthread&tid=229010

好吧,看来是系统bug,有时候被设为最佳不会被改成2楼的

编程追风梦 发表于 2023-8-4 15:51:35

陈尚涵 发表于 2023-8-4 15:11
兄弟咱就是说,咱们说的不是一件事,你在讲怎么初始化默认值全是0,不然怎么怎么样,我都懂,就是不懂那 ...

呜呜呜,好吧
页: [1]
查看完整版本: 我很好奇