Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Давайте обсудим недостатки и недочёты С++, недостатки языка 
:(
    Опции темы
setq
Дата 27.9.2003, 00:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











я собственно к чему. э... у любого языка есть недостатки, недочёты и недосмотры ну те или иные. не боги ведь горшки обжигали в конце-то концов. Страуструп тоже человек. наверно. может быть. ну не исключён такой вариант. :-)

понятно, что половина "недостатков" пропадает с увеличением опыта, когда узнаёшь Си++ получше.

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



начнём с мелочей :-)

0) мне не нравится, что break'ом нельзя выкинуться из конструкции
for (;;) switch () { ... }
потому что это слово одинаково как для выхода из for (;;) так и из switch () {}
приходится чесать правой лапой за левым ухом.

1) мне не нравится, что в определении функции нужно писать
f (int x, int y)
и нельзя просто
f (int x,y)

2) мне не нравится, что можно написать
for (;;) {
вместо
for (; true ;) {
и нельзя
while () {
вместо
while (true) {

3) мне не нравится, что если в for (;;) в круглых скобках до первой запятой объявляется переменная -
for (int i;;)
- то туда уже не засунуть других выражений, типа -
for (i=6, j=0, k=666;;)

пока всё :-))
  Вверх
RAN
Дата 27.9.2003, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



А можно только ругать? А оспаривать и хвалить?
Ну, всё равно молчать не умею smile.gif .

Насчёт break
Я об этом тоже думал. И мне хотелось бы, чтоб в дополнении к break существовал бы оператор, условно назовём его block <имя> {...}.
Чтоб возможно было такое:
Код

block SomeBlock
{
   ..............
   ..............
   break SomeBlock;
   .............
}


Наличие имени у блока позволяло бы выходить из вложенных блоков. Имена были бы локальны, т.е. действовали лишь в пределах блока. И никаких конфликтов. Просто бы решалась проблема выхода из вложенных циклов
Код

block Finding
   for(i=0; i<10; i++)
       for(j=0; j<10; j++)]
           if(a[i][j] == x) break Finding;
/* Всё результат в i и j */

Вот такая идея smile.gif

P.S. Я подсел на C конкретно. С - лучший язык smile.gif
PM MAIL ICQ   Вверх
p0s0l
Дата 27.9.2003, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



RAN - идея насчет блоков с точки зрения компиляции не очень удачна, так же как и простые переходы (не знаю, есть ли они в C, но в паскале это были goto <label>), т.к. это нарушает структуру программы...



--------------------
С уважением, г-н Посол.
PM   Вверх
DENNN
Дата 27.9.2003, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата
простые переходы (не знаю, есть ли они в C,

Есть goto:метка
Цитата
идея насчет блоков с точки зрения компиляции не очень удачна,......т.к. это нарушает структуру программы...

Почему это интересно? По современным представлением уровень программы понижается с каждым оператором goto (причем не только C, но и любой другой). Существует теорема (или что-то подобное, названия не помню), что любую конструкцию, использующую операторы перехода можно переписать без них (что кстати правда) smile.gif ).
block.....break также удовлетворяет этим понятим, как и while....break, for....break и т.п.

А мне не нравиться, что при объявлении функции значения параметров по умолчанию всегда должны стоять последними, а при вызове такой функции, если мне надо передать последний параметр, то я вынужден и прописывать все предыдущие перед ним. Это серьезное препятствие при позднем совершенствовании кода, кода скажем мне необходимо в функцию добавить еще один параметр не имеющий default-значения, то приходиться весь код вызовов этой функции переписывать (ну либо искать более удобные пути).
PM ICQ   Вверх
mr.DUDA
Дата 27.9.2003, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



ОЧЕНЬ НЕ НРАВИТСЯ путаница с .h и .cpp - с точки зрения пространства имён (что откуда будет видно, если поочередно подключать "H к CPP", "CPP к CPP", "CPP к H" и "H к H" adv/hair.gif, и почему мой любимый VC++ не разрешает мне подключать Includ'ы половиной из вышеперечисленных способов ?). Если бы не было такой путаницы (а было бы например как в C# - один тип файлов), было бы проще жить нам (и сложнее компилятору smile.gif но это ведь его проблемы).


--------------------
user posted image
PM MAIL WWW   Вверх
Crait
Дата 27.9.2003, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 20.2.2003

Репутация: нет
Всего: 1



CPP forever ! adv/65.gif adv/65.gif adv/65.gif

setq, твоя третья проблема может быть разрешена так :
for (int i=6, j=0, k=666;;)

А вот мне бы хотелось вложенных функций - как в Паскале.

А также того, чтобы при объявлении переменных класса
можно было бы указывать инициализатор :

class MyClass
{
int cnt = 0;
};

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

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

printf("Ошибка ... в функции %s",__FUNCTION_NAME__);

А еще поддерживать двоичный формат :
long i = 0b10011100011000111000001100000110;

И еще - чтоб можно было делать switch по переменной любого типа :

switch (str)
{
case "King":
...

case "Crimson":
...
}

switch (d_value)
{
case double(1) :
...

case double(1.5) :
...
}

И чтоб как в Паскале можно было в switch'е указывать диапазон :

switch (i)
{
case 1 .. 3:
...

case 4:
...
}

И чтобы можно было переопределять операторы с двумя параметрами.
Типичный пример - operator[][] для обращения к элементам матрицы.

И чтобы typeof включили в стандарт.

Фу, блин, расписался... Все же C++ - лучший язык программирования !

Это сообщение отредактировал(а) Crait - 27.9.2003, 14:50
PM MAIL   Вверх
maxim1000
Дата 27.9.2003, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



много того, что хотелось бы видеть в C++ (по крайней мере мне), есть в Delphi (точнее в Object Pascal):
1. properties
2. dcu - объявления и реализации находятся в одном файле
3. уже упоминавшееся (int x,y)
4. div и /, а не просто / - чтоб всегда было видно дробноеделение или нацело

Это сообщение отредактировал(а) maxim1000 - 27.9.2003, 15:22


--------------------
qqq
PM WWW   Вверх
GanZaleZ
Дата 27.9.2003, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.7.2003

Репутация: нет
Всего: нет



Эх человеки ! Как грили Пионеры - "Мы не ищем лугких путей"
Так что если бы да кобы то С++ превратился бы в PHP и не нужно бы было обьявлять какого типа переменная ! ))) но это было бы уже смешно !
А может вообще зачем чтото писать ? Вышел бы Visual C# какойнить 9 версии , и чтобы там вам
Вообще ниче писать не надо было , мышкой поводил , поколдовал , и все ! Хе хе хе
Есть конечно траблы ! где не без них ! Но мне всерафно кажется что это обсуждать - это как обсуждать РУССКИЙ язык ! Вот я фсеже не пойму почему слово КОФЕ мужского рода ! ))))
PM MAIL   Вверх
Fantasist
Дата 27.9.2003, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
block.....break также удовлетворяет этим понятим, как и while....break, for....break и т.п.


Ничего подобного! Во-первых, с точки зрения структуры, break и continue реккомендуется использовать как можно реже. Во-вторых, в while, do и for эти операторы прерывают выполнения в границе одного блока и вполне понятно какого. А конструкция:

Код

block Finding
  for(i=0; i<10; i++)
      for(j=0; j<10; j++)]
          if(a[i][j] == x) break Finding;


ничем не отличается от:

Код

  for(i=0; i<10; i++)
      for(j=0; j<10; j++)]
          if(a[i][j] == x) goto Finding;
Finding:


Так что и выдумывать ничего не надо.

Цитата
А мне не нравиться, что при объявлении функции значения параметров по умолчанию всегда должны стоять последними,


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

Цитата
при позднем совершенствовании кода, кода скажем мне необходимо в функцию добавить еще один параметр не имеющий default-значения


Используй перегрузку.

Цитата
И еще - чтоб можно было делать switch по переменной любого типа :


Так так оно уже и есть. Ничем от паскаля не отличается. Разница только в том, что в Паскале есть тип строка, а в С++ нету.

Цитата
Но мне всерафно кажется что это обсуждать - это как обсуждать РУССКИЙ язык !


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



--------------------
Волны гасят ветер...
PM MAIL   Вверх
maxim1000
Дата 28.9.2003, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата

Цитата
А мне не нравиться, что при объявлении функции значения параметров по умолчанию всегда должны стоять последними,

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

"теоретически нельзя": не стоит бросаться такими выражениями, их еще нужно доказывать...
или опровергать smile.gif
представим себе, что при вызове фунукции вместе со значениями можно писать имя параметра (по-моему, я этовидел в VB или еще в каком-то бейсике)
тогда вполне возможно указать любое подмножество параметров, а остальные оставить по умолчанию
P.S.
Хотя лично мне такое бы не понравилось...


