Как проверить, была ли инициализирована переменная в C?

Есть ли способ проверить, была ли инициализирована переменная или нет в C?

Рассмотрим следующий пример:

int main(){ int a = 3, b = 7, c; if ( a > b ) c = ab; // 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?

C не обладает этой способностью. У вас есть два основных варианта:

Дозорное значение

Например, если вы знаете, что значение c никогда не будет отрицательным, тогда инициализируйте его до -1 и проверьте, что для этого.

Добавить другую переменную

Создайте еще одну переменную bool we_set_c_to_something = false; а затем установите значение true когда вы пишете c .

Неверный вопрос. Вы не спрашиваете, определена ли переменная. Если переменная не определена, компиляция не выполняется. Посмотрите разницу между «декларацией» и «определением». В случае этих локальных переменных вы определили переменную c.

То, что вы ищете, это инициализация . Многие компиляторы будут предупреждать вас об использовании переменных до их инициализации, но если вы продолжаете работать с этим кодом, то предполагается, что вы знаете лучше, чем компилятор. И в этот момент это ваша проблема. 🙂 Некоторые языки (например, Perl) имеют дополнительный флаг, который перемещается вместе с переменной, чтобы сказать, был ли он инициализирован или нет, и они скрывают от вас, что есть этот дополнительный флаг, висящий вокруг, который вам может понадобиться или не понадобиться. Если вы хотите это на C, вам нужно закодировать его самостоятельно.

Поскольку C ++ допускает перегрузку оператора, относительно легко реализовать это на C ++. Boost предоставляет « факультативный » шаблон, который делает это, или вы можете катиться самостоятельно, если хотите упражнение по кодированию. C не имеет понятия перегрузки оператора, хотя (черт возьми, концепция действительно не существовала, и компиляторы того дня, вероятно, не могли бы ее поддерживать), так что вы получаете то, что получаете.

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

C – это скомпилированный язык, который не поддерживает привязку переменной времени исполнения, а Perl – интерпретируемый язык, который поддерживает динамическую типизацию. Таким образом, вы можете проверить определение переменной в Perl, но не в C.

Когда вы объявляете переменную в C int c; , эта переменная c определена, но без инициализации. Декларация и определение в одном утверждении.

Определение переменной в C не проверяется писателем кода. Составители делают это за вас. Когда вы компилируете и связываете свой код C, компилятор проверяет определения всех переменных. Будет выведена ошибка, и процесс компиляции или связывания остановится, если в вашем коде обнаружены неопределенные переменные.

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