Диапазон индексов не по умолчанию инициализируется в массивах в C ++ - PullRequest
0 голосов
/ 01 июля 2018

Ниже приведен код, который я пытаюсь запустить

#include<bits/stdc++.h>
using namespace std;

int main()
{
    bool x[101010];
    for(int i=0;i<101010;i++)
    {
        if(x[i])
            cout<<i<<" ";
    }
    return 0;
}

Насколько я знаю, значением по умолчанию для переменных логического типа является false . Однако для вышеприведенного кода из индекса 94758-101008 печатается значение i , что означает, что они по умолчанию инициализируются как true.

Может кто-нибудь помочь мне выяснить, где я иду не так?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Ваша проблема может быть уменьшена до этого:

bool x;
std::cout << x;

Логическое значение является фундаментальным типом. По умолчанию инициализирующие автоматические переменные фундаментального типа оставляют их с неопределенными значениями. Не false, но неопределенный. Использование этих значений приводит к неопределенному поведению. Это то, что вы видите.

Причина, по которой вы видите случайные значения, заключается в том, что «за кулисами» логический тип является целочисленным типом, для которого компилятор применяет только два значения. Но если вы не инициализируете его подробно, вы получите любой случайный мусор из этой памяти.

Решение состоит в том, чтобы явно инициализировать значение ваших переменных. Для массива это будет выглядеть так:

bool x[101010]{};

Это будет рекурсивно инициализировать значение каждого элемента массива, а для инициализации значения bool действительно , чтобы установить его на false.

0 голосов
/ 01 июля 2018

значение по умолчанию переменных логического типа: false .

Это не правда здесь. Для инициализация по умолчанию ,

  • если T является типом класса non-POD (until C++11), конструкторы рассматриваются и подвергаются разрешению перегрузки для пустого списка аргументов. Выбранный конструктор (который является одним из конструкторов по умолчанию) вызывается для предоставления начального значения для нового объекта;
  • если T является типом массива, каждый элемент массива инициализируется по умолчанию;
  • в противном случае ничего не делается: объекты с автоматической продолжительностью хранения (и их подобъекты) инициализируются неопределенными значениями.

x объявлен как локальный объект с автоматической продолжительностью хранения, и это массив с не классовым типом; тогда значения всех элементов x будут неопределенными значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...