--------------------
qqq
PM WWW   Вверх
setq
Дата 28.9.2003, 10:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Fantasist <<Действительно, что его обсуждать - все равно мы им не пользуемся>>
:-)
  Вверх
p0s0l
Дата 28.9.2003, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Цитата
Почему это интересно? По современным представлением уровень программы понижается с каждым оператором goto (причем не только C, но и любой другой). Существует теорема (или что-то подобное, названия не помню), что любую конструкцию, использующую операторы перехода можно переписать без них (что кстати правда)  ).

И к чему это сказано ? Си - ЯВУ, зачем понижать уровень с помощью goto ?
Я же говорил, что такие конструкции как block ... break и goto нарушают структурность, иерархичечность, что присуще ЯВУ, а не низкоуровневым языкам... Конечно, можно пользоваться goto, что я и делал, когда начал прогать, но сейчас я уже непредставляю, куда можно сунуть goto...
Цитата
break и continue реккомендуется использовать как можно реже.
Почему ? Это как раз-таки ничего не нарушает, т.к. выход происходит за пределы текущего блока... Это всё равно, что сказать, что return не рекомендуется использовать - смысл break и return полностью совпадает (кроме возвращаемого значения) - выход из текущего блока(функции). Можно было бы оставить в функции только 1 return в самом конце, но кто так делает ?
А вот если выход был бы за пределы внешнего блока, то тут могли бы появиться некоторые неувязочки, т.к. вначале каждого блока может выделятся память или запоминаться в стеке регистры (соответственно в конце блока регистры восстанавливаются) - тогда для организации выхода из двойного блока пришлось бы генерить специальный код для восстановления регистров и памяти.
Цитата
Хе, ну ты сказанул. По другому даже теоретически нельзя, так что эта претензия не в какие ворота не лезет.

Может я что-то не понимаю, но почему нельзя сделать такие вызовы:
func1(,,,,,2.434);
Т.е. первые параметры по умолчанию ?...
Цитата
Так так оно уже и есть. Ничем от паскаля не отличается. Разница только в том, что в Паскале есть тип строка, а в С++ нету.

К слову: в Паскале нельзя делать case по строковым переменным (и по float тоже), можно только по целочисленным или перечисляемым типам...



--------------------
С уважением, г-н Посол.
PM   Вверх
Crait
Дата 28.9.2003, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 20.2.2003

Репутация: нет
Всего: 1



2 Fantasist

Ты не прав, что в switch'е можно использовать переменную любого типа.
Попробуй скомпилировать хотя бы следующее :

int f1 (double Value)
{
switch (Value)
{
case double(1):
return 1;

case double(1.5):
return 2;
}

return 3;
}

PM MAIL   Вверх
Fantasist
Дата 29.9.2003, 04:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Почему ? Это как раз-таки ничего не нарушает, т.к. выход происходит за пределы текущего блока... Это всё равно, что сказать, что return не рекомендуется использовать - смысл break и return полностью совпадает (кроме возвращаемого значения) - выход из текущего блока(функции). Можно было бы оставить в функции только 1 return в самом конце, но кто так делает ?


Вот именно тем и нарушает, что это безусловный выход. Я знаю одного человека (знаю, конечно, сильно сказано) который ругает своих подчиненных за использование более одно return в функции. Ну, ругает, может, сильно сказанно, но очень не поощряет. Почему? Все из-за той же структуры. И смысл break'a и return'a не совсем совпадают. После break'а еще код может выполнятся в данной функции - после return'a нет. Про continue я вообще молчу. Видал я с ним такое! smile.gif

Цитата
Может я что-то не понимаю, но почему нельзя сделать такие вызовы:
func1(,,,,,2.434);


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

Цитата
К слову: в Паскале нельзя делать case по строковым переменным (и по float тоже), можно только по целочисленным или перечисляемым типам...


Ну так я и говорю, ничем от паскаля не отличается. smile.gif Да и вполне понятно почему. switch - конструкция используемая для бысрого перехода по таблице значений. Из строк таблицу не построишь - строки надо сравнивать побайтно. Ну а значение с плавающей точкой так и вообще сравнивать нельзя, хоть с if'ом, хоть со switch'eм.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Vyacheslav
Дата 29.9.2003, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Код

try
{
 for (;;)
   switch
   {
     ...
     throw 1;
   }
}
catch(...)
{
}


Остальное все, по моему, не стоит и обсуждать.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.