Следует ли избегать или поощрять «использование std :: cin» и «использование std :: cout»?

#c #coding-style #code-readability

#c #стиль кодирования #удобочитаемость кода

Вопрос:

Я искал этот сайт, и люди говорят, что вам следует избегать использования using namespace std . Я полностью согласен. Однако, как насчет using std::cin and using std::string ? Следует ли этого избегать или поощрять?

Я знаю, что always type std::cin — самый безопасный выбор, но вводить их снова и снова очень утомительно.

Однако, когда вы вводите using std::cin etc в начале файла, это кажется очень скученным. Например, эта простая программа считывает и вычисляет оценку ученика, перед ней слишком много using std:: , это выглядит очень неудобно.

 #include <iostream>
#include <ios>
#include <iomanip>
#include <stdexcept>
#include <vector>
using std::cin;             using std::cout;
using std::istream;         using std::vector;
using std::setprecision;    using std::domain_error;
using std::string;          using std::getline;
using std::streamsize;

istreamamp; read_hw(istreamamp; in, vector<double>amp; homework);
double grade(double mid_exam, double final_exam, 
        const vector<double>amp; homework);

int main()  {

    std::string name;
    std::getline(std::cin, name);
    std::cout << "Hello, "   name   "!" << std::endl;

    double mid_exam, final_exam;
    std::cin >> mid_exam >> final_exam;

    std::vector<double> homework;
    read_hw(std::cin, homework);

    try {
        double final_grade = grade(mid_exam, final_exam, homework);
        std::streamsize prec = std::cout.precision();
        std::cout << "your final grade is:" << std::setprecision(3)
            << final_grade << std::setprecision(prec) << std::endl;
    }
    catch(std::domain_error)    {
        std::cout << std::endl << "No homework entered!" << std::endl;
        return 1;
    }

    return 0;
}

std::istreamamp; read_hw(std::istreamamp; in, std::vector<double>amp; homework)   {
    if(in)  {
        homework.clear();
        double x;
        while(in >> x)  {
            homework.push_back(x);
        }
    }
    in.clear();

    return in;
}

double grade(double mid_exam, double final_exam, 
        const std::vector<double>amp; homework)    {
    std::vector<double>::size_type i, size;
    size = homework.size();
    if(size ==0)    {
        throw std::domain_error("no homework grade entered!");
    }
    double sum = 0;
    double average = 0;
    for(i = 0; i < size;   i)   {
        sum  = homework[i];
    }
    average = sum/size;

    return mid_exam*0.3   final_exam*0.3   average*0.4;
}
  

В руководстве по python говорится:

Помните, что в использовании нет ничего плохого from Package import
specific_submodule
! На самом деле, это рекомендуемая нотация, если только импортирующему модулю не нужно использовать подмодули с одинаковыми именами из разных пакетов.

Я хочу знать, что я должен делать в программах на c .

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

1. Лично я бы рекомендовал вам всегда использовать std::string и тому подобное, если вы не ограничиваете операторы using областью действия функции. Даже тогда мне нравится просто использовать std:: быть явным.

2. Я заметил, что у вас есть using std::vector , но затем вы ссылаетесь на std::vector в коде. Наличие обоих не может быть правильным.

3. Кроме того, это продолжение строки для аргументов grade является ненужным / нежелательным

4. Наконец, вы не восстанавливаете точность при записи выходных данных.

5. @MartinBonner У меня нет времени удалять их std:: в программе…

Ответ №1:

Никогда не используйте using namespace std; или подобные в заголовочном файле, поскольку это может вызвать всевозможные проблемы неоднозначности, возникающие из-за загрязнения пространства имен. Если вы будете соблюдать это правило, то люди, которые должны включать ваши заголовки, будут благодарны вам за это. Я бы также избегал любых using std::... заголовков in по аналогичным причинам. Научитесь любить более подробные std:: обозначения.

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

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

1. Вы должны проголосовать за закрытие как POB, если все, что получит OP, — это мнения.

2. Я считаю, что первый абзац не основан на мнениях.

3. если вы пишете простую программу типа hello world или учебника, это помогает использовать пространство имен std , если ни одна другая библиотека не имеет cin или cout в качестве типов. Не нужно усложнять учебные пособия с помощью std::this std::that ….

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

5. @DrDeo: Я не мог не согласиться больше. Я думаю, что причиной этого является тот факт, что учебники, похоже, презирают написание std:: . Он внедряет этот стиль в умы всех наших начинающих программистов!

Ответ №2:

Имхо, этот вопрос скорее основан на мнениях. Тем не менее, это мое мнение:

Не используйте:

 using std::cin;
using std::cout;
using std::string; 
  

или тому подобное. Мой аргумент довольно прост и лучше демонстрируется с помощью

 using std::sort;
using std::vector;
  

Представьте, что у вас есть код, содержащий ошибку, и теперь вы должны ее найти. Любой используемый объект или функция, std:: перед которыми есть a, вряд ли содержит ошибку. Таким образом, я всегда предпочитаю видеть

 std::vector<double> x;
std::sort(x);
  

вместо

 vector<double> x;
sort(x);
  

потому что последнее требует от меня поиска того vector , sort что на самом деле есть и (помните, что мы говорим о C , т. Е. Это может быть буквально что угодно), просто чтобы выяснить, что это std::vector и std::sort . Вывод: время, которое я трачу на написание std:: каждый раз, экономит мне вдвое или более времени на отладку.

Чтобы сделать это немного менее основанным на мнениях: определенный компромисс, который вы должны сделать, — это удобочитаемость по сравнению с меньшим набором текста. Мнение, основанное на мнении, — это то, что вы цените больше….

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

1. Я думаю coding-style , что все вопросы основаны на мнениях, однако есть хорошие и плохие. Кроме того, почти весь код основан на мнениях, потому что код — это путь к ответу, однако есть много способов.

2. @buzhidao как я уже сказал, imho не основывается на мнениях, так это преимущества и недостатки одного подхода по сравнению с другим. Какой из них вы выбираете, зависит исключительно от мнения