Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/480: Рейтинг темы: голосов - 480, средняя оценка - 4.76
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
1

Std:: или using namespace std;

08.10.2017, 18:43. Показов 88147. Ответов 50
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос к профессионалам.
Меня давно интересуют такие вопросы:
1) Почему, многим, вроде бы не безграмотным С++-шникам, в консольных приложениях вместо одной строки :
using namespace std;
нравится везде перед cout, cin, endl, string и т.п. дописывать std:: ?
Это стиль такой пространно-корявый, или есть какое-то логическое объяснение?

2) Почему даже в несложных программах многие спецы предпочитают вместо коротких имён давать переменным пространные имена?

3) Почему многие спецы для несложных программ вместо необходимых заголовочных файлов используют библиотеки "на все случаи жизни"?

Утрируя, можно сказать, что простая программа сложения двух чисел:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
int main()
{
    int a, b, c;
    cin >> a >> b;
    c = a + b;
    cout << c << endl;
    return 0;
}
написанная руками некоторых специалистов будет выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
int main(int argc, char* argv[])
{
    int FirstNumericalValue, SecondNumericalValue, Result;
    std::cin >> FirstNumericalValue;
    std::cin >> SecondNumericalValue;
    Result = FirstNumericalValue + SecondNumericalValue;
    std::cout << Result << std::endl;
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2017, 18:43
Ответы с готовыми решениями:

Использовать using namespace std; или каждый раз прописывать std:: . ?
Как безопаснее и рациональнее поступать? Как в больших проектах поступают на этот счет?

Что использовать, std::cout или просто using namespace std?
Приветствую! Сейчас учу С++, постигаю азы так сказать. В арсенале две книги - Джефф Кент, ...

Пространство имен - namespace std или std::
В каких случая лучше писать (std::cout) или просто прописать (namespace std) и почему ?

Зачем часто писать std::, если можно один раз using namespace std?
зачем часто писать std:: если можно один раз using namespace std?

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++...

50
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
08.10.2017, 18:50 2
Лучший ответ Сообщение было отмечено LVV как решение

Решение

Цитата Сообщение от LVV Посмотреть сообщение
Это стиль такой пространно-корявый, или есть какое-то логическое объяснение?
что в коде программы пользовательский vector не переопределится на std::vector . Если тебе сильно не хочется по всему коду писать std::cin, можешь воспользоваться

C++
1
2
3
4
using std::cout;
using std::cin;
using std::endl;
using std::string;
и это уже будет считаться хорошим тоном. Т.е. указываешь строго те имена, которыми будешь пользоваться, а не "всю кучу из std".
1
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
08.10.2017, 18:51 3
Цитата Сообщение от LVV Посмотреть сообщение
Почему, многим, вроде бы не безграмотным С++-шникам, в консольных приложениях вместо одной строки
потому что это позволяет избежать ошибок пересечения имён.
Цитата Сообщение от LVV Посмотреть сообщение
Почему даже в несложных программах многие спецы предпочитают вместо коротких имён давать переменным пространные имена?
приведите пример.
Цитата Сообщение от LVV Посмотреть сообщение
Почему многие спецы для несложных программ вместо необходимых заголовочных файлов используют библиотеки "на все случаи жизни"?
приведите пример таких "спецов".
1
1682 / 1095 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
08.10.2017, 18:53 4
1) Посмотрите внизу похожие темы. Это обсуждалось уже не раз.
2) Имена должны быть понятными. Хотя в программе из 10 строк тяжело запутаться, все равно лучше называть переменные нормально.
3) Так спецы точно не делают

