Подтвердить что ты не робот

Как проверить, была ли инициализирована переменная в 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?

4b9b3361

Ответ 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.

Надеюсь, это поможет вам отличить различия.