2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 12:42 
Аватара пользователя


22/09/09

1907
warlock66613
В первом посте я писал, что у меня однобокое знакомство с С/C++. Учитывая это, скажите, пожалуйста, что должна делать функция getnextchar, когда символы кончились и следующего нет?

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 12:51 
Заслуженный участник


02/08/11
6894
bin в сообщении #928154 писал(а):
Учитывая это, скажите, пожалуйста, что должна делать функция getnextchar, когда символы кончились и следующего нет?
Возвращать ноль ('\0'). Отличие паскаля от си в том, что в паскале := не является оператором. В си = является оператором и возвращает левую часть в качестве результата, так что можно писать a = b = c = 5; - это то же самое, что c = 5; b = c; a = b; Кроме того, в си нет булевского типа в яном виде, и в качестве false используется ноль, а в качестве true - любое ненулевое значение. В C++ есть bool в явном виде, но автоматическое приведение всего чего можно к bool осталось для совместимости.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 13:22 
Аватара пользователя


22/09/09

1907
warlock66613 в сообщении #928155 писал(а):
Отличие паскаля от си в том, что в паскале := не является оператором.
Является:
Цитата:
Код:
<оператор присваивания>::=<переменная> := <выражение>|<имя функции> := <выражение>
(Н.Вирт, Сообщение)
warlock66613 в сообщении #928155 писал(а):
В си = является оператором и возвращает левую часть в качестве результата, так что можно писать a = b = c = 5;
А можно?:
Используется синтаксис C
a=b=c=d;
PL/1 за такую возможность когда-то очень ругали.
warlock66613 в сообщении #928155 писал(а):
Возвращать ноль ('\0').
И что происходит, когда переменной присваивается значение нуля? Цикл продолжается? А как в Вашем примере решается проблема задания длины строки some_string? Она автоматически увеличивается с инкрементом i? Как в Паскале:
Используется синтаксис Pascal
some_string:=some_string+c

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 14:10 
Заслуженный участник
Аватара пользователя


06/10/08
6422
bin в сообщении #928161 писал(а):
Является
Издерки терминологии. Имелось в виду operator, а не statement.
bin в сообщении #928161 писал(а):
И что происходит, когда переменной присваивается значение нуля? Цикл продолжается?
Нет. Если getnextchar возвращает 0, то значением выражения c = getnextchar() будет 0 и цикл завершится.
bin в сообщении #928161 писал(а):
А как в Вашем примере решается проблема задания длины строки some_string? Она автоматически увеличивается с инкрементом i?
Ну это же пример. Если учитывать фиксированность длины, то цикл будет выглядеть как while ((c=getnextchar()) && (i < length))

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 14:36 
Аватара пользователя


22/09/09

1907
Xaositect в сообщении #928167 писал(а):
Если getnextchar возвращает 0, то значением выражения c = getnextchar() будет 0 и цикл завершится.
Если вместо getnextchar вызывать функцию, которая случайным образом будет выдавать целое от нуля до десяти, то цикл тоже завершится, как только из этой функции придет ноль?

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 14:38 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Да.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 14:54 
Заслуженный участник
Аватара пользователя


30/01/06
72407
warlock66613 в сообщении #928147 писал(а):
Вот обобщённый пример как "явный баг" используется в реальных программах

Собственно, классика выглядит так:
(скобочки расставлены для читаемости, а хардкорные программеры обходятся без них).

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 15:18 
Аватара пользователя


22/09/09

1907
А не лучше так?:
Используется синтаксис C
do
    c = getnextchar();
    some_string[i++] = c;
while (c!=0);
Или так?:
Используется синтаксис C
do  
   int flag = (some_string[i++] = getnextchar());
while (flag);
По количеству инструкций CPU все эти варианты будут примерно равны, а по читаемости while(c = getnextchar()) выглядит хуже.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 15:57 
Заслуженный участник


02/08/11
6894
bin в сообщении #928218 писал(а):
А не лучше так?:
Это неэквивалентный код: проверка не в том месте.
bin в сообщении #928218 писал(а):
по читаемости while(c = getnextchar()) выглядит хуже
В данном случае это субъективно. Для меня do-while в принципе не читаем (не говоря о том, что в данном случае он делает не то, что делал исходный код). Но переписать код можно, только надо использовать break.

-- 08.11.2014, 17:01 --

Вот кстати чего нет в паскале (помимо нормального объявления переменных): операторов return, break и continue. В результате код местами превращается в нечитаемую лесенку, обросшую странными флагами.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 16:19 
Аватара пользователя


22/09/09

1907
warlock66613 в сообщении #928235 писал(а):
Вот кстати чего нет в паскале (помимо нормального объявления переменных): операторов return, break и continue. В результате код местами превращается в нечитаемую лесенку, обросшую странными флагами.
В Delphi есть exit, break и continue. В крайнем случае в неборландовском Паскале всегда можно было использовать goto. Хорошим примером такого использования был исходный код компилятора Pascal 8000 для OS 360/370: на почти 10 тыс. строк кода только один goto. А чем по Вашему ненормально объявление переменных в Паскале?

-- Сб ноя 08, 2014 16:25:03 --

warlock66613 в сообщении #928235 писал(а):
Для меня do-while в принципе не читаем
Интересно, что в книгах по С/С++ я тоже встречал утверждения, что почему-то многие программисты на этх языках не любят и редко используют do-while, а в Паскале цикл с постусловием используется не реже, чем с предусловием.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 16:27 
Заслуженный участник


02/08/11
6894
bin в сообщении #928244 писал(а):
А чем по Вашему ненормально объявление переменных в Паскале?
То, что переменную надо объявлять до того, как написан код, который её использует. Это довольно затруднительно, поэтому обычно переменную объявляют всё-таки только когда она стала нужна. Но при этом приходится бегать туда-сюда между кодом и блоком var. Бывает, что переменная нужна только внутри цикла, но её тоже приходится объявлять вместе со всеми, - в рузультате она может быть по ошибке использована за пределами цикла. Поскольку объявление переменной находится далеко от места её использования, бывает сложно понять какого она типа.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 17:26 
Аватара пользователя


22/09/09

1907
warlock66613 в сообщении #928249 писал(а):
bin в сообщении #928244 писал(а):
А чем по Вашему ненормально объявление переменных в Паскале?
То, что переменную надо объявлять до того, как написан код, который её использует. Это довольно затруднительно, поэтому обычно переменные объявляют всё-таки когда она стала нужна. Но при этом приходится бегать туда-сюда между кодом и блоком var. Бывает, что переменная нужна только внутри цикла, но её тоже приходится объявлять вместе со всеми, - в рузультате она может быть по ошибке использована за пределами цикла. Поскольку объявление переменной находится далеко от места её использования, бывает сложно понять какого она типа.
Мы ведь говорим о структурном программировании. И получается, что в Паскале его принципы реализуются полнее и структура каждого программного блока более четкая:

Используется синтаксис Delphi
// заголовок блока: program/unit/procedure/function
label
....
const
...
type
...
var
...
// вложенные процедуры и функции
begin
// тело программы/процедуры
end;/end.


Т.о. для одного и того же алгоритма, реализованного на С/С++ и на Pascal, так что общее количество строк примерно одинаковое, каждый раздел (const, type, var, begin) будет короче, что облегчает его восприятие. А на С/С++, когда все вперемешку, получаются слишком длинные куски. Впрочем, судя по упомянутым CUDA-примерам, и у программистов на С/С++ есть хорошо заметная тенденция сначала объявлять все (или хотя бы большинство переменных), а потом уже и производить действия с ними. А иначе можно десять раз i,j,k объявить, потом замучаешься переименовывать/удалять ;-)

Кстати сказать, С/С++ не допускает вложенных функций, в отличие от процедур и функций Паскаля. Это, на мой взляд, серьезный минус. Что касается навигации по коду, то при современных IDE это не проблема. Навел курсор и видишь определение во всплывшем окне. Если, конечно, использовать Блокнот, то будет не очень удобно работать с большой программой. А внешние вызовы (библиотечных функций, объектов) будут в Блокноте сущей каторгой.

Отдельное сомнение вызывает целесообразность заголовочных файлов (расширение .h), которых в больших проектах бывает очень много. Т.о. в сравнимых проектах в С/С++ гораздо больше файлов, чем в Delphi, что сказывается негативно на скорости построения. Попробуйте, например, перекомпилировать ядро Линукса ;-)

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 17:32 
Заслуженный участник
Аватара пользователя


06/10/08
6422
bin в сообщении #928273 писал(а):
Мы ведь говорим о структурном программировании. И получается, что в Паскале его принципы реализуются полнее и структура каждого программного блока более четкая
Блок - это не только процедура. Цикл, например, часто быввает тоже обособленным блоком и в нем могут быть переменные, используемые только в этом цикле и семантически к нему привязанные. C++ и C99 позволяет нормально объявить такую переменную, а паскаль - нет.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 17:42 
Заслуженный участник


02/08/11
6894
bin в сообщении #928273 писал(а):
что облегчает его восприятие
Да, хорошее восприятие блока var очень важно - ведь именно там скрыта логика программы.
bin в сообщении #928273 писал(а):
А на С/С++, когда все вперемешку, получаются слишком длинные куски.
Объявление переменной в C++ не занимает отдельной строки.
bin в сообщении #928273 писал(а):
у программистов на С/С++ есть хорошо заметная тенденция сначала объявлять все (или хотя бы большинство переменных), а потом уже и производить действия с ними
Нет, такой тенденции нет. Просто есть плохие программисты. Или лучше сказать плохой код.
bin в сообщении #928273 писал(а):
Кстати сказать, С/С++ не допускает вложенных функций, в отличие от процедур и функций Паскаля.
Это большой плюс, потому что вложенные функции паскаля - дурацкое излишество, ибо вложенные функции не отличаются от невложенных. Они не анонимные и их опять-же нельзя расположить посреди основного кода. О замыканиях я уж не говорю. Обратно, современный C++ поддерживает лямбды с замыканиями, что есть действительно полезная фича. А компилятор GCC поддерживает вложенные функции с замыканиями в C в качестве расширения.

 Профиль  
                  
 
 Re: Книга с полным и систематичным изложением современного С++?
Сообщение08.11.2014, 18:07 
Заслуженный участник
Аватара пользователя


30/01/06
72407
warlock66613 в сообщении #928249 писал(а):
То, что переменную надо объявлять до того, как написан код, который её использует. Это довольно затруднительно

+ "выделение ресурса есть инициализация".

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 101 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group