Цитата Сообщение от LVV Посмотреть сообщение
написанная руками некоторых специалистов будет выглядеть примерно так:
Цитата Сообщение от LVV Посмотреть сообщение
#include <stdlib.h>
#include <stdio.h>
Спецы написали бы cstdlib, cstdio, но учитывая что они тут не нужны, ничего бы не написали.
Цитата Сообщение от LVV Посмотреть сообщение
int FirstNumericalValue, SecondNumericalValue, Result;
Это перебор, тут любой нормальный человек напишет либо a, b, sum, либо first, second, sum.
И отступов в вашем коде не хватает - так спецы точно не пишут.
1
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
08.10.2017, 18:54 5
Цитата Сообщение от LVV Посмотреть сообщение
вместо коротких имён давать переменным пространные имена
Потому что лень писать в комментарии расшифровку того, что в коротком имени зашифровано и для чего данная переменная предназначена.
1
1682 / 1095 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
08.10.2017, 18:56 6
Цитата Сообщение от LVV Посмотреть сообщение
Утрируя
Не заметил к сожалению этого.
0
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
08.10.2017, 18:56 7
1) неймспейсы для того и нужны чтоб раскидать имена в пространства имён. Если вам захочется определить свой класс который тоже называется cout то можете это сделать реализовав его в другом пространстве имен, иначе будет конфликт имен.

2) привычка и/или перфекционизм, наверное...

3) не понял вопрос. где какая библиотека нужна ту и надо использовать а не включать лишнее
1
4017 / 2563 / 430
Регистрация: 09.09.2017
Сообщений: 11,404
08.10.2017, 19:28 8
1) а мне stdio.h более по нраву
2) Хорошая привычка. В реальных программах хорошие программисты дают переменным осмысленные имена. Сложнее запутаться в алгоритме, да и другие быстрее поймут. Вот и в школьных программах уже по привычке называют переменные осмысленно - хотя бы 3-10 символов. Разумеется, есть типичные применения вроде i,j,k для счетчиков цикла.
3) Это скорее для школьных задач или отладки. Когда не знаешь заранее какой набор библиотек потребуется, а экономить объем/скорость не надо. Вот и подключают на все случаи жизни.
1
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
08.10.2017, 19:47 9
Цитата Сообщение от LVV Посмотреть сообщение
using namespace std;
using namespace std
Цитата Сообщение от LVV Посмотреть сообщение
или есть какое-то логическое объяснение?
Уменьшаем шанс конфликта имен.
Для мелких проектов с известным контекстом
можно и воспользоваться, но привычкам не изменяем.
Ну и using namespace может пригодится для других вещей.
Цитата Сообщение от LVV Посмотреть сообщение
Почему даже в несложных программах многие спецы предпочитают вместо коротких имён давать переменным пространные имена?
Н п т н п с б о. Поняли фразу?
Цитата Сообщение от LVV Посмотреть сообщение
Почему многие спецы для несложных программ вместо необходимых заголовочных файлов используют библиотеки "на все случаи жизни"?
Таких библиотек не существует в природе.
Цитата Сообщение от LVV Посмотреть сообщение
написанная руками некоторых специалистов будет выглядеть примерно так:
Или так:
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <iterator>
#include <numeric>
 
int  main(int argc, char* argv[])
{
    std::cout << std::accumulate(std::istream_iterator<int>(std::cin), {}, 0);    
}
http://rextester.com/CSL98137
1
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
08.10.2017, 23:06 10
Цитата Сообщение от LVV Посмотреть сообщение
Почему, многим, вроде бы не безграмотным С++-шникам, в консольных приложениях вместо одной строки :
Дал я своему знакомому реализацию своих матриц.
А он долбанул туда std и мои неймспейсы.
А потом доказывал мне два часа, что функция tanh у меня кривая, мол ничего не компилиться)
1
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
08.10.2017, 23:22 11
Некоторые классы stl и boost`а только namespace`ом и отличаются)
1
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
09.10.2017, 16:45  [ТС] 12
Цитата Сообщение от Croessmah Посмотреть сообщение
Н п т н п с б о. Поняли фразу?
На счет "осмысленных имён" понятно.
Но ведь Visual Studio позволяет переменным и константам присваивать имена кириллицей.
Почему никто этим никогда не пользуется, хотя бы в процессе обучения?
Новичкам легче было бы отличить служебные слова языка программирования от придуманных программистом имён и идентификаторов.
Или Вы считаете, что нужно сразу писать коды под "международный уровень" и пичкать этим новичков?
Предвижу возражения, мол не нужно привыкать к неправильному стилю, не соответствующему стандартам С/С++.
Выходит, что в корпорации Microsoft все настолько глупы, что позволяют от этих самых стандартов отходить?
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
09.10.2017, 17:16 13

