Чем C отличается от C++
Коротко: C++ вырос из C, поэтому почти всё из C есть и в C++ — те же типы, условия, циклы, функции, указатели, printf и scanf. Сверх этого в C++ есть классы, шаблоны и большая стандартная библиотека: строки std::string, массивы std::vector, готовые сортировки и словари. В C строки, массивы переменной длины и память — вручную.
История такая: в 1979 году Бьёрн Страуструп начал добавлять к C классы, а в 1983 году язык получил имя C++. За десятилетия C++ стал гораздо больше, и сейчас это два разных языка со своими стандартами.
Главные отличия
| C | C++ | |
|---|---|---|
| Строки | массив char, функции string.h | класс std::string |
| Массив переменной длины | malloc, realloc, free | std::vector |
| Сортировка, множества, словари | qsort, остальное — самому | sort, set, map из STL |
| Ввод и вывод | printf, scanf | cout, cin (и printf тоже) |
| Классы, перегрузка функций, шаблоны | нет | есть |
Ссылки (int&) | нет, только указатели | есть |
| Расширение файла | .c | .cpp |
| Компилятор GCC | gcc | g++ |
C — маленький язык: его можно выучить целиком, а всё, что программа делает с памятью, видно в коде. C++ огромен, зато многое берёт на себя: std::string сам следит за длиной строки, std::vector — за памятью. STL в таблице — стандартная библиотека шаблонов C++: готовые контейнеры (хранилища данных) и алгоритмы.
Где код на C не собирается как C++
Большая часть программ на C собирается и компилятором C++, но не все:
int *a = malloc(n * sizeof(int));— в C верно, в C++ нужно приведение(int *)malloc(…);- слова
new,class,delete,templateв C — обычные имена переменных, в C++ — служебные слова; int f()в C17 — функция с неуказанными параметрами, в C++ — функция без параметров;- массивы с размером из переменной
int a[n]есть в C (с C99), но не в стандарте C++.
И наоборот, cout, string, vector, классы в C не работают совсем.
Маленькое любопытное отличие — тип символа в кавычках:
#include <stdio.h>
int main(void) {
printf("%zu\n", sizeof('a'));
return 0;
}4В C символ 'a' имеет тип int (4 байта на обычном компьютере), а в C++ — тип char, и та же программа на C++ вывела бы 1.
Что учить первым
- Олимпиады по программированию — C++: стандартная библиотека даёт готовые сортировки, множества и очереди, а решения получаются короче.
- Микроконтроллеры, драйверы, ядро Linux, встроенные системы — C: там он основной язык.
- Первый курс университета, где по программе C, — C. Его знание сильно облегчает потом C++: указатели, память и функции там те же.
Переход в любую сторону несложен: основы — переменные, условия, циклы, функции — одинаковы. Курс по C++ — в теме C++.
gcc или g++
gcc выбирает язык по расширению файла: .c собирается как C, .cpp — как C++ (но для C++ удобнее g++: он сам подключает стандартную библиотеку C++). Программа на C, сохранённая в файле .cpp, собирается как C++ — и может не собраться из-за отличий выше. Поэтому файлы на C называйте .c. Visual Studio тоже различает язык по расширению.