Как проверить, была ли инициализирована переменная в C?
Есть ли способ проверить, была ли инициализирована переменная или нет в C?
Рассмотрим следующий пример:
int main(){
int a = 3, b = 7, c;
if ( a > b )
c = a-b;
// Now, how can I check if the variable "c" has some value or not
// I don't want check like this,
// if ( isalpha(c) ) or if ( isdigit(c) )
// or anything similar to like that
}
Другими словами, C имеет некоторую функцию типа defined
в Perl
. В Perl
я могу просто сделать if (defined c)
, который будет проверять, определена ли переменная или нет, и она вернет False для приведенного выше примера. Как я могу достичь того же в C?
Ответы
Ответ 1
C не обладает этой способностью. У вас есть два основных варианта:
Дозорное значение
Например, если вы знаете, что значение c
никогда не будет отрицательным, тогда инициализируйте его до -1
и проверьте это для этого.
Добавить другую переменную
Создайте еще одну переменную bool we_set_c_to_something = false;
и затем установите ее на true
, когда вы пишете на c
.
Ответ 2
Неверный вопрос. Вы не спрашиваете, определена ли переменная. Если переменная не определена, компиляция не выполняется. Посмотрите разницу между "декларацией" и "определением". В случае этих локальных переменных вы определили переменную c.
То, что вы ищете, это инициализация. Многие компиляторы будут предупреждать вас об использовании переменных до их инициализации, но если вы продолжаете работать с этим кодом, то предполагается, что вы знаете лучше, чем компилятор. И в этот момент это ваша проблема.:) Некоторые языки (например, Perl) имеют дополнительный флаг, который перемещается вместе с переменной, чтобы сказать, была ли она инициализирована или нет, и они скрывают от вас, что там присутствует дополнительный флаг, вокруг которого вам может понадобиться или не понадобиться. Если вы хотите это на C, вам нужно закодировать его самостоятельно.
Так как С++ допускает перегрузку оператора, относительно легко реализовать это в С++. Boost предоставляет "факультативный" шаблон, который делает это, или вы можете катиться самостоятельно, если хотите упражнение по кодированию. C не имеет понятия перегрузки оператора, хотя (черт возьми, концепция на самом деле не существовала, и компиляторы того дня, вероятно, не смогли бы ее поддерживать), поэтому вы получаете то, что получаете.
Perl - это особый случай, потому что он свертывает два вместе, но C не делает. Вполне возможно, что в C есть переменные, которые определены, но не инициализированы. Действительно, есть много случаев, когда мы хотим, чтобы это было так, особенно когда вы начинаете делать низкоуровневый доступ к памяти для драйверов и тому подобное.
Ответ 3
C - это скомпилированный язык, который не поддерживает привязку переменной времени выполнения, а Perl - интерпретируемый язык, поддерживающий динамическую типизацию. Таким образом, вы можете проверить определение переменной в Perl, но не в C.
Когда вы объявляете переменную в C int c;
, эта переменная c
определяется, но без инициализации. Объявление и определение находятся в одном выражении.
Определение переменной в C не проверяется писателем кода. Составители делают это за вас. Когда вы компилируете и связываете свой C-код, компилятор проверяет все определения переменных. Будет выведена ошибка, и процесс компиляции или связывания остановится, если в вашем коде обнаружены переменные undefined.
Надеюсь, это поможет вам отличить различия.