Не по теме:

Выходит, что в корпорации Microsoft все настолько глупы, что позволяют от этих самых стандартов отходить?
Или хитры...



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

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

Если мастер не делает чего-то очевидного, скорее всего это означает, что там есть подводные камни, на которые мастер уже наступал. Возможно ни один раз...

Добавлено через 4 минуты
Отвечая на вопрос, почему то или иное не используется что-либо в учебных целях, следует помнить, что мастер никогда не станет учить абстракции. Он будет учить тому, как он делает сам. Он сам может быть давно забыл, почему он не пишет using namespace std... Но, обучая новичков... Он тоже не станет этого делать. Просто потому, что не станет над этим задумываться.
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
09.10.2017, 17:37 14
Цитата Сообщение от LVV Посмотреть сообщение
Но ведь Visual Studio позволяет переменным и константам присваивать имена кириллицей.
1) Не все пользуются VS.
2) Ковырять другие редакторы и компиляторы на поддержку кириллицы - далеко не для новичков занятие.
3) В топку любую кириллицу из кода.
4) Круто будет, если разные редакторы захотят в разной кодировке работать с файлом.
5) Хочется постоянно переключаться между языками?
6) Все программисты - русские. Это же очевидно.
Цитата Сообщение от LVV Посмотреть сообщение
что нужно сразу писать коды под "международный уровень"
Было бы круто!
Цитата Сообщение от LVV Посмотреть сообщение
Выходит, что в корпорации Microsoft все настолько глупы, что позволяют от этих самых стандартов отходить?
Ага. Они даже в последнее время стали исправляться и всё больше к стандартам приближаться.
А как кирилические имена относятся к стандарту?
Может приведете нам цитату из стандарта, запрещающую использовать кириллические имена?
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.10.2017, 19:47 15
Цитата Сообщение от Croessmah Посмотреть сообщение
Может приведете нам цитату из стандарта, запрещающую использовать кириллические имена?
2.3 Character sets

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

так же, стандарт определяет все доступное множество символов.
если вкратце - сишная локаль.
то бишь английский алфавит, циферки,
плюс кучка символов управляющих последовательностью
('\n' '\0' , etc)

все прочее - от лукавого additional members are locale-specific.

каель умеет русские имена в переменных.
но это же каель.
ещё бы он не умел.
он умеет все, что не нужно уметь.

а вот мингв/гцц/шланг могут послать нафиг даже за такое:
C++
1
std::cout <<"привет";
если исходник не в utf-8.
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
09.10.2017, 19:55 16
hoggy, смотрим:
2.10 Identifiers
identifier:
***identifier-nondigit
***identifier identifier-nondigit
***identifier digit
identifier-nondigit:
***nondigit
***universal-character-name
***other implementation-defined characters
nondigit: one of
***a b c d e f g h i j k l m
***n o p q r s t u v w x y z
***A B C D E F G H I J K L M
***N O P Q R S T U V W X Y Z _
digit: one of
***0 1 2 3 4 5 6 7 8 9
1 An identifier is an arbitrarily long sequence of letters and digits. Each universal-character-name in an
identifier shall designate a character whose encoding in ISO 10646 falls into one of the ranges specified
in E.1. The initial element shall not be a universal-character-name designating a character whose encoding
falls into one of the ranges specified in E.2.
Upper- and lower-case letters are different. All characters are
significant.
20
Смотрим E.1 и E.2:
Annex E (normative)
Universal character names for identifier characters

E.1 Ranges of characters allowed
00A8, 00AA, 00AD, 00AF, 00B2-00B5, 00B7-00BA, 00BC-00BE, 00C0-00D6, 00D8-00F6, 00F8-00FF
0100-167F, 1681-180D, 180F-1FFF
200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F
2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF
3004-3007, 3021-302F, 3031-303F
3040-D7FF
F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-FFFD
10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD,
60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD,
B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD

E.2 Ranges of characters disallowed initially
0300-036F, 1DC0-1DFF, 20D0-20FF, FE20-FE2F
Так что кириллические идентификаторы имеют место быть.
Цитата Сообщение от hoggy Посмотреть сообщение
а вот мингв/гцц/шланг могут послать нафиг даже за такое:
И эти тоже поддерживают юникодные идентификаторы.
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.10.2017, 20:05 17
Цитата Сообщение от Croessmah Посмотреть сообщение
Смотрим E.1 и E.2:
мне это ни о чем не говорит.
я вижу лишь какую то двухбайтовую ботву.

Цитата Сообщение от Croessmah Посмотреть сообщение
И эти тоже поддерживают юникодные идентификаторы.
идентификаторы - точно не поддерживают.
ну или приведите пример.

другое дело:

1. берем гцц/мингв
2. берем исходник в кодировке 1251
3. пишем: std::cout << "привет";
4. наслаждаемся матюгами от компилятонра.
5. ПРОФИТ???!!!
0
4017 / 2563 / 430
Регистрация: 09.09.2017
Сообщений: 11,404
09.10.2017, 20:15 18
Да не должны вроде. Вот вывести вместо русского текста какую-то фигню они могут, но чтобы посылать...
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
09.10.2017, 21:05 19
Цитата Сообщение от hoggy Посмотреть сообщение
идентификаторы - точно не поддерживают.
ну или приведите пример.
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
    int ляляйка = 10;
    std::cout << ляляйка;
}
сохраняем в utf-8.
clang жрет без проблем.
У mingw (gcc) проблемы с этим.
Когда-то висела бага такая на багтрекере.
Сейчас не знаю.
Но можно кодом указать (об этом написано в Character sets, как же Вы читали?):
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
    int \u043B\u0440\u043B\u0440\u0439\u043A\u0430 = 10;
    std::cout << \u043B\u0440\u043B\u0440\u0439\u043A\u0430;
}
Компилировать mingw с флагом -fextended-identifiers.

Ну и можно глянуть на страничку
http://en.cppreference.com/w/c... dentifiers
Note: C++ grammar formally requires Unicode characters to be escaped with \u or \U, but due to translation phase 1, that is exactly how raw unicode characters from the source code are presented to the compiler. Also note that support of this feature may be limited, e.g. gcc
Цитата Сообщение от Croessmah Посмотреть сообщение
И эти тоже поддерживают юникодные идентификаторы.
Цитата Сообщение от hoggy Посмотреть сообщение
2. берем исходник в кодировке 1251
Никакой коллизии не возникло?

Цитата Сообщение от hoggy Посмотреть сообщение
мне это ни о чем не говорит.
Тогда удачи!
0
4017 / 2563 / 430
Регистрация: 09.09.2017
Сообщений: 11,404
09.10.2017, 22:03 20
Цитата Сообщение от Croessmah Посмотреть сообщение
У mingw (gcc) проблемы с этим.
И правильно, ибо нефиг. Ухудшают читаемость исходника почем зря... Понравилось бы читать исходник с китайскими названиями переменных?
0
09.10.2017, 22:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2017, 22:03
Помогаю со студенческими работами здесь

Std и using namespace std
Здравтсвуйте, я не из тех если кому то сказали так надо, а те и пишут что им дали.Поэтому я бы...

Можно ли как-то убрать или заменить std:: в строке std::getline(cin, str);?
Нужно программа без std:: #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;conio.h&gt; #include...

Поиск в std::vector < std::pair<UInt32, std::string> >
Подскажите пожалуйста, как осуществить поиск элемента в std::vector &lt; std::pair&lt;UInt32,...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru