Можно ли выяснить присвоено ли значение переменной C++

Код описывающий мою проблему:

#include <iostream>
using namespace std;

int main()
{
    const int size = 10;
    int a[size];
    a[0] = 5;
        for (size_t i = 0; i < size; i++)
            cout << (a[i] == empty() ? 0 : a[i]);
}

Функция empty() - какая либо проверка на проинициализированность переменной. Можно ли выяснить каким либо образом, что переменной присвоили значение без использования нижних границ (то бишь, если в массиве должны положительные числа то элемента массива можно проинициализировать нулями)?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Массив a не инициализирован. Стандарт прямо запрещает читать неинициализированные данные. Следовательно, у вас нет законного способа проверить есть там что-то или нет (в отличие от JavaScript с его undefined).

Но можно сделать так: int a[size] = {0};. Это специальная нотация, которая заполнит массив нулями. Теперь вы можете проверять его ячейки до присваивания значений элементам.

Пара замечаний вдогонку:

int a[size] = {0}; это действительно специальная нотация. Например int a[size] = {1}; не будет заполнять всё единицами, а заполнит первый элемент единицей, а остальные нулями. Ноль можно опустить в C++ (в C нельзя): int a[size] = {}; - всё будет заполнено нулями.

Ничего стандарт не запрещает конечно. Обращение к неинициализированной переменной порождает неопределённое поведение (undefined behaviour). То есть, авторы стандарта не знают что будет делать ваша программа начиная с этого момента. ...

Здесь я написал: "Зато авторы компиляторов знают: на всех популярных платформах из переменной будет прочитано случайное значение." И мне немедленно привели пример, когда clang просто выкинул обращение к неинициализированной переменной.

... Тут у вас есть выбор: или вы следуете стандарту (нормально), или убеждаетесь что компилятор переваривает ваш код в соответствии с вашими ожиданиями (тоже нормально, если вы знаете что делаете, и проверили на всех компиляторах, которые вам нужны, и со всеми флагами компиляции, которые вам нужны, и проверили получившийся ассемблерный код и лучше так не делайте, это не нормально).

→ Ссылка