Разница между использованием «переменной результата» и необработанной переменной, возвращаемой в функцию? - PullRequest
0 голосов
/ 01 сентября 2018

Так что я возился с использованием переменных для программы меню / калькулятора, которую мне сказали изменить в одной из моих «проблем практики», как показано здесь:

  1. Заставьте вашу программу калькулятора выполнять вычисления в отдельной функции для каждого типа вычислений.

Мой вопрос заключается в том, чтобы при создании этих 4 функций для обработки каждой из четырех простых арифметических операций я не был уверен, в чем разница между использованием следующего синтаксиса:

double addition(double x, double y)
{
    return x + y;
}

Как использовать локальную переменную "result" для получения значения?

double addition(double x, double y)
{
    double result;
    result = x + y;
    return result;
}

Единственный вывод, который я могу сделать, заключается в том, что в более сложных арифметических операциях, таких как площадь круга и т. Д., Может потребоваться больше манипуляций с входными значениями, поэтому для выполнения этих вычислений потребуется больше переменных.

Наконец, какой из двух методов лучше использовать? Я знаю, что это второстепенный вопрос, но я просто хочу выучить правильную методологию, чтобы не учиться вредным привычкам программирования.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Наконец, какой из двух методов лучше использовать?

Первый лучше.

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

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

double addition(double x, double y)
{
    double result;
    std::cout << result; // may crash, randomly alter the function result, do other bad things
    result = x + y;
    return result;
}

Другим следствием является то, что вы не можете использовать auto или const (или auto const):

double addition(double x, double y)
{
    auto result; // does not compile
    result = x + y;
    return result;
}

double addition(double x, double y)
{
    double const result; // does not compile
    result = x + y;
    return result;
}

Кстати, я не покупаю аргументы отладчика в пользу второй практики. Приличный отладчик очень хорошо способен показать вам значения неназванных объектов. Вот пример из Visual Studio 2017:

Visual Studio 2017 debugger screenshot

0 голосов
/ 01 сентября 2018

C ++ компилируется с помощью оптимизирующих компиляторов. Это означает, что вы можете написать один и тот же код по-разному и получить один и тот же вывод сборки.

Добавление дополнительной переменной обычно оптимизируется, когда это не меняет время жизни переменных. (или хотя бы заметные побочные эффекты)

Добавление дополнительной переменной имеет ряд преимуществ:

  • У него есть имя, которое может сделать его более читабельным
  • Для отладочных сборок легче увидеть значение и добавить точки останова в переменную

В приведенном вами примере я ожидаю, что все современные компиляторы будут генерировать один и тот же код.

Примечание: лучше не иметь неинициализированной памяти, вы можете объявить свою переменную при присваивании. (double result = x + y), tnx Neil Butterworth за предложение об этом в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...