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
7059
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
7059
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
7059
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
7059
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, Супермодераторы



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

Сейчас этот форум просматривают: granit201z


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

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