Можно ли выяснить присвоено ли значение переменной 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 шт):
Массив a не инициализирован. Стандарт прямо запрещает читать неинициализированные данные. Следовательно, у вас нет законного способа проверить есть там что-то или нет (в отличие от JavaScript с его undefined).
Но можно сделать так: int a[size] = {0};. Это специальная нотация, которая заполнит массив нулями. Теперь вы можете проверять его ячейки до присваивания значений элементам.
Пара замечаний вдогонку:
int a[size] = {0}; это действительно специальная нотация. Например int a[size] = {1}; не будет заполнять всё единицами, а заполнит первый элемент единицей, а остальные нулями. Ноль можно опустить в C++ (в C нельзя): int a[size] = {}; - всё будет заполнено нулями.
Ничего стандарт не запрещает конечно. Обращение к неинициализированной переменной порождает неопределённое поведение (undefined behaviour). То есть, авторы стандарта не знают что будет делать ваша программа начиная с этого момента. ...
Здесь я написал: "Зато авторы компиляторов знают: на всех популярных платформах из переменной будет прочитано случайное значение." И мне немедленно привели пример, когда clang просто выкинул обращение к неинициализированной переменной.
... Тут у вас есть выбор: или вы следуете стандарту (нормально), или убеждаетесь что компилятор переваривает ваш код в соответствии с вашими ожиданиями (тоже нормально, если вы знаете что делаете, и проверили на всех компиляторах, которые вам нужны, и со всеми флагами компиляции, которые вам нужны, и проверили получившийся ассемблерный код и лучше так не делайте, это не нормально).