Есть ли что-то, что я могу сделать в C, но я не могу сделать на С++? Я наткнулся на вопрос на собеседовании на сайте вопросов...
Есть ли что-то, что я могу сделать в C, но я не могу сделать на С++?
Ответ 1
Здесь подробный список функций C, которые несовместимы с С++.
Ответ 2
Объявите переменную с именем 'class', как в:
int class = 0;
Ответ 3
... то есть что-нибудь, что я могу сделать в C, но не в С++.
Оба языка полностью дополняют Turing, поэтому теоретически вы можете кодировать одинаково функциональные приложения в обоих.
OTOH, С++ не является надмножеством C. Особенно C99 имеет некоторые функции, которые С++ не имеет. Например. назначенные инициализаторы, массивы переменной длины в структурах и как автоматические переменные. В зависимости от вашего "ничего", это может быть то, что С++ не может сделать, но C может.
Ответ 4
В C вы можете создавать литералы массива ( "составной литерал" ), но на С++ вы не можете
/* p points to the first element of an array of 4 int */
int *p = (int[]){1, 2, 3, 4};
Вы также можете создать массив с размером, еще неизвестным во время компиляции, но С++ не имеет такой возможности ( "массив переменной длины" ):
// create array. size is known at runtime only.
int p[rand() % 5 + 1];
Ответ 5
int new = 0;
работает в C, но, очевидно, не может работать на С++, потому что "новое" является зарезервированным словом.
Есть и другие "трюки" с зарезервированными словами, но кроме этого вы можете в значительной степени сделать все на C, что вы можете сделать на С++.
Ответ 6
Есть несколько вещей, которые вы можете сказать в C wihch, которые вы не можете использовать на С++ (потому что С++ имеет более строгую синтаксическую проверку, а C имеет более обширный синтаксис "устаревшего" ).
Кроме того, могут быть некоторые среды выполнения (O/S + library + compiler), которые поддерживают C, но не С++, поэтому вы можете делать C на тех платформах, где вы не можете делать С++.
Ответ 7
С++ не хватает C99 restrict
квалификатор. Поэтому нет возможности сказать компилятору выполнить оптимизацию, основанную на знании, что указатели не являются псевдонимами.
Ответ 8
Довольно много. Например, в C вы можете написать код следующим образом:
void * v = 0;
char * p = v;
и вы можете создавать массивы следующим образом:
int main() {
int n = 42;
int a[n];
return 0;
}
ни один из них не будет компилироваться под С++.
Ответ 9
Синтаксически есть несколько вещей, которые вы могли бы написать в C, которые не будут компилироваться на С++ (см. Несовместимость между ISO C и ISO С++ за мучительные детали.). Если вы спрашиваете на более высоком уровне, если есть какая-то программа, которую можно написать на C, но не возможно писать на С++, тогда ответ будет "Нет".
Ответ 10
В 'C' вам не нужны форвардные объявления. Это позволяет вам передавать параметры, которые интерпретируются неправильно. (Не то, чтобы это отличная функция, но вы не можете сделать это на С++)
в файле A:
float sum(float a, float b)
{
return a+b;
}
в файле B
main()
{
printf("%f\n", sum(1,2));
}
с C, он компилируется, но печатает 0.000
с С++, вам нужно float sum(float,float);
перед printf, и он дает ожидаемый результат.
Ответ 11
Вы можете редко инициализировать массивы в C. Мне нравится использовать его для отображения int- > sometype для относительно плотных статических карт, где unmapped значение может быть интерпретировано как 0:
int my_array[] = { [1] = 3, [4] = 2 };
printf("%d %d %d\n", sizeof my_array, my_array[0], my_array[1]);
/* prints 20, 0, 3 */
Ответ 12
Собственно, я могу вспомнить один пример:
Когда вы создаете библиотеку (файл .lib или DLL файл) для совместного использования другими приложениями, вам лучше использовать C вместо С++, потому что результаты более переносимы. Вы можете сделать это в компиляторе С++, используя блок "extern" C ". Тем не менее.
В частности, у С++ есть причуда, где нет стандартного соглашения для управления именами - для перевода подписей функций библиотеки в имена более низкого уровня, используемые компилятором. Например, если у вас есть функция типа "int addNumbers (int a, int b)", различные компиляторы С++ могут перевести эту функцию в разные имена, что может привести к проблемам при импорте библиотеки. Если вы используете компилятор C или окружаете библиотеку, импортируя и экспортируя код с блоком C, хотя вы не увидите эту проблему, так как есть только один способ манипулировать именами функций в C.
Ответ 13
Вы можете делать почти все на любом из языков программирования. Разумеется, способ выразить это будет различаться, а также количество кода, ясность кода, простота дальнейшего обслуживания. Некоторые задачи могут быть закодированы несколькими строками в Prolog и несколькими страницами кода на С++ и т.д.
Некоторые ограничивающие факторы - это доступные библиотеки, доступные компиляторы и проблемы низкого уровня. Однако, когда вы рассматриваете C и С++ на типичном ПК, тогда нет никакой разницы в вещах, которые могут быть выполнены в любом из них.
Если, конечно, вы не просили разницы между C и С++, потому что эти другие люди дали вам эту идею.
Ответ 14
char *c = malloc(sizeof(char));
действителен в C, а не С++, то есть автоматически лить void*
. Это, конечно же, проблема синтаксиса, а не то, что вы можете и не можете выполнить _do_ (т.е. Выполнить).
Ответ 15
Если критерии предназначены для решения конкретной проблемы программирования, то оба выполнят работу, хотя в некоторых случаях это может быть немного проще сделать в С++ из-за более высокого уровня абстракции
Ответ 16
В стандарте С++ 1998 года имеется список несовместимости с стандартом 1990 C, который составляет 13 страниц (приложение C). Конечно, это не так много, по сравнению с количеством страниц, описывающих языки, но по-прежнему покрывает немного земли.
Краткий обзор различий, которые он перечисляет:
- Добавлены новые ключевые слова (любая C-программа, использующая их как идентификаторы, не является С++)
- Тип символьного литерала изменен с int на char (сравните
sizeof('a')
в C и С++!) - Строковые литералы, сделанные const (не могут сделать
char* q = expr ? "abc" : "de";
) - "Предварительные определения" удаляются с языка.
- "Совместимые типы" удаляются с языка.
- Преобразование из void * в любой другой указатель теперь требует кастинга.
- Преобразование из любого const/volatile указателя в void * теперь требует кастинга.
- "Неявные декларации" удаляются с языка.
- Выражения больше не могут создавать новые типы (как в
p = (void*)(struct x {int i;} *)0;
) - результаты некоторых выражений стали lvalues (сравните
sizeof(0, arr)
дляchar arr[100];
)
... это были первые 3 страницы Приложения C.
Если вы переходите к стандарту 1999 C, различия будут навсегда называться. Хотя С++ 0x действительно включает некоторые из функций C99, многие из них просто неотъемлемо несовместимы, например сложный тип.
Ответ 17
Короткий ответ: нет, не совсем. См. http://www.research.att.com/~bs/bs_faq.html#difference
Ответ 18
Относится ли это к последнему стандарту C? Оригинальный C-стандарт (ANSI 1989 или ISO 1990 с обновлениями 1995 года) довольно близок к тому, чтобы быть подмножеством С++. Там различия, но они в основном надуманные (самое большое исключение, вероятно, состоит в том, что void * свободно конвертируется с любым указателем данных в C, но не на С++).
Тем не менее, новый стандарт C вышел в 1999 году, спустя некоторое время после того, как я прекратил делать что-либо в самом современном C. Это появились новые функции, некоторые из которых входят в стандарт С++ в этом году или в будущем, но не все.
Ответ 19
В C вы можете объявить следующие переменные:
int bool, class, new, delete, template, typename, this, throw, catch,
typeid, operator, virtual, static_cast, reinterpret_cast,
dynamic_cast, mutable, public, private, protected, friend; //many more
вы можете сделать это:
int namespace = private + protected + public;
int decltype = static_cast + dynamic_cast + reinterpret_cast;
int constexpr = (new + delete) * (template + typename);
Все они являются ключевыми словами в С++ 11.
Ответ 20
С++ не поддерживает инициализацию имени named struct, в C вы можете:
struct {int x, y; } a = {.x = 3};
Вы также можете комбинировать это с функцией, показанной Matt Havener:
struct {int a [3], b; } w [] = {[0].a = {1}, 1.a [0] = 2};
Ответ 21
"Если это невозможно сделать в сборке, это не стоит делать!"
ОК, юмор в сторону, я ДУМАЮ, что ОП запрашивает синтаксически, а не оперативно.
Я думаю, что есть несколько неясных вещей, которые являются законными в C (по крайней мере, C89), которые не являются законными в С++ или, по крайней мере, устарели... Но (если они существуют), они довольно неясны. С++ является функционально надмножеством C.
Ответ 22
С++, очевидно, не является надмножеством C по очень простой причине: новые ключевые слова были добавлены в С++
класс, виртуальный, новый и т.д. и, следовательно, больше нельзя использовать в качестве идентификаторов в С++.
Некоторые из причин более тонкие.
Вы можете найти исчерпывающий ответ на этот вопрос на веб-сайте Bjarn Stroustrup:
Язык программирования С++ | Приложение B