C++ — На тему C++.

Содержание

Записки программиста

Почему не лишено смысла писать код на C, а не на C++

11 февраля 2020

Сегодня мы поговорим на тему «C против C++». Некоторые читатели данного блога уже знакомы с моей точкой зрения по этому поводу. Когда встает вопрос с формулировкой вроде «похоже, мы решаем задачу, где очень важна скорость выполнения кода, и нужно выбрать между языками C и C++», в последнее время я склонен рекомендовать C. Многие программисты при этом недоумевают, мол «как же так, ведь С++ новее и имеет больше фичей, и вообще C входит в него как подмножество». Поэтому я хотел бы подробно объяснить свою точку зрения один раз в данном посте, так как каждый раз объяснять ее заново занимает ощутимое количество времени.

Хотелось бы начать с небольшого дисклеймера. Всегда найдутся люди, которые пишут на C++ последние лет 20, и потому (1) они искренне считают язык простым и понятным, (2) им не хочется учить что-то новое, ведь их и здесь неплохо кормят. Это, собственно, и есть так называемый C++ головного мозга. Далее я предполагаю, что читатель не страдает от этого недуга и не утратил трезвость восприятия и открытость мышления по каким-либо иным причинам. Также стоит отметить, что в вопросах «какой язык лучше» нет правых и неправых. Одни и те же объективные преимущества и недостатки воспринимаются разными людьми с разными весовыми коэффициентами, поэтому на выходе получаются разные значения функции fitness. В этой заметке мне хотелось бы пояснить причины, по которым у меня весовые коэффициенты выставлены так, как они выставлены, а не доказать, что у кого-то они выставленные неверно.

Сразу отмечу, что я не считаю, что C++ умер, что это ужасный и совершенно ни на что не годный язык или что-то в этом роде. Трудно ругать язык, на котором написаны Chromium, Skype, Sublime Text и множество других программ, которые я использую каждый день. Не говоря уже о великом множестве хороших библиотек на С++. Тут мне сразу вспоминаются, например, Assimp и wxWidgets. Более того, вы можете помнить, что в заметке Критика языка Rust и почему C/C++ никогда не умрет я отстаивал C++ и говорил, что в обозримом будущем он никуда не денется. Нельзя исключать и культурный фактор. Так игры AAA класса принято писать на C++, потому что в индустрии уже много лет все так делают. Если вы работаете в этой индустрии, то особого выбора у вас может и не быть.

Несмотря на все это, я считаю, что в третьем тысячелетии лучше не писать нового кода на C++, если, конечно, (!) у вас есть такая возможность. И далее я постараюсь более подробно объяснить эту точку зрения.

Примечание: Специально для читателей, считающих, что на C давно никто не пишет, спешу сообщить, что это не так. В первую очередь на C, конечно же, ведется разработка всех современных операционных систем, драйверов, и подобных вещей, например, систем виртуализации. Многие десктоп приложения все так же пишутся на C, например, Claws Mail, Liferea, XChat, Transmission, Gimp, Pidgin, Tox, а также оконные менеджеры и десктоп окружения — Xfce, Lxde, Awesome, i3, и другие. Серверные приложения также часто разрабатываются на C. Тут вспоминается HAProxy, lighttpd, Nginx, Nagios, Memcached, Redis и PostgreSQL. Еще можно вспомнить, например, виртуальную машину языка Erlang и интерпретатор языка Python. Все эти приложения объединяет то, что они должны использовать доступные им ресурсы максимально эффективно — десктоп приложения должны хорошо работать на бюджетных компьютерах, даже таких, как Raspberry Pi, серверные приложения должны обрабатывать как можно больше запросов в секунду, и так далее.

Итак, основная идея, пожалуй, состоит в следующем. Если вы решаете задачу, где действительно очень важна скорость (определение см далее), вы все равно не сможете использовать C++. Вы, вероятно, сможете писать на так называемом «C с классами» или «C с шаблонами». Эти диалекты языка C, бесспорно, имеют право на жизнь. И если вы называете «языком C++» эти диалекты, то я, пожалуй, с вами даже соглашусь — для задачи надо брать «язык C++», срочно! Только нужно при этом быть очень уверенным, что через год вы не выйдите за рамки «C с шаблонами». Эта действительно большая проблема на практике и она более детально описана далее.

Однако большинство людей под С++ понимают так называемый «современный C++», со счетчиками ссылок, классами, исключениями, шаблонами, лямбдами, STL, Boost, и так далее. То есть, тот C++, на котором вы пишите, почти как на Java, в котором никогда не встречаются обычные указатели, и вот это все. Если вам очень важна скорость, то писать на таком C++ вы не сможете. Если же он вам подходит, то лучше взять Java, Go или любой другой высокоуровневый язык по вкусу. В них все те же возможности реализованы намного лучше. А узкие места при необходимости, которой, впрочем, может и не возникнуть, вы всегда сможете переписать на C.

Позвольте пояснить, что я имею ввиду под задачами, где очень важна скорость. Вы едете на машине. Вдруг в нескольких метрах впереди выбегает человек. На принятие решения водителю в среднем требуется около одной секунды. Нога мелено перемещается с педали газа на педаль тормоза. Затем медленно вдавливает тормоз в пол. Расстояние между автомобилем и человеком в это время сокращается. Наконец, сигнал от педали тормоза летит в бортовой компьютер автомобиля. И вот тут ни в коем случае программа не может сказать «о, счетчик ссылок обнулился, пойду-ка я собирать мусор по всему дереву» или даже «секундочку, я только схожу в vtable… как, ее нет в L1? ой…». Программа должна обработать сигнал как можно быстрее, тут же ударив по тормозным дискам. Ни о каких смартпоинтерах и прочих видах автоматического управления памятью, ровно как и о развесистых иерархиях классов, в таких задачах и речи быть не может.

