C - Проверьте, присвоено ли Целое число

Я добавил бы

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) { }
28
задан asheeshr 15 February 2014 в 03:05
поделиться

11 ответов

Вы не можете. Он будет иметь «неопределенное» содержимое, что означает, что он будет содержать то, что когда-либо могло быть в этой ячейке памяти в то время.

. . . если i не объявлен в глобальной области видимости, он будет инициализирован равным нулю.

22
ответ дан 28 November 2019 в 03:15
поделиться

It's very simple. You know it is unassigned because you did not initialise it.

5
ответ дан 28 November 2019 в 03:15
поделиться

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.

8
ответ дан 28 November 2019 в 03:15
поделиться

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.

4
ответ дан 28 November 2019 в 03:15
поделиться

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.

4
ответ дан 28 November 2019 в 03:15
поделиться

Как отмечали другие, вы не можете писать программа на C, которая определяет, не инициализирована ли одна из ее собственных переменных, и вам следует стремиться к тому, чтобы переменные всегда инициализировались.

  • Если ваша цель - убедиться, что все переменные инициализированы, можно использовать такой инструмент, как valgrind может обнаруживать использование неинициализированных переменных динамически посредством дорогостоящего анализа во время выполнения.

  • Если ваша цель - убедиться, что личные данные инициализируются ровно один раз, обычно можно защитить их с помощью

     int i;
    static bool initialized = 0;
    
    ... 
    if (! initialized) {
     инициализировано = 1;
     i = ... начальное значение i ...;
    }
    
4
ответ дан 28 November 2019 в 03:15
поделиться

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

1
ответ дан 28 November 2019 в 03:15
поделиться

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

Я предлагаю , а не , чтобы проверить это внутри кода. Поскольку это может вызвать предупреждения компилятора (переменная 'i' используется до того, как ей будет присвоено значение), появятся новые ошибки и очень мало шансов на успех в средних и крупных программах.

Лучший метод - использовать инструменты статического анализа кода (например, QA / C или PCLint). Использование компилятора с высоким уровнем чувствительности к предупреждениям - это бесплатный вариант с гораздо меньшим охватом, чем у специализированных инструментов.

Если вы выполняете анализ кода, вы также можете включить проверку неинициализированных переменных в контрольный список. Это не гарантия, но это вызовет ручные проверки со стороны проверяющих.

Если вам нужна проверка во время выполнения, то вы можете начать с инициализации переменных до значения, выходящего за пределы допустимого диапазона. Например, -1 для положительного значения в противном случае. Затем вы можете проверить

#define UNASSIGNED_VALUE -1
    static int number_of_apples = UNASSIGNED_VALUE;
    if (UNASSIGNED_VALUE == number_of_apples)
    {
       // error handling
    }

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

1
ответ дан 28 November 2019 в 03:15
поделиться

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.

1
ответ дан 28 November 2019 в 03:15
поделиться

Проверка того, инициализирована (назначена) переменная, которую вы используете, во время выполнения, общеизвестно сложно для C. Нет языковой поддержки для нее, а информации, доступной во время выполнения, просто недостаточно для идеальное обнаружение неинициализированных значений. Инструменты динамического анализа, такие как Valgrind / Memcheck, проходят очень много времени (например, отслеживают каждый байт памяти в адресном пространстве вашего процесса и затем проверяют каждое хранилище, чтобы пометить байт как инициализированный), чтобы определить, инициализировано ли используемое значение и по-прежнему подвержены ложным срабатываниям.

Если вы просто пытаетесь минимизировать такие ошибки в своих программах, инструменты статического анализа, такие как lint, могут достаточно хорошо проинформировать вас о том, используете ли вы неинициализированные переменные или нет. По факту,

0
ответ дан 28 November 2019 в 03:15
поделиться

В языке 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;

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

0
ответ дан 28 November 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: