Я добавил бы
float i = Float.NaN;
, а также
double i = Double.NaN;
<час> А общий прием в подобных вопросах это в предположении, Вы делаете это, я - интервал. Другие общие предположения могли бы быть s, Строка, x, y являются двойным, ch является символом, b является байтом и т.д., Если Вы видите вопрос как это, можно держать пари, что 'я' не ожидать тип.
А подобный вопрос; Это никогда не циклично выполняется, что является 'x'
while(x == x && x != x + 0) { }
Другой вопрос, который я вполне люблю; Этот цикл является бесконечным циклом, что является возможными значениями x. (: Я считаю двенадцать из них:)
while(x != 0 && x == -x) { }
Вы не можете. Он будет иметь «неопределенное» содержимое, что означает, что он будет содержать то, что когда-либо могло быть в этой ячейке памяти в то время.
. . . если i не объявлен в глобальной области видимости, он будет инициализирован равным нулю.
It's very simple. You know it is unassigned because you did not initialise it.
C doesn't intrinsically support this - just like it doesn't intrinsically support bounds checking on arrays. It's a trade-off between speed/efficiency and safety.
In general... initialize your variables.
If i
is global or static, its value will be 0
, otherwise its value can be anything and there is no way to find out whether it is garbage or not.
You may be able to ask for compiler warnings if you use uninitialized values. They're not wholly reliable, however - you get the occasional false positive where the DFA isn't as clever as you'd hope, and maybe occasional false negatives (I'd hope not, but I promise nothing).
For GCC:
-Wuninitialized -O1
If you want to write conditional code:
int a = 3;
int b;
int *p = (rand() > RAND_MAX/2) ? &a : &b;
if (is_uninitialized(*p)) // blah
then you're out of luck. Unlike some dynamic languages, C has no concept of "the undefined value". If a variable is not initialized, it isn't given some special value which can be tested for later. It's not given a value at all, so it's undefined what happens when you use the variable.
Как отмечали другие, вы не можете писать программа на C, которая определяет, не инициализирована ли одна из ее собственных переменных, и вам следует стремиться к тому, чтобы переменные всегда инициализировались.
Если ваша цель - убедиться, что все переменные инициализированы, можно использовать такой инструмент, как valgrind может обнаруживать использование неинициализированных переменных динамически посредством дорогостоящего анализа во время выполнения.
Если ваша цель - убедиться, что личные данные инициализируются ровно один раз, обычно можно защитить их с помощью
int i;
static bool initialized = 0;
...
if (! initialized) {
инициализировано = 1;
i = ... начальное значение i ...;
}
Как и во всех предыдущих ответах, нет способа обнаружить это во время выполнения. Однако почти любой инструмент статического анализа кода с предупреждением о неназначенных переменных.
Использование переменной перед инициализацией (или присвоением) является серьезной причиной ошибок. Вы не можете надежно проверить его во время выполнения, но вы можете обнаружить его во время или перед компиляцией.
Я предлагаю , а не , чтобы проверить это внутри кода. Поскольку это может вызвать предупреждения компилятора (переменная 'i' используется до того, как ей будет присвоено значение), появятся новые ошибки и очень мало шансов на успех в средних и крупных программах.
Лучший метод - использовать инструменты статического анализа кода (например, QA / C или PCLint). Использование компилятора с высоким уровнем чувствительности к предупреждениям - это бесплатный вариант с гораздо меньшим охватом, чем у специализированных инструментов.
Если вы выполняете анализ кода, вы также можете включить проверку неинициализированных переменных в контрольный список. Это не гарантия, но это вызовет ручные проверки со стороны проверяющих.
Если вам нужна проверка во время выполнения, то вы можете начать с инициализации переменных до значения, выходящего за пределы допустимого диапазона. Например, -1 для положительного значения в противном случае. Затем вы можете проверить
#define UNASSIGNED_VALUE -1
static int number_of_apples = UNASSIGNED_VALUE;
if (UNASSIGNED_VALUE == number_of_apples)
{
// error handling
}
, что это не настоящая «неинициализированная» переменная, но, по крайней мере, вы можете определить, были ли выполнены назначения времени выполнения в допустимом диапазоне.
Usually variables are set to 0 by the C library, but not necessarily.
But basically, you can't. Assign them a default value in the definition, for instance:
int i = 0; /* Or what ever value you know won't be used elsewhere */
Then if you run some code and want to check if the value was set there, you can compare to your initial value.
Проверка того, инициализирована (назначена) переменная, которую вы используете, во время выполнения, общеизвестно сложно для C. Нет языковой поддержки для нее, а информации, доступной во время выполнения, просто недостаточно для идеальное обнаружение неинициализированных значений. Инструменты динамического анализа, такие как Valgrind / Memcheck, проходят очень много времени (например, отслеживают каждый байт памяти в адресном пространстве вашего процесса и затем проверяют каждое хранилище, чтобы пометить байт как инициализированный), чтобы определить, инициализировано ли используемое значение и по-прежнему подвержены ложным срабатываниям.
Если вы просто пытаетесь минимизировать такие ошибки в своих программах, инструменты статического анализа, такие как lint, могут достаточно хорошо проинформировать вас о том, используете ли вы неинициализированные переменные или нет. По факту,
В языке C целое число принимает неопределенное значение при создании. Это означает, что если вы впервые используете это целое число из регистра / ячейки памяти / устройства с номером 5893872, это значение этого целого числа. (Пробег зависит от компиляции отладки / выпуска.)
Обычный метод решения этой проблемы - использование бессмысленного значения по умолчанию:
int number_of_widgets = -1;
... или флага, указывающего его состояние:
int number_of_widgets;
int number_of_widgets_assigned = 0;
if (number_of_widgets_assigned)
do something
else
do something else
number_of_widgets_assigned = 1;
Другого пути нет. определить, назначено ли что-либо - если вы не хотите вникать в отладочные функции вашего оборудования, и я подозреваю, что этот разговор не об этом.