Разве можно НЕ инициализировать локальную переменную в C, если я ее не использую, прежде чем ей будет присвоено значение? - PullRequest
0 голосов
/ 18 февраля 2019

Я знаю, что с использованием неинициализированной переменной неверно, но возникает вопрос в контексте неинициализированного целого числа, которое я не использую, прежде чем присвоить ему значение позже в коде.

Стоит ли ожидать странных результатов?Или это просто плохая практика?

Я новичок в области компьютерных наук, извините за любые ошибки!

Ответы [ 4 ]

0 голосов
/ 18 февраля 2019

Прекрасно с точки зрения программы не инициализировать переменную сразу.Итак, это:

int a;

// 10000 lines of code

// line 10001
a = 0
use(a);

совершенно нормально.

Но происходит то, что люди (включая меня) начнут использовать эту переменную до строки 10001 и забудут, что не инициализировали ее, получить мусор и чем думать, что что-то не так с кодом.Вы знаете, что атака паники, ПОЧЕМУ ЭТО НЕ РАБОТАЕТ? , и вы делаете что-то вроде этого:

int a;

// line 2001 this happens
use (a);

// 10000 lines of code

// line 10001
a = 0
use(a);

О, черт возьми, моя use(a) функция не работает и чем тратите час илидве отладочные прекрасно работающие программы.Некоторые компиляторы предупреждают вас об этом, а некоторые нет.

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

0 голосов
/ 18 февраля 2019

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

0 голосов
/ 18 февраля 2019

Это нормально:

int i;
result = someFunc(&i);//it does not matter what value i is, it will 
                      //be assigned in the function.

, где определено someFunc():

void someFunc(int *in)
{
    *in = 10;
}

Это не хорошо

int i;
int someArray[10];
int a = someArray[i];//it is not known what value 'i' is. Fault if > 9. 

Но из-за хороших навыков программирования (ремонтопригодность, удобочитаемость, проактивное предотвращение ошибок) всегда полезно просто инициализировать:

int i = 0;
char *tok = NULL;
char string[] = {"string"};
float array[100] = {0};
... and so on.
0 голосов
/ 18 февраля 2019

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

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