Подтвердить что ты не робот

Есть ли что-то, что я могу сделать в C, но я не могу сделать на С++?

Есть ли что-то, что я могу сделать в C, но я не могу сделать на С++? Я наткнулся на вопрос на собеседовании на сайте вопросов...

4b9b3361

Ответ 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, многие из них просто неотъемлемо несовместимы, например сложный тип.

Ответ 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