Из менее драматичных примеров можно привести любую систему, где не работает правило «90% времени выполняется 10% кода, эти 10% и будем оптимизировать». Если код, который выполняется всего лишь 10% времени, ускорить на 1/20, суммарная производительность вырастит на жалкие 0.5%. Но в масштабах компании вроде Google или широко используемого приложения вроде PostgreSQL или Nginx эти 0.5% ускорения могут означать миллионы долларов экономии. То есть, несколько месяцев работы небольшой группы программистов в этом направлении окупаются с лихвой. А раз так, почему бы, например, не отказаться от STL совсем и сразу не использовать алгоритмы и структуры данных, заточенные под конкретный случай (примеры есть далее по тексту)?

Я могу привести еще много примеров такого рода. Но идея, надеюсь, ясна. Если решаемая вами задача такова, что написать 90% кода на высокоуровневом языке и 10% на C никак нельзя, то ни на каком «C++, который почти как Java, только компилируемый в машинный код» вы писать не сможете. Если же в вашей задаче можно не париться по поводу 0.5% производительности, то скорость вам нужна не так сильно, как вы думали.

Серьезно, возьмите лучше Go, Java, или любой другой язык по вкусу. Сборка мусора там сделана намного лучше (напомню, что счетчики ссылок плохо работают для большого количества быстро умирающих объектов), прочее управление ресурсами, управление зависимостями, инструменты разработки (IDE и прочие), генерики, лямбды, неймспейсы, исключения, автоматический вывод типов, классы и интерфейсы там сделаны намного лучше. В качестве бонуса вы получите существенно большую скорость разработки, куда более читаемые сообщения об ошибках, куда более лучшую кроссплатформенность, простую отладку, высокую скорость компиляции и так далее, за что там обычно вполне заслуженно ругают С++. Да и найти достойных программистов на этом другом языке станет на порядок проще.

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

  • Согласно книге The Design and Evolution of C++, язык C++ был создан Страустропом, как «C для крупных проектов». Однако практика показывает, что на C вполне успешно разрабатываются очень даже крупные проекты. А от многих возможностей языка C++ отказываются даже в проектах, которые не являются такими уж крупными. Потому что возможности эти зачастую не упрощают разработку, а лишь усложняют ее. То есть, C++ не только плохо решает изначальную проблему, но и усложняет ее решение, да и проблемы то, оказывается, не было вовсе.
  • Лямбды и прочие ништяки не всегда получается использовать на работе, так как о C++11 там только мечтают. К сожалению, многие реальные проекты на C++ в наше время — это страшный легаси с C++98, самописным STL, форкнутым Boost, Visual Studio 6 и CVS. Может быть, я тут немного и преувеличиваю, но идея, надеюсь, ясна.
  • Сложность кода. Если вы видели код на C++, реальный, а не из учебника, то знаете, что он часто он оказывается действительно очень непрост для восприятия. Из недавних примеров мне вспоминается GLM. Так выглядит его исходный код (только один из файлов, их там еще очень много), а так выглядит код на Си, который делает вообще все, что мне было нужно на самом деле. Бесспорно, после 20 лет программирования на C++, код GLM любому покажется простым, понятным и элегантным. Но у меня нет 20 лет, чтобы постигать это темное искусство, мне нужно решать задачи сегодня. Проблема еще в том, что на C++ так пишут довольно часто и, например, чтобы понять, как работает реализация алгоритма сжатия, тебе еще нужно очень хорошо знать, как в C++ работают стримы. А как ты без стримов будешь использовать свой алгоритм сжатия повторно? По теме сложности кода на C++ еще можно привести пример c chrono из статьи Продолжаем изучение OpenGL: простой вывод текста.
  • Пример со стримами хорошо иллюстрирует, что C++ — словно вирус. Все начинается с использования какой-то одной маленькой его возможности, и через какое-то время весь проект кишит лямбдами, шаблонами и вот этим всем, и в этом уже никто не может нормально разобраться. Судите сами. Допустим, вы решили использовать классы. Но вот проблема — все private поля объявляются в .hpp файле и при изменении приводят к перекомпиляции половины проекта (в C такой проблемы с инкапсуляцией нет совсем). И вот в дополнение к простому и понятному классу вам уже приходится использовать не такую уж понятную и простую в реализации идиому pImpl (или фабричный метод, что еще менее производительно). А затем еще правильно перегрузить оператор присваивания, реализовать конструктор перемещения, и чтобы при этом все это добро правильно работало с STL… Мы всего лишь хотели классов, помните? Аналогично вы не можете использовать исключения, не обернув все в умные указатели, которые, напомню, являются классами и используют шаблоны, а чтобы кода было поменьше, придется еще использовать и auto. Аналогично вы не можете использовать классы и конструкторы, не используя исключения, так как нормально вернуть ошибку из конструктора можно только бросив исключение. Таким образом, не платить за то, что не используешь, вот как-то не получается — приходится использовать сразу все.
  • ООП. Кажется, сегодня уже вся индустрия осознала, что объединение кода и данных — идея так себе, не говоря уже про повсеместное использование наследования. В теории это, конечно, здорово, когда есть класс животное и от него наследуется кошка и лошадь. Но на практике реальная необходимость (ООП головного мозга — тоже тяжелый недуг!) строить такие иерархии возникает очень редко, и если возникает, то дело обычно ограничивается одним интерфейсом и многими классами, реализующими этот интерфейс. Последнее, если что, очень просто делается на С. И возникает вопрос, а какой вообще смысл использовать язык, одна из главных фишек которого — возможность легко писать код так, как это делать не надо?
  • STL часто преподносится так, словно в мире С нет библиотек с готовыми алгоритмами и контейнерами, что, разумеется, не так. При этом STL предлагает только одну из многих возможных реализаций (даже для простого vector их можно придумать десятки) конкретного алгоритма или контейнера. Почему кто-то за меня решил, что замедление скорости компиляции и разбухание секции кода лучше, чем, например, хранение всего по ссылке и, соответственно, быстрая компиляция и разбухание кучи? Или, например, хранение всего по значению, но с небольшим замедлением скорости выполнения кода? Следует также отметить, что контейнер, написанный с нуля и заточенный под данный конкретный случай, позволит вам повысить производительность на те самые «жалкие 0.5%», которые так важны в задачах, на решение которых претендует С++. Например, если вы знаете что-то о природе данных, которые хранятся в контейнере, то можете опустить некоторые проверки. Или, возможно, вам известно, что данные удаляются из хэш-таблицы только в порядке обратном тому, в котором они были добавлены — это тоже можно использовать.
  • Из-за повсеместного использования шаблонов скорость компиляции кода на С++ просто ни на что не годится. Не говоря уже о том, что при компиляции крупных проектов нередко может потребоваться, скажем, гигов 10 оперативной памяти. Для сравнения, язык C позволяет мне компилировать по много раз на дню миллионы строк кода, используя только Raspberry Pi. Ну и если я вдруг решу, что в моем проекте имеет смысл использовать кодогенерацию, ничто не мешает ее использовать. Притом, с нормальным кэшированием результата. Понятное дело, так как шаблоны объявляются в .hpp файлах, их изменение приводит к перекомпиляции половины проекта. См также Десять причин избегать метапрограммирования.
  • Как уже отмечалось, если вы берете исключения, то будьте готовы использовать для всего RAII и смартпоинтеры, а следовательно и тормозить, когда счетчики ссылок обнуляются. Иначе одно неудачно брошенное исключение приведет к тому, что все ваши ресурсы утекут. Следует также отметить, что исключения добавляют коду неявного поведения, и далеко не всем программистам это нравится. Как по мне, в задачах, где используется С и/или С++, лучше использовать старые-добрые коды возврата. Пожалуй, придется написать чуть больше кода и завести привычку всегда проверять возвращаемые значения. Зато вы будете точно знать, что и как именно делает ваш код, безо всякой магии. Не удивительно, что в том же Google в коде на С++ исключения не используются, и что в новых языках, таких, как Go и Rust, исключений не предусмотрено.
  • По своему опыту могу сказать, что отлаживать код C++ — мягко говоря, удовольствие ниже среднего. Продраться через тонны смартпоинтеров и виртуальных методов, или, например, посмотреть, что же происходит внутри STL, в gdb подчас сложно настолько, что проще прибегнуть к обычному отладочному выводу. В языке C все просто и понятно. Даже весьма непростые баги можно легко поймать за пару минут. Я вам даже больше скажу, код на C можно довольно комфортно отлаживать вообще без отладочных символов. Когда-то очень давно я так и делал, просто брал OllyDbg и дебажил. Попробуйте, это правда не сложно.
  • Код на C прекрасно пишется без каких-либо тяжеловесных >для C++ существуют. CLion, например, довольно неплох. Но не все программисты согласны платить за него деньги и попрощаться с 2 Гб оперативной памяти. К тому же, CLion не все и не всегда подсвечивает правильно, и если открыть в нем сразу два проекта, то даже довольно мощный компьютер начнет тормозить. Есть и другие IDE, но у них свои проблемы, например, привязка к Windows или отсутствие важных возможностей, таких, как вывод типов.
  • Нельзя упускать из виду и кадровый вопрос. Язык С сравнительно прост. По крайней мере, его реально уместить целиком в голову среднего программиста. Стандарт С11 [PDF] занимает 700 страниц со всеми приложениями и предметным указателем, а полноценный компилятор C умещается в 15-20 тысяч строк кода. Многие (не все, но многие) студенты уже на первом курсе в состоянии писать вполне сносный боевой код на C. Язык C++ в десятки раз сложнее C. Не удивительно, что его толком не знает никто. В лучшем случае, есть люди, которые знают небольшую его часть. Что намного хуже, с выходом каждого нового стандарта С++ становится еще более сложным и запутанным. Туда тянут еще какие-то концепты, корутины и прочие модные игрушки, как будто без них язык не был уже достаточно распухшим. Но хуже всего то, что правила языка часто далеко не очевидны (например) и имеют кучу исключений. Чтобы писать что-то серьезное на языке, про который неизвестно точно, как работают его компоненты и как они друг с другом взаимодействуют, нужно быть либо очень смелым, либо очень глупым.
  • Ну и до кучи. (1) Далеко не везде есть компилятор C++, особенно если это какой-нибудь C++11/14/17. Так что, если вы хотите настоящей переносимости кода, пишите на С. Язык C есть реально везде. (2) Раз взаимодействие между разными языками программирования или, например, вызов процедур из динамических библиотек, все равно происходит через C API, может лучше просто писать на C? (3) Я уже говорил про совершенно нечитаемые сообщения об ошибках в C++? Попробуйте использовать тот же chrono, например. (4) Александреску в итоге ушел заниматься языком D. Мейерс тоже завязал с C++. Mozilla и Google сделали свои языки для замены C++. Наводит на размышления, согласны?
