Форум программистов, компьютерный форум CyberForum.ru

Стандарты и стили языков программирования - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.79
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
01.01.2011, 15:16     Стандарты и стили языков программирования #1
Занимаясь программирование, например С++, иногда задумываешься, читая различную литературу и разбирая чужие коды программ, что большинство программистов, как начинающих, так и уже вполне опытных, смешивают два разных языка С и С++ (одним языком их никак не назовешь, даже в самом начале изучения). Причем и в университетах (имею ввиду свой) существует дисциплина ЯП С/C++, в которых с самого начала обучения студентов учат программировать на этих двух языках вместе, типа "выбери сам, что ты хочешь". Ведь это не есть хорошо... Получается "адская смесь" - это уже начало раздражать. Да и на форуме, процентов 80%, таких людей хватает... Даже можно привести пример, когда чел на форуме пишет какой-нить код на Си, он выделяет его как код Си++. Потом начинаешь читать, и как-то не хорошо становится - и это самая мелочь!!! =)
Как Вы относитесь к такой проблеме?!
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XomyaC++
7 / 7 / 1
Регистрация: 25.12.2010
Сообщений: 40
01.01.2011, 15:19     Стандарты и стили языков программирования #2
Mиxaил, а что вам не нравится конкретно?! От этого программы хуже становятся? Или код прям слишком нечитаемый становится? Что для вас значит "мешать Си и С++". По вашему использование, допустим, fprintf() в коде на Си++ недопустимо?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.01.2011, 15:26     Стандарты и стили языков программирования #3
XomyaC++, нежелательно.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
01.01.2011, 15:27     Стандарты и стили языков программирования #4
Цитата Сообщение от XomyaC++ Посмотреть сообщение
По вашему использование, допустим, fprintf() в коде на Си++ недопустимо?
Имхо да!
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
01.01.2011, 15:27  [ТС]     Стандарты и стили языков программирования #5
Все начинается в университете, как научат (правильно или нет), так ты и будешь дальше делать...
А учат не всегда хорошо, поэтому понимание и написание кода становится "убогим", в моем понимании.Все знают, что процедуры ввода/вывода си будут нормально работать и на visual с++, но как таковой программой, написанной якобы на чистом си++, уже не будет.
Могу привести еще один пример. Есть такой сайт codepad.org, в котором можно компилировать код и получать результат, так вот, если попытаться скомпилить на с++ самый простой код си, то он выкинет ошибку, так как в этот компилятор, я так понимаю, встроены читстые языки... Попробуйте!
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
01.01.2011, 15:40     Стандарты и стили языков программирования #6
Цитата Сообщение от XomyaC++ Посмотреть сообщение
По вашему использование, допустим, fprintf() в коде на Си++ недопустимо?
В общем, нежелательно. Если с одним файлом работать через fstream, с другим через stdio - это ещё с практической точки, по-моему, не так страшно, но это как-то странно...
А если, например, смешивать printf в stdin и вывод в cout, чтобы это нормально работало, буфер flush'ится после каждого вывода. А потом возникают вопросы, почему при перенаправлении вывода в файл прога стала работать в стопятьсот раз медленнее, чем при выводе на консоль.
А потом студенту скажут, что аналог для malloc в C - это new в C++. А потом возникает вопрос, почему прогу стало выкидывать на этом new, который бросил исключение, когда malloc возвращал ноль.
Black Fregat
 Аватар для Black Fregat
1353 / 983 / 215
Регистрация: 31.05.2009
Сообщений: 4,093
01.01.2011, 15:54     Стандарты и стили языков программирования #7
Лично мне проблема представляется надуманной. Я считаю, что код C++, находящийся "внутри классов" и исторически, и фактически от кода "pure C" неотличим. Различия начинаются на структурном уровне. Мелкие различия синтаксиса сегодня уже можно игнорировать, тем более, что большинство компиляторов свободно компилируют "смешанный" код при соответствующих настройках.

Далее, фанаты потоков идут лесом: на мой взгляд, наименее продуманное и крайне неудобное образование. Поэтому printf, fprintf, sprintf. Инструмент используется, когда он удобен, а не по соображениям "чистоты языка". Это все равно как дискутировать, можно ли использовать WinAPI в программе MFC - когда уместно, почему нет?

Насчет подсветки - у меня лично сложилось впечатление, что подсветка С на форуме бедна и некрасива, поэтому всегда использую подсветку C++. И опять же, не вижу тут никакого криминала.

А вообще, вечное стремление "чистых сишников" к "самоопределению вплоть до отделения" забавляет, не более. В массовом сознании языки давно слились.

Добавлено через 3 минуты
Somebody, смешивать вообще всегда плохо. Речь идет о выборе способа доступа, и на мой взгляд, нет ничего плохого в использовании только printf/fprintf
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
01.01.2011, 16:11     Стандарты и стили языков программирования #8
Mиxaил, полностью с вами солидарен, так как сам низкоуровневое программирование не очень долюбливаю. Мне вообще кажется, что эти два столь различные, и, я бы даже сказал, противоположные друг другу языка не стоило совмещать в одном разделе форума, где мы вынуждены в половине тем наблюдать, как люди трудятся над массивами и сишными строками, которые любителя C++ под дулом автомата не заставишь использовать.
Также мне кажется очень глупой идея перед изучением C++ изучать Си, скорее уж наоборот, если Си так необходим.
Недавно прочитал в одной книге по C++, как автор справедливо покритиковал своих коллег за то, что они примеры программ в книгах пишут на Си-подобном говнокоде, якобы для понятности не знающим STL, а читатели принимают это за рекомендуемый стиль программирования.
МаксимМВ
C/C++
90 / 90 / 5
Регистрация: 01.07.2010
Сообщений: 281
01.01.2011, 16:12     Стандарты и стили языков программирования #9
Но есть такое случай - если нужно перераспределить память в C++ придётся прибегать к сишным функциям malloc, realloc и free, т.к в C++ нет оператора/функции перераспределения памяти. А нассчёт C++ - часто уходят слишком далеко, думая что в C++ и циклы нельзя использовать, и делают с библиотечными функциями запутывая код, с убеждением, что циклы - "сишное". И код получается таким запутанным и длинным (библиотечные функции в данных случаях не выполняют своей главной задачи - упрощения и сокращения длины кода), что трудно разобраться в коде.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
01.01.2011, 16:22     Стандарты и стили языков программирования #10
Цитата Сообщение от МаксимМВ Посмотреть сообщение
Но есть такое случай - если нужно перераспределить память в C++ придётся прибегать к сишным функциям malloc, realloc и free, т.к в C++ нет оператора/функции перераспределения памяти.
В таких случаях логичней будет использовать std::vector.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
01.01.2011, 17:01     Стандарты и стили языков программирования #11
Цитата Сообщение от МаксимМВ Посмотреть сообщение
А нассчёт C++ - часто уходят слишком далеко, думая что в C++ и циклы нельзя использовать, и делают с библиотечными функциями запутывая код, с убеждением, что циклы - "сишное". И код получается таким запутанным и длинным (библиотечные функции в данных случаях не выполняют своей главной задачи - упрощения и сокращения длины кода), что трудно разобраться в коде.
Дело в том, что «словами» языка C++ являются классы, контейнеры, алгоритмы и функторы. Свободно писать и читать именно на таком языке и означает владеть C++. Сишный цикл обозначается в C++ одним словом-алгоритмом. Может, код от этого получается чуть длиннее, но в C++ это не самоцель, цель – в уровне абстракции высоком настолько, насколько это возможно. А если такой код вам кажется запутанным и малопонятным, - это означает, что ваше мышление пока еще сишное, а C++ вам только предстоит освоить.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.01.2011, 12:39     Стандарты и стили языков программирования #12
МаксимМВ, Упрощение кода не является наименьшее колличество строк. Плюс полностью согласен с Mr.X.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.01.2011, 05:51     Стандарты и стили языков программирования #13
Цитата Сообщение от Mиxaил
Есть такой сайт codepad.org, в котором можно компилировать код и получать результат, так вот, если попытаться скомпилить на с++ самый простой код си, то он выкинет ошибку, так как в этот компилятор, я так понимаю, встроены читстые языки...
C++
1
2
3
4
5
6
7
#include <cstdio>
 
int main(void)
{
    printf("hello\n");
    return 0;
}
Добавлено через 18 минут
Цитата Сообщение от Mr.X
Дело в том, что «словами» языка C++ являются классы, контейнеры, алгоритмы и функторы.
а строковые литералы, это куда-то исчезло из C++? не исчезло, а это не массив? это массив
и у него есть все свойства массива
C
1
2
3
    switch ("abcd"[i]) {
    case 'a' :
    case 'b' :
и конкатенация у него есть и символы в нём гарантированно хранятся друг за другом, потому что это массив
там ещё много чего есть

C++
1
cout << "abcd";
и это дело вполне обычное для C++, что передаётся в функцию вывода, не &"abcd"[0] ? это же указатель
как же так C++ и указатель

C++
1
cout << *"abcd";
ещё
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.01.2011, 06:07     Стандарты и стили языков программирования #14
accept, Он о том, что в С++ это редко используеться. Правильнее использовать std::string, которая пусть и является оберткой си-шной строки с дополнительными функциями - зато нам не приходится работать с указателями, памятью и прочими вещами. STL создавалось, чтобы его использовать. И в С++ с STL возможно сделать наверное почти все, при должным владении оным.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.01.2011, 07:10     Стандарты и стили языков программирования #15
Цитата Сообщение от ForEveR
Правильнее использовать std::string
а зачем создавать строку, если нужно просто что-то вывести ?
что-то я не замечал, когда выводят результаты работы программы, чтобы строки для этого создавали
string ограничит это дело, попробуй убрать из string нуль-символ
а вот с массивом типа char [] можно такое проделать, прикинь
туда можно записать любые байты, хоть 0 0 0 1 2 3, а в string нельзя
а ещё можно попробовать в середину вектора вставить новое значение, сохранив предыдущие
с массивом это легко проделать
XomyaC++
7 / 7 / 1
Регистрация: 25.12.2010
Сообщений: 40
03.01.2011, 09:58     Стандарты и стили языков программирования #16
Цитата Сообщение от accept Посмотреть сообщение
туда можно записать любые байты, хоть 0 0 0 1 2 3, а в string нельзя
для этого уже vector используется
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,391
03.01.2011, 11:25     Стандарты и стили языков программирования #17
Ну, как я считаю, все не так страшно. Нет ничего плохого в том, чтобы использовать сишные функции вывода в программе на С++, тем более, что они гораздо удобнее С++-шных потоков (ИМХО). А вот смешивать в одной программе функции и операторы для выделения/освобождения памяти - это действительно преступление
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.01.2011, 13:45     Стандарты и стили языков программирования #18
accept, В вектор это делается легче) Найти итератор середины - вставить - и никаких лишних телодвижений.
Насчет строки с любыми байтами. Как насчет примера?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.01.2011, 10:28     Стандарты и стили языков программирования #19
Цитата Сообщение от ForEveR
Найти итератор середины - вставить
что-то неконкретно, чего там удобного
с char [] это делается через memmove()

Цитата Сообщение от ForEveR
Как насчет примера?
помести в string байты 0x01 0x02 0x00 0x03

C++
1
2
3
4
5
6
    string s;
    
    s[0] = 0x40;
    s[1] = 0x40;
    cout << s << endl;
    cout << s.size() << endl;
Цитата Сообщение от XomyaC++
для этого уже vector используется
у тебя строка, ничего не надо создавать, если нужно поместить туда байты
если ты создашь сразу вектор, то потом понадобится использовать его как строку
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2011, 16:34     Стандарты и стили языков программирования
Еще ссылки по теме:

С++ 4 и 5 поколение языков программирования C++
Посоветуйте литературу "Синтаксис и семантика языков программирования С/С++ и Паскаль" C++
Оформление кода на С++ (стандарты кодирования) C++

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

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
04.01.2011, 16:34     Стандарты и стили языков программирования #20
Цитата Сообщение от accept Посмотреть сообщение
и символы в нём гарантированно хранятся друг за другом
И в векторе, и в string, аналогично.
Цитата Сообщение от accept Посмотреть сообщение
попробуй убрать из string нуль-символ
Смысл?
Цитата Сообщение от accept Посмотреть сообщение
а вот с массивом типа char [] можно такое проделать, прикинь
С вектором тоже, и что? И вывести его как строку тоже не составляет особого труда(опять же, смысл?).
Цитата Сообщение от accept Посмотреть сообщение
туда можно записать любые байты, хоть 0 0 0 1 2 3, а в string нельзя
И с каких пор?
Цитата Сообщение от accept Посмотреть сообщение
а ещё можно попробовать в середину вектора вставить новое значение, сохранив предыдущие
с массивом это легко проделать
C вектором не сложнее. )
Цитата Сообщение от accept Посмотреть сообщение
string s;
s[0] = 0x40;
s[1] = 0x40;
cout << s << endl;
cout << s.size() << endl;
И что должен был показать этот неправильный пример? )) Что нельзя обращатся по идексу к элементам строки нулевого размера? )
Yandex
Объявления
04.01.2011, 16:34     Стандарты и стили языков программирования
Ответ Создать тему
Опции темы

Текущее время: 01:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru