Bool никогда не будет NULL [-Waddress]

#c #linux #gcc #compiler-warnings #suppress-warnings

#c #linux #gcc #компилятор-предупреждения #подавить-предупреждения

Вопрос:

Я начинаю с C и получил это предупреждение:

../src/loop.cpp:23:6: предупреждение: адрес ‘bool almostComparison (double, double)’ никогда не будет NULL [-Waddress]

Любой может объяснить мне, почему это? Если намерение — это просто сравнение для возврата true или false?

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

 #include <iostream>

using namespace std;

bool almostComparison(double number1, double number2) {
    if (number1   1 == number2 || number2   1 == number1) {
        return true;
    }
    return false;
}

void numberComparison(double number1, double number2) {
    if(number1 < number2) {
        cout << "the smaller value is: " << number1 << 'n';
        cout << "the larger value is: " << number2 << 'n';
        if(almostComparison) {
            cout << "the numbers are almost equal!" << 'n';
        }
    } else if (number2 < number1) {
        cout << "the smaller value is: " << number2 << 'n';
        cout << "the larger value is: " << number1 << 'n';
    } else {
        cout << "the numbers are equal" << 'n';
        cout << "Number1: " << number1 << 'n';
        cout << "Number2: " << number2 << 'n';
    }
}

int main() {

    bool condition = true;
    double number1 = 0;
    double number2 = 0;

    while(condition) {
        cin >> number1;
        cin >> number2;

        if(cin.fail()) {
            condition = false;
        } else {

            numberComparison(number1, number2);

        }
    }

    return 0;
}
  

Ответ №1:

 if(almostComparison) {
  

Это проверяет адрес функции, который всегда будет ненулевым. Вы хотите на самом деле вызвать функцию следующим образом:

 if(almostComparison(number1, number2)) {
  

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

1. Большое вам спасибо! Я уделю больше внимания. Интересно то, что даже неправильным способом он компилируется и нормально работает с предупреждением.

2. @awesomepandata: я бы не сказал, что это работает «нормально», поскольку он просто всегда будет говорить «числа почти равны!» всякий number1 раз, когда меньше number2 , даже если вы вводите что-то вроде 1 и 700 для двух чисел. Что касается компиляции, вот почему предупреждения компилятора — это вещь: если вы получаете ошибку компилятора, это обычно просто какая-то опечатка, тогда как если вы получаете a warning , вы обычно находитесь в очень опасной ситуации, когда ваша программа может показаться работающей, но иногда дает неправильные ответы.

3. @DanielMcLaury Вы правы, спасибо за совет о компиляторе. 🙂