Цукерберг рекомендует:  Колонки с использованием CSS3

Не удивительно, что и сегодня даже для новых проектов многие программисты (Линус Торвальдс, пожалуй, является самым известным примером) выбирают язык C, а не C++. Стремление писать код на C — это стремление к максимально простому и понятному коду, стремление использовать ресурсы как можно более эффективным образом, и не в последнюю очередь это стремление к красоте. Технологии появляются и исчезают. Подходы, которые еще вчера считались общепринятой практикой, сегодня уже причисляют к антипаттернам. И только C прекрасен и вечен. На чем еще писать, если с 1972 года люди так и не придумали ничего лучше?

Введение в C++

Язык программирования C++

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

Своими корнями он уходит в язык Си, который был разработан в 1969—1973 годах в компании Bell Labs программистом Деннисом Ритчи (Dennis Ritchie). В начале 1980-х годов датский программист Бьерн Страуструп (Bjarne Stroustrup), который в то время работал в компании Bell Labs, разработал С++ как расширение к языку Си. Фактически вначале C++ просто дополнял язык Си некоторыми возможностями объектно-ориентированного программирования. И поэтому сам Страуструп вначале называл его как «C with classes» («Си с классами»).

Впоследствии новый язык стал набирать популярность. В него были добавлены новые возможности, которые делали его не просто дополнением к Си, а совершенно новым языком программирования. В итоге «Си с классами» был переименован в С++. И с тех по оба языка стали развиваться независимо друг от друга.

С++ является мощным языком, унаследовав от Си богатые возможности по работе с памятью. Поэтому нередко С++ находит свое применение в системном программировании, в частности, при создании операционных систем, драйверов, различных утилит, антивирусов и т.д. К слову сказать, ОС Windows большей частью написана на С++. Но только системным программированием применение данного языка не ограничивается. С++ можно использовать в программах любого уровня, где важны скорость работы и производительность. Нередко он применяется для создания графических приложений, различных прикладных программ. Также особенно часто его используют для создания игр с богатой насыщенной визуализацией. Кроме того, в последнее время набирает ход мобильное направление, где С++ тоже нашел свое применение. И даже в веб-разработке также можно использовать С++ для создания веб-приложений или каких-то вспомогательных сервисов, которые обслуживают веб-приложения. В общем С++ — язык широкого пользования, на котором можно создавать практически любые виды программ.

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

В отличие от Си язык C++ позволяет писать приложения в объектно-ориентированном стиле, представляя программу как совокупность взаимодействующих между собой классов и объектов. Что упрощает создание крупных приложений.

Основные этапы развития

В 1979-80 годах Бьерн Страуструп разработал расширение к языку Си — «Си с классами». В 1983 язык был переименован в С++.

В 1985 году была выпущена первая коммерческая версия языка С++, а также первое издание книги «Языка программирования C++», которая представляла первое описание этого языка при отсутствии официального стандарта.

В 1989 была выпущена новая версия языка C++ 2.0, которая включала ряд новых возможностей. После этого язык развивался относительно медленно вплоть до 2011 года. Но при этом в 1998 году была предпринята первая попытка по стандартизации языка организацией ISO (International Organiztion for Standartization). Первый стандарт получил название ISO/IEC 14882:1998 или сокращенно С++98. В дальнейшем в 2003 была издана новая версия стандарта C++03.

В 2011 году был издан новый стандарт C++11, который содержал множество добавлений и обогащал язык С++ большим числом новых функциональных возможностей. После этого в 2014 году было выпущено небольшое добавление к стандарту, известное также как C++14. И еще один ключевой релиз языка намечен на 2020.

Компиляторы и среды разработки

Для разработки программ на С++ необходим компилятор — он транслирует исходный код на языке С++ в исполняемый файл, который затем можно запускать. Но в настоящий момент есть очень много различных компиляторов. Они могут отличаться по различным аспектам, в частности, по реализации стандартов. Базовый список компиляторов для С++ можно посмотреть в википедии. Рекомендуется для разработки выбирать те компиляторы, которые развиваются и реализуют все последние стандарты. Так, на протяжении всего руководства преимущественно будет использоваться свободно распространяемый компилятор g++ , разработанный в рамках проекта GNU.

Также для создания программ можно использовать интегрированные среды разработки IDE, такие как Visual Studio, Netbeans, Eclipse, Qt и т.д.

C++ — На тему C++.

В статье мы напишем пару простейших программ на C++ и посмотрим, как происходит их компиляция.

Содержание

Следуйте инструкциям. Также выполните задания, указанные в тексте.

Создаём каталог проекта

Перейдите в каталог пользователя, и создайте каталог, в котором вы будете размещать свои проекты. Его можно назвать, например, “lw1” (laboratory work 1)

В Visual Studio Code откройте этот каталог. Для этого используйте меню “File”>”Open Folder…”.

Теперь вы можете добавить новый файл в каталог прямо из Visual Studio Code. Попробуйте, это так просто!

Простейшая программа

Откройте редактор, создайте файл hello.cpp и перепишите следующий текст:

Это — минимальная программа на языке C++. Она выводит в терминал строку “Hello, world!” и завершается. Она состоит из:

  • директива #include подключит библиотеку потоков ввода-вывода, в том числе станут доступны поток вывода std::cout и манипулятор std::endl.
  • функция main служит точкой входа в программу в тот момент, когда операционная система запускает программу
  • в функции сейчас находится ровно одна инструкция, которая передаёт строку в поток вывода cout и затем передаёт туда же манипулятор endl (сокращение от endline), чтобы добавить перенос строки и завершить операцию вывода cout

Сохраните файл — это можно сделать в меню “File” либо горячей клавишей Ctrl+S :

Затем откройте терминал. В Visual Studio Code терминал можно открыть в меню “Вид”>”Интегрированный терминал” либо сочетанием клавиш “CTRL + `”

Введите в терминале команду dir . Команда выведет список файлов, и среди этих файлов должен быть файл hello.cpp .

Введите команду g++ —version . Программа g++ — это компилятор C++ из состава GCC (GNU Compiler Collections). Передав ей флаг —version , вы заставите программу вывести свою версию и завершиться. Ожидается, что у вас будет g++ 7.0 или выше:

Введите команду g++ hello.cpp -o hello . Эта команда компилирует файл hello.cpp в исполняемую программу называет исполняемый файл hello.exe на платформе Windows либо hello на Linux и MacOSX. Команда не должна выводить чего-либо, она должна просто успешно завершиться.

Теперь вы можете запустить исполняемую программу hello.exe , набрав в терминале команду hello .

Задание cpp1.1

Убедитесь, что у вас есть файл hello.cpp , в котором записана работоспособная программа “Hello, World”. Доработайте программу, чтобы вместо “Hello, World” она выводила “Hello, Name”, где Name — ваше имя в английской транскрипции.

Ошибки компиляции

Теперь попробуем составить неправильную программу. Например, уберём символ ; в конце единственной инструкции:

Запустите компиляцию снова. Вы увидите ошибку компиляции, примерно такую:

Компилятор достаточно умён, чтобы показать вам точное место ошибки и способ её исправления! Именно поэтому сообщения от компиляторов C/C++ следует внимательно читать.

Теперь попробуем внедрить другую ошибку: точку с запятой вернём на место, а в названии cout перепутаем две буквы: “cuot”

Запустите компилятор и прочитайте сообщение. Оно должно быть таким:

Компилятор снова показал себя с лучшей стороны: он догадался, что программист опечатался, и предложил свой вариант замены. К сожалению, вариант не самый удачный: компилятор предложил clog вместо cout . Тем не менее, во многих случаях компилятор угадывает правильно.

Задание cpp1.2

  • Попробуйте самостоятельно найти такую опечатку в слове cout, чтобы компилятор правильно предложил способ исправления опечатки.
  • Этот вариант программы сохраните в файле hello_err.cpp , чтобы затем показать преподавателю.
Цукерберг рекомендует:  Контекстное экранирование с помощью zend-escaper

Вывод в стиле языка C

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

Мы воспользуемся функцией std::puts. Для доступа к ней надо подключить . Теперь программа будет выглядеть так:

Выполните в терминале команду del hello.exe для удаления старого исполняемого файла, затем g++ hello.cpp -o hello для компиляции и запустите программу hello.exe . Вы должны получить тот же результат, что и раньше:

Ввод-вывод

Теперь напишем программу, которая читает два числа из стандартного ввода и пишет их обратно в стандартный вывод. Эта программа будет использовать функции языка C: std::scanf и std::printf .

Создайте файл ab.cpp и напечатайте в нём следующий код:

Скомпилируйте код командой g++ ab.cpp -o ab . Запустите, и введите

  • два целых числа: 12 88
  • одно целое число и одно число с плавающей точкой: 12 88.7
  • одно целое число и одну букву f: 12 f
  • только букву f: f
  • ничего не вводить, сразу нажать “Ctrl+Z” на Windows или “Ctrl+D” на остальных платформах, что означает “конец ввода”

Если что-то пошло неправильно, вы можете нажать в терминале Ctrl+C для завершения программы.

Мы прокомментировали код, чтобы вы поняли, что происходит. В языке C++ однострочные комментарии начинаются с символов // . Комментарии помогают понять текст программы, и поэтому хороший комментарий поясняет намерение там, где оно не очевидно из кода. Плохие комментарии поясняют очевидные вещи: писать такое — бесполезный труд. В то же время хороший комментарий может уберечь программиста от неосторожных и неправильных действий.

Теперь доработаем программу

Задание cpp1.3

Создайте файл abc.cpp и напишите программу, которая читает три числа и складывает их, а результат выводит в терминал.

Решение линейного уравнения

Рассмотрим линейное уравнение ax + b = 0 — оно также называется уравнением прямой. Мы напишем программу, способную решать такие уравнения. Но прежде чем приступить к кодированию, мы составим план действий с помощью комментариев:

Первый шаг мы реализуем с помощью puts. Второй — с помощью scanf и объявления переменных a, b. Третий шаг — с помощью printf. Создайте файл linear_equation.cpp .

Перепечатайте в него следующий код:

Скомпилируйте программу и запустите её. Попробуйте ввести две пары коэффициентов:

Везде ли программа решила задачу правильно?

Числа с плавающей точкой

Конечно же, решить уравнение в целых числах получится не всегда. Но в C++ есть поддержка чисел с плавающей точкой:

  • тип данных называется float
  • ему соответствует формат %f для scanf и printf

Перепишите программу следующим образом:

Попробуйте снова ввести две пары коэффициентов:

Как вы думаете, что получилось в последних двух случаях? Почему такое происходит?

Задание cpp1.4

Создайте файл square_equation.cpp и напишите программу, которая читает три коэффициента уравнения ax^2+bx+c=0 и вычисляет корни уравнения.

  • Программа должна использовать числа с плавающей точкой.
  • Вам пригодится функция std::sqrt, помогающая извлечь квадратный корень; в документации к ней сказано, какой заголовочный файл требуется подключить через #include .

PS-Group

Материалы для курсов в Институте Программных Систем и в Волгатехе

Основы C++ — урок 1

Здравствуй, уважаемый читатель сайта CodeLessons.ru! Сейчас пойдет речь о самых важных моментах в C++ на которых и основана любая программа. Мы узнаем главные части программы, а также и назначение каждой из них. Для начала вам потребуется установленная >

Видео урок

Основные особенности кода на C++

Прежде чем мы напишем первую программу на C++, надо узнать основные требования к коду на C++.Их не так много, как может показаться на первый взгляд. Вот собственно список:

  • каждая команда заканчивается точкой с запятой ; ;
  • в названии команд и прочих инструкций не может быть пробелов, а также они не могут начинаться с цифр;
  • язык С++ чувствителен к регистру символов. То есть, CODE, CoDe и code могут выполнять абсолютно разные задачи;

Это и есть главные правила, на которых основан фундамент программирования на C++.

Начало работы с C++

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

Теперь давайте разберем главные аспекты C++ на примере. Для этого мы запустим тестовою программу, а затем шаг за шагом рассмотрим структуру программ в C++:

Использование Си в C++ программах : все за и против [закрыт]

Нужно ли воспринимать возможность использовать Си в программах на С++, как приятное дополнение или относится только как к обратной совместимости?

Есть те, кто считает, что такое использование вредит пониманию, так как другой человек может быть не знаком с некоторыми частями Си или вовсе не знать ничего, кроме С++. Также некоторые считают это плохим стилем, потому что его использование делает код не красивым. Или же с точки зрения убеждений, что код должен содержать конструкции языка, на котором пишешь, а не смешивание new с malloc т.п.
Но а как же быстродействие некоторых его частей или использование удобных функций форматирования?

Где та грань, которой нужно придерживаться?

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

UPD:
@avp, на материал во второй ссылке буду постепенно поглядывать, но скорей для справки, чем искать повод для переезда на другой язык. Потому как в принципе я согласен со многим, даже при том, что у меня очень мало опыта. Мне кажется, что если начинать с С++, то это скорей будет изучение самого С++, а потом уже возможно через пару лет и программирования, что нельзя сказать про Си, так как он действительно прост в понимании, особенно после С++. И концентрация идет не на разбирание граблей языка или умения работать с stl/boost, а на освоение новых алгоритмов при написании своих костылей. Такие костыли будут в начале плохими и некрасивыми и на них будет уходить много времени в сравнении с использованием готовых решений на C++, но их написание даст понимание как это работает или как это выгодно модифицировать для своих нужд, а не просто использовать STL и даже может разбираться частично как работают его внутренности, но все ровно не быть способным написать что-то подобное на том же языке или другом.

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

Наверное я бы выбрал Си, если бы вернулся в прошлое, но сейчас буду и дальше продолжать кодить с упором на С++ и поглядывать на С, то есть бежать наверх в низ по ступенькам. Потому что во мне преобладает непостоянность и я просто обязан закончить с этой книгой).
Вот такие пироги.

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

C++ (язык программирования)

C++
Парадигма объектно-ориентированное, обобщённое, процедурное, метапрограммирование
Спроектировано Бьёрн Страуструп
Печать дисциплины статическая
OS кроссплатформенное программное обеспечение
Главная реализация
GNU C++,[[ Microsoft Visual C++]], Intel C++ compiler, Open64 C++ Compiler, Clang, Comeau C/C++, Embarcadero C++ Builder, Watcom C++ compiler, Digital Mars C++, Oracle Solaris Studio C++ compiler, Turbo C++
Диалект
ISO/IEC 14882 C++
Влияние
C++, Objective-C, C#, Cyclone, Java, BitC

Поддерживает такие парадигмы программирования как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование, обеспечивает модульность, раздельную компиляцию, обработку исключений, абстракцию данных, объявление типов (классов) объектов, виртуальные функции. Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.

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

Содержание

История

Создание

Язык программирования С++ был создан в начале 1980-х годов, его создатель сотрудник фирмы Bell Laboratories — Бьёрн Страуструп. Он придумал ряд усовершенствований к языку программирования C, для собственных нужд. Т. е. изначально не планировалось создания языка программирования С++. Ранние версии языка С++, известные под именем «Cи с классами», начали появляться с 1980 года. Язык C, будучи базовым языком системы UNIX, на которой работали компьютеры фирмы Bell, является быстрым, многофункциональным и переносимым. Страуструп добавил к нему возможность работы с классами и объектами, тем самым зародил предпосылки нового, основанного на синтаксисе С, языка программирования. Синтаксис C++ был основан на синтаксисе C, так как Бьёрн Страуструп стремился сохранить совместимость с языком C.

Развитие

Первое издание «Языка программирования C++» вышло в 1985 году. Обеспечивает первое описание этого языка, что было важно из-за отсутствия официального стандарта. В 1989 году вышла версия 2.0 языка C++. Его новые возможности включали множественное наследование, абстрактные классы, статические функции-члены, функции-константы и защищённые члены. В 1990 году вышло «Комментированное справочное руководство по C++», положенное впоследствии в основу стандарта. Последние обновления включали шаблоны, исключения, пространства имён, новые способы приведения типов и логический тип.

В 1998 году был опубликован стандарт языка ISO/IEC 14882:1998 (известный как C++98), разработанный комитетом по стандартизации C++ (ISO/IEC JTC1/SC22/WG21 working group). Стандарт состоит из двух частей — основы языка (core language) и стандартной библиотеки языка, которая включает Standard Template Library (STL) и модифицированный вариант стандартной библиотеки языка C.

В 2003 году был опубликован стандарт языка ISO/IEC 14882:2003, где были исправлены выявленные ошибки и недочёты предыдущей версии стандарта.

В 2005 году был выпущен отчёт Library Technical Report 1. Отчёт описывает расширения стандартной библиотеки, которые, должны быть включены в следующую версию языка C++.

С 2009 года велась работа по обновлению предыдущего стандарта, предварительной версией нового стандарта сперва был C++09, а спустя год C++0x, сегодня — C++11, куда были включены дополнения в ядро языка и расширение стандартной библиотеки.

Название

Название C++ придумал Рик Масситти. Название указывает на эволюционную природу перехода к нему от C. «++» — это операция приращения в C. Чуть более короткое имя C+ является синтаксической ошибкой; кроме того, оно уже было использовано как имя совсем другого языка. Знатоки семантики C находят, что C++ хуже, чем ++C. Названия D язык не получил, поскольку он является расширением C и в нем не делается попыток исцеляться от проблем путем выбрасывания различных особенностей.

Обзор языка

Необъектно-ориентированные особенности

  • Символьные: char , wchar_t ( char16_t и char32_t , в стандарте C++11).
  • Целочисленные знаковые: signed char , short int , int , long int (и long long int , в стандарте C++11).
  • Целочисленные беззнаковые: unsigned char , unsigned short int , unsigned int , unsigned long int (и unsigned long long int , в стандарте C++11).
  • С плавающей точкой: float , double , long double .
  • Логический: bool .

Операции сравнения возвращают тип bool . Выражения в скобках после if , while приводятся к типу bool .

Функции могут принимать аргументы по ссылке. Функции могут возвращать результат по ссылке. Cсылки сходны с указателями, со следующими особенностями: перед использованием ссылка должна быть инициализирована; ссылка всегда указывает на один и тот же адрес; в выражении ссылка обозначает непосредственно тот объект или ту функцию, на которую она указывает, обращение же к объекту или функции через указатель требует разыменование указателя.

  • inline функции.
  • Описатель volatile
  • Пространства имён (namespace)
  • Шаблоны template
  • Операторы new , new[] , delete и delete[]

Объектно-ориентированные особенности

C++ добавляет к C объектно-ориентированные возможности. Он вводит классы, которые обеспечивают три самых важных свойства ООП: инкапсуляцию, наследование и полиморфизм.

Методы класса — это функции, которые смогут применяться к экземплярам класса. Грубо говоря, метод — это функция объявленная внутри класса и предназначенная для работы с его объектами. Методы объявляются в теле класса. Описываться могут там же, но могут и за пределами класса (внутри класса в таком случае достаточно представить прототип метода, а за пределами класса определять метод поставив перед его именем — имя класса и оператор ::). Методы и поля входящие в состав класса называются членами класса. При этом методы часто называют функциями-членами класса.

Наследование

В C++ при наследовании одного класса от другого наследуется реализация класса, плюс класс-наследник может добавлять свои поля и функции или переопределять функции базового класса. Множественное наследование разрешено.

Конструктор наследника вызывает конструкторы базовых классов, а затем конструкторы нестатических членов-данных, являющихся экземплярами классов. Деструктор работает в обратном порядке.

Наследование бывает публичным, защищённым и закрытым.

Полиморфизм

Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных.

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

Цукерберг рекомендует:  Основы сервис-ориентированной архитектуры

Инкапсуляция

Основным способом организации информации в C++ являются классы. В отличие от структуры ( struct ) языка C, которая может состоять только из полей и вложенных типов, класс ( class ) C++ может состоять из полей, вложенных типов и функций-членов. Инкапсуляция в С++ реализуется через указание уровня доступа к членам класса: они бывают публичными ( public ), защищёнными ( protected ) и закрытыми ( private ). В C++ структуры отличаются от классов тем, что по умолчанию члены и базовые классы у структуры публичные, а у класса — собственные.

Стандартная библиотека

В языке программирования C++ термин Стандартная Библиотека означает коллекцию классов и функций, написанных на базовом языке. Стандартная Библиотека поддерживает несколько основных контейнеров, функций для работы с этими контейнерами, объектов-функции, основных типов строк и потоков (включая интерактивный и файловый ввод-вывод), поддержку некоторых языковых особенностей, и часто используемые функции для выполнения таких задач, как, например, нахождение квадратного корня числа. Стандартная Библиотека языка C++ также включает в себя спецификации стандарта ISO C90 стандартной библиотеки языка Си. Функциональные особенности Стандартной Библиотеки объявляются внутри пространства имен std.

Стандартная библиотека шаблонов (STL) — подмножество стандартной библиотеки C++ и содержит контейнеры, алгоритмы, итераторы, объекты-функции и т. д.

Заголовочные файлы стандартной библиотеки C++ не имеют расширения «.h».

Стандартная библиотека C++ содержит последние расширения C++ стандарта ANSI (включая библиотеку стандартных шаблонов и новую библиотеку iostream). Она представляет собой набор файлов заголовков.

Отличия от Си

  • поддержка объектно-ориентированного программирования;
  • поддержка обобщённого программирования через шаблоны;
  • дополнительные типы данных;
  • исключения;
  • пространства имён;
  • встраиваемые ( inline ) функции;
  • перегрузка операторов;
  • перегрузка функций;
  • ссылки и операторы управления свободно распределяемой памятью;
  • дополнения к стандартной библиотеке.

В С++ не разрешается:

  • вызывать функцию main() внутри программы, в то время как в C это действие правомерно.
  • неявное приведение типов между несвязанными типами указателей.
  • использовать функции, которые ещё не объявлены.

Достоинства и недостатки

С++ — язык, складывающийся эволюционно. Каждый элемент С++ заимствовался из других языков отдельно и независимо от остальных элементов (ничто из предложенного С++ за всю историю его развития не было новшеством в Computer Science), что сделало язык чрезвычайно сложным, со множеством дублирующихся и взаимно противоречивых элементов, блоки которых основаны на разных формальных базах.

Критики С++ не противопоставляют ему какой-либо конкретный язык, а наоборот, утверждают, что для всякого случая применения С++ всегда существует альтернативный инструментарий, позволяющий решить ту же задачу более эффективно и качественно. В свою очередь, сторонники С++ считают некорректным сравнивать различные аспекты С++ с совершенно различными языками, так как общий набор средств и возможностей С++ существенно шире, чем в большинстве языков, с которыми проводится сравнение, и сама по себе широта возможностей, на их взгляд, является веским оправданием несовершенства каждой отдельно взятой возможности. Более того, по их мнению, высокая совместимость с Си является одной из принципиальных черт языка, и потому все недостатки С++ оправданы преимуществами, предоставляемыми этой совместимостью.

  • Высокая совместимость с языком Си
  • Вычислительная производительность
  • Поддержка различных стилей программирования: структурное, объектно-ориентированное, обобщённое программирование, функциональное программирование, порождающее метапрограммирование.
  • Автоматический вызов деструкторов объектов (в порядке обратном вызову конструкторов) упрощает и повышает надёжность управления памятью и другими ресурсами (открытыми файлами, сетевыми соединениями, т. п.).
  • Перегрузка операторов
  • Шаблоны (дают возможность построения обобщённых контейнеров и алгоритмов для разных типов данных)
  • Возможность расширения языка для поддержки парадигм, которые не поддерживаются компиляторами напрямую
  • Доступность. Для С++ существует огромное количество учебной литературы, переведённой на всевозможные языки
  • Плохо продуманный синтаксис сужает спектр применимости языка
  • Язык не содержит многих важных возможностей
  • Язык содержит опасные возможности
  • Производительность труда программистов на языке оказывается неоправданно низка
  • Громоздкость синтаксиса
  • Тяжелое наследие
  • Необходимость следить за памятью

Уроки С++

Основы и тонкости языка программирования C++. Практические задания и тесты. Хотите научиться программировать? Тогда вы по адресу. Неважно, имеете ли вы опыт в программировании или нет, эти уроки помогут вам начать создавать, компилировать и отлаживать программы на языке C++ в разных средах разработки: Visual Studio, Code::Blocks, Xcode, Eclipse и других IDE.

Множество примеров и подробных разъяснений. Отлично подойдут как для новичков (чайников), так и для более продвинутых. Объясняется всё с нуля и до самых деталей. Эти уроки (200+) дадут вам хорошую базу/фундамент в понимании программирования не только на С++, но и на других языках. И это абсолютно бесплатно!

Также рассматривается пошаговое создание игры на С++, графическая библиотека SFML и больше 50 задания для проверки своих навыков и знаний в C++. Дополнительным бонусом является туториал по Qt5.

За репост +20 к карме и моя благодарность!

Темы для проекта по C++

15.12.2020, 01:29

Темы проекта на с++
Всем привет! Первый курс, задали проект по программированию на с++. Предложите темы для создания.

Темы из раздела С++ для экспертов и другие интересные темы
Раздел закрыт и темы перенеслись в раздел С++. Здесь находится список тем, которые были в разделе.

Выбор темы для дипломного проекта
Доброго времени всем. Я студент колледжа и через год у меня диплом. Посоветуйте пожалуйста что.

Выбор темы для проекта на конференцию
Здравствуйте, скоро намечается школьная информационная конференция. Прошу помочь с выбором темы для.

Нужны классы проекта для изменения темы приложения
Всем привет! Подскажите, пожалуйста, возможно кто-то делал или скачивал темы (классы) для.

Использование Си в C++ программах : все за и против [закрыт]

Нужно ли воспринимать возможность использовать Си в программах на С++, как приятное дополнение или относится только как к обратной совместимости?

Есть те, кто считает, что такое использование вредит пониманию, так как другой человек может быть не знаком с некоторыми частями Си или вовсе не знать ничего, кроме С++. Также некоторые считают это плохим стилем, потому что его использование делает код не красивым. Или же с точки зрения убеждений, что код должен содержать конструкции языка, на котором пишешь, а не смешивание new с malloc т.п.
Но а как же быстродействие некоторых его частей или использование удобных функций форматирования?

Где та грань, которой нужно придерживаться?

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

UPD:
@avp, на материал во второй ссылке буду постепенно поглядывать, но скорей для справки, чем искать повод для переезда на другой язык. Потому как в принципе я согласен со многим, даже при том, что у меня очень мало опыта. Мне кажется, что если начинать с С++, то это скорей будет изучение самого С++, а потом уже возможно через пару лет и программирования, что нельзя сказать про Си, так как он действительно прост в понимании, особенно после С++. И концентрация идет не на разбирание граблей языка или умения работать с stl/boost, а на освоение новых алгоритмов при написании своих костылей. Такие костыли будут в начале плохими и некрасивыми и на них будет уходить много времени в сравнении с использованием готовых решений на C++, но их написание даст понимание как это работает или как это выгодно модифицировать для своих нужд, а не просто использовать STL и даже может разбираться частично как работают его внутренности, но все ровно не быть способным написать что-то подобное на том же языке или другом.

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

Наверное я бы выбрал Си, если бы вернулся в прошлое, но сейчас буду и дальше продолжать кодить с упором на С++ и поглядывать на С, то есть бежать наверх в низ по ступенькам. Потому что во мне преобладает непостоянность и я просто обязан закончить с этой книгой).
Вот такие пироги.

Справочник по C++

Написанное в данной статье верно для копилятора gcc.

Структура программы:

Необходимый набор в шаблоне прогораммы;

Комментарии в С++:

/* — начало комментария

*/— конец комментария

//— однострочный комментарий

Пример:

Заголовок программы:

#include

(в поздних версиях компилятора #include устаревший стиль)

Пример:

Пространство имени (|):

using namespace ‘название пространства имён’;

Пример:

Макросы:

#define ‘имя макроса’ ‘значение макроса’

Пример:

Таблица типов:

Диапазон шестнадцатиричных констант. Диапазон восьмеричных констант Тип.
0x0-0x7FF 0-077777 int
0x8000-0xFFFF 0100000-0177777 unsigned int
0x10000-0x7FFFFFFF 0200000-017777777777 long
0x80000000-0xFFFFFFFF 020000000000-037777777777 unsigneg long

Консольный ввод и вывод:

>-это оператор ввода.

count >‘имя переменной’;

Пример:

printf(‘строка вывода с кодами типов переменных ‘ ,’ссылки на переменные записанные в той же последовательности’)

scanf(‘коды переменных с разделителями’, ‘ссылки на переменные записанные в той же последовательности’)

Спецификатор Тип
отсутсвует int или unsigneg int
l long int или unsigned long int
hh Аргумент int или unsigned int. Приведение к типу signed char или unsigned char.
h Аргумент int или unsigned int. Приведение к типу short int или unsigned short int.
ll long long int или unsigned long long int
j intmax_t или uintmax_t
z size_t
t ptrdiff_t
L __int64 или unsigned __int64

Унарные опеарации:

Знак операции Операция Группа операций
* Умножение Мультипликативные code > [ attr rowspan = «3» ]
/ Деление
% Остаток от деления
+ Сложение Аддитивные code > code > [ attr rowspan = «2» ]
Вычитание
#171;lt; code > [ attr rowspan = «2» ]
#171;gt;>« Сдвиг в право
#171;lt;« Меньше Операция отношения code > [ attr rowspan = «6» ]
#171;gt;« Больше
#171;lt;=« Меньше или равно
#171;gt;=« Больше или равно
== Равно
!= Не равно
#171;amp;« Поразрядное И Поразрядные операции code > [ attr rowspan = «3» ]
| Поразрядное ИЛИ
^ Поразрядное исключающее ИЛИ
#171;amp;&« Логическое И Логические операции code > [ attr rowspan = «2» ]
|| Логическое ИЛИ
, Последовательное вычисление Последовательные вычисления
= Присваивание Операции присваивания code > [ attr rowspan = «11» ]
*= Умножение с присваиванием
/= Деление с присваиваниеме
%= Остаток от деления с присваиванием
-= Вычитание с присваиванием
+= Сложение с присваиванием
#171;lt; =« Сдвиг в право с присваиванием
#171;amp;=« Поразрядное И с присваиванием
|= Поразрядное ИЛИ с присваиванием
^= Поразрядное исключающее ИЛИ с присваиванием

Таблица управляющих последовательностей:

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих