关于结构体

灌水区

happy_zero @ 2024-06-20 19:40:39

定义结构体,里面的数组/变量会自动赋值为 0 吗?有什么条件吗?

比如下面这段代码:

#include <bits/stdc++.h>
using namespace std;
struct node {
    int w, id;
};
void query(int k, int l, int r, int L, int R) {
    if (L <= l && r <= R) return;
    int m = l + r >> 1; node res; cout << res.w << ' ' << res.id << '\n';
    if (L <= m) query(k << 1, l, m, L, R);
    if (R > m) query(k << 1 | 1, m + 1, r, L, R);
}
signed main() {
    for (int i = 1; i <= 3; i++) 
        query(1, 1, 3, i, 3);
    return 0;
}

这段代码的输出在洛谷 ide c++14 没开 O2 的时候的输出:

0 0
32764 4210080
0 0

每次中间那行的数还不一样。但是开 O2 就全是 0(正确)。但是尝试直接在主函数里定义 3 遍输出 3 遍是没问题的。以前我都直接定义不赋值的,一直都没有问题,求助为什么上面会这样(还是说我其他地方有问题)?


by oyoham @ 2024-06-20 19:43:26

好像不会,我定义矩阵时不清零会错


by Dyd本人 @ 2024-06-20 19:43:58

你可以这样

struct node {
    int w = 0, id = 0;
};

可以保证默认为 0 否则,在函数内申请的空间默认值是随机的


by Dyd本人 @ 2024-06-20 19:44:39

@happy_zero


by happy_zero @ 2024-06-20 19:49:04

@Dyd本人 那就是说局部要赋值,全局不用?


by zjzx_wcj @ 2024-06-20 19:51:34

@happy_zero 可以这样:

struct node{
  int w,id;
  node () {}
};

by happy_zero @ 2024-06-20 19:52:52

@Dyd本人 但那样好像定义大数组时会很慢,而且不能直接用 = {} 了欸


by zjzx_wcj @ 2024-06-20 19:54:44

@happy_zero @happy_zero @happy_zero @happy_zero @happy_zero


by happy_zero @ 2024-06-20 19:55:35

@happy_zero 呸好像不会变慢但后面那个不能用


by happy_zero @ 2024-06-20 19:57:30

@zjzx_wcj 那么写好像没办法赋值,我知道的是这样:

struct node{
  int w,id;
  node () {w = id = 0;}
};

但同样没办法直接用 ={} 赋值


by happy_zero @ 2024-06-20 20:00:36

翻了翻以前的代码试了一下,但好像确实要这么写。。。


| 下一页