Как я могу проверить , равна ли моя переменная нулю? C

#c #null-check

#c #null-проверка

Вопрос:

Я должен написать код, который будет проверять правильность ввода в моем коде. Я должен запретить вводить буквы, нули и т.д.

Я попробовал простое if (*tab == NULL).. но я не могу сравнить значения float и void.

 int avg(const float* tab, unsigned int size, float *result)
{
    if( size <= 0)
    {
        return 1;
    }
    float suma = 0;
    for(unsigned int i=0;i<size;i  )
    {
        suma=suma   *(tab i);
    }
    *result = suma / size;
    return 0;
}
  

Комментарии:

1. C не похож на JavaScript или SQL: типы значений не могут быть NULL , потому что они не являются указателями. NULL это просто постоянное значение, равное нулю (в большинстве компиляторов). Указатели — это просто (специальные) целые числа.

2. Этот вопрос буквально подобен вопросу о том, как сравнить яблоки с апельсинами.

3. Если вы хотите убедиться, что вызывающий объект не передает нулевой указатель, просто сравните указатель с NULL как в tab == NULL (или tab != NULL ). Если вы используете *tab , то вы разыменовываете указатель, который не будет хорошо работать, если это нулевой указатель.

4. Что касается указателей и разыменования, обратите внимание, что выражение *(tab i) в точности равно tab[i] . Последнее обычно легче читать и понимать (и меньше писать).

5. Кстати, задавая вопрос о предупреждении компилятора, обязательно выполните эти три простых шага. 1) Опубликуйте точный код, который генерирует предупреждение. 2) Опубликуйте точный текст предупреждения. 3) Добавьте комментарий к коду, который указывает строку, в которой появилось предупреждение.

Ответ №1:

C не хранит значения так же, как Javascript или Python. В C нет такого понятия, как переменная без значения. Вы никогда не сможете определить, инициализирована переменная или нет, только посмотрев на саму переменную. Переменная может быть неинициализирована, но использование переменной в таком случае привело бы к неопределенному поведению, и наиболее вероятным следствием ub в этом случае является то, что вы получаете случайное значение, которое с высокой вероятностью равно нулю.

Если вы выполняете объявление float f , то вы резервируете определенный объем памяти (обычно 4 байта для значения с плавающей точкой). Каждый раз, когда вы используете f в выражении, любой битовый шаблон, найденный по адресу amp;f , будет интерпретироваться как значение с плавающей точкой. Некоторые битовые шаблоны могут быть специальными для чисел с плавающей запятой, но NULL не является одним из них, но когда дело доходит до целых чисел, тогда КАЖДЫЙ битовый шаблон является допустимым обычным целым числом.

Вам просто нужно убедиться, что она tab правильно инициализирована перед передачей ее в вашу функцию. Сама функция не может определить, так ли это.

В C значение NULL является константой, обычно типа void* , но оно также может быть типа int . Предназначение предназначено для указателей и не должно использоваться ни для чего другого.

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

Комментарии:

1. Я бы оспорил «строго типизированный», поскольку вы можете переинтерпретировать / привести любые данные на C к любому типу, который вам нравится, и ни компилятор, ни исполняющая машина вас не остановят (ну, пока что-то не сломается). В отличие от большинства языков более высокого уровня, таких как Python, Java, Smalltalk и т.д. где вы не можете притворяться, что один объект имеет другой тип, чем он есть на самом деле. Поэтому я бы вместо этого написал «статически типизированный». Хотя это различие вряд ли имеет отношение к вопросу.