Почему кто-либо использовал бы C по C++? [закрытый]

Это делает именно то, что вы хотите:

   //This is the method that will be called from some other class
   public static int printSequence(int n){
       return printSequence(1, n);
   }

   /*We define this method, because the following code snippet
    is used multiple times in the method 'printSequence(int, int)'
    This method will simply print the numbers 1 - length*/
   private static void printLooper (int length){
        for(int i=1; i<=length; i++)
            System.out.print(i);
        System.out.print("\n");
    }

    /*This method has the logic. We give it 2 integers as parameters:
     int start and int end. I think the names of the parameters are self-explanatory*/
    private static int printSequence(int start, int end){
        /*This is the TERMINATING condition, so it is placed first.
         This part is really important. Always be aware of what type of recursion
         you are using. More on this later..*/
        if ( end == 1 ) {
            printLooper(end);
            return 0;
        }

        //OK. So, if start is less than end, then print 1 - start
        if (start < end){
            printLooper(start);
            //then return method recursively, with start INCREMENTED by one
            return printSequence(start+1, end);
        }

        /*Now, if start is equal to end, print number 1 - start, but this time,
        return the method recursively with end DECREMENTED by one*/
        else if (start == end){
            printLooper(start);
            return printSequence(start, end-1);
        }

        /*Now if start is larger than end, then that means that we need to start
         printing the lower part of the 'number tree'. So, call printLooper()
         to print 1 - end.*/
        else if (start > end){
            printLooper(end);
            return printSequence(start, end-1);
        }
        return 0;
    }

Что касается типов рекурсии и почему важно знать, какой тип функции вы пишете, посмотрите этот удивительный урок .

BLOCKQUOTE>

127
задан 4 revs, 3 users 40% 10 January 2015 в 04:49
поделиться

24 ответа

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

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

В некоторых случаях, тем не менее, Вы могли бы хотеть использовать C, а не C++:

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

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

Невнимательный при выполнении этого Вы используете C. Ваш вопрос действительно, "Почему не делают программисты C используют компиляторы C++?" Если это, затем Вы или не понимаете языковых различий, или Вы не понимаете теорию компилятора.

124
ответ дан 24 November 2019 в 00:40
поделиться
  • , Пока несколько лет назад существующие компиляторы C++ не пропускали важные функции, или поддержка была плоха, и поддерживавшие функции варьируются дико среди них, и таким образом, было трудно записать портативные приложения.
  • ни из-за какого стандартного именования символов для других языков/приложений трудно поддерживать классы C++ непосредственно.
0
ответ дан 24 November 2019 в 00:40
поделиться

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

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

1
ответ дан 24 November 2019 в 00:40
поделиться

Какой необходимый C был лучшим препроцессором. cfront был один и таким образом перенесенный C++

, I'ld используют C, где 'C++ как препроцессор' не был бы хорошо.

я вполне уверен, у основания любой правильно написанной библиотеки/платформы/инструментария C++, Вы нашли бы dirty-old-c (или статические броски, который является тем же)

1
ответ дан 24 November 2019 в 00:40
поделиться

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

2
ответ дан 24 November 2019 в 00:40
поделиться

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

3
ответ дан 24 November 2019 в 00:40
поделиться

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

6
ответ дан 24 November 2019 в 00:40
поделиться

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

можно едва назвать то, что я собираюсь сказать доказательство; это - просто мое мнение.

Люди как C, потому что это соответствует приятно в уме prgrammer.

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

А другой вопрос в том, почему организации предпочли бы C по C++. Я не знаю, что, я - просто люди ;-)

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

4
ответ дан 24 November 2019 в 00:40
поделиться

Это довольно мелко, но как занятой студент я выбрал C, потому что я думал, что C++ займет слишком много времени учиться. Многие преподаватели в моем университете не примут присвоения в Python, и я должен был взять что-то быстро.

8
ответ дан 24 November 2019 в 00:40
поделиться

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

, Если Ваша система живет самостоятельно, как имеет место со многими приложениями, то C++ является прекрасным выбором.

, Если Ваша система должна взаимодействовать с программным обеспечением, не neccesarily записанным в C++ (наиболее часто в ассемблере или Библиотеках Фортрана) затем, Вы находитесь в трудном месте. Для взаимодействия с теми видами случаев необходимо будет отключить искажение имени для тех символов. это обычно делается путем объявления тех объектов extern "C", но затем они не могут быть шаблонами, перегруженными функциями или классами. Если это, вероятно, будут Ваши приложения API, то необходимо будет перенести их с функциями помощника и сохранить те функции в синхронизации с фактической реализацией.

И в действительности, язык C++ обеспечивает стандартный синтаксис для опций, которые могут быть легко реализованы в чистом C.

Короче говоря, издержки совместимого C++ слишком высоки, чтобы большинство людей выровняло по ширине.

8
ответ дан 24 November 2019 в 00:40
поделиться

Поскольку для многих задач программирования C более прост, и достаточно хорош. Когда я программирую легкие утилиты особенно, я могу чувствовать, что C++ хочет, чтобы я создал в изящном supersructure ради самого себя, вместо того, чтобы просто написал код.

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

10
ответ дан 24 November 2019 в 00:40
поделиться

Поскольку они хотят использовать функции в C99, которые не имеют эквивалентов в C++.

<час>

Однако нет стольких функций C99, которые полезны для C++, сколько люди думают на первый взгляд. Массивы переменной длины? C++ имеет станд.:: векторы. Поддержка комплекса/мнимых чисел? C++ имеет шаблонный составной тип. Универсальные типом математические функции? C++ перегрузил стандартные математические функции, вызвав тот же результат.

Именованные инициализаторы? Не в C++, но существует обходное решение:

struct My_class_params {
    int i;
    long j;
    std::string name;

    My_class_params& set_i(int ii)
    {
        i = ii;
        return *this;
    }

    My_class_params& set_j(long jj)
    {
        j = jj;
        return *this;
    }


    template <typename STRING>
    My_class_params& set_name(STRING&& n)
    {
        name = std::forward<STRING>(n);
        return *this;
    }

    My_class_params()
    {
        // set defaults
    }
};

class My_class {
    My_class_params params;
  public:
    My_class(const My_class_params& p) : params(p) { }
    ...
};

Это позволяет Вам писать вещи как:

My_class mc(My_class_params().set_i(5).set_name("Me"));
12
ответ дан 24 November 2019 в 00:40
поделиться

Я удивлен ничьи упомянутые библиотеки. Много языков может связаться против C, освобождает, и вызовите функции C (включая C++ с экстерном "C"). C++ является в значительной степени единственной вещью, которая может использовать lib C++ (определенный как 'lib, который использует функции в C++, которые не находятся в C [таком как перегруженные функции, виртуальные методы, перегруженные операторы...], и не экспортирует все через совместимые интерфейсы C через экстерна "C"').

15
ответ дан 24 November 2019 в 00:40
поделиться

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

26
ответ дан 24 November 2019 в 00:40
поделиться

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

25
ответ дан 24 November 2019 в 00:40
поделиться

В дополнение к нескольким другим моментам, упомянутым уже:

Меньше удивления

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

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

27
ответ дан 24 November 2019 в 00:40
поделиться

Ответ Linus на Ваш вопрос , "Поскольку C++ является ужасным языком"

, Его информация является неподтвержденной в лучшем случае но у него есть точка..

Являющийся большим количеством низкоуровневого языка, Вы предпочли бы его C++.. C++ является C с добавленными библиотеками и поддержкой компилятора дополнительных функций (, оба языка имеют функции, которые другой язык не делает и реализует вещи по-другому ), но если у Вас есть время и опыт с C, можно извлечь выгоду из дополнительных добавленных связанных с низким уровнем полномочий... [Отредактированный] (потому что Вы привыкаете к выполнению большего количества работы вручную, а не преимущества от некоторых полномочий, прибывающих из самого языка/компилятора)

Добавляющие ссылки:

, Почему C++ для встроенного

, Почему Вы все еще используете C? PDF

я был бы Google для этого.. потому что уже существует много комментариев относительно сети

27
ответ дан 24 November 2019 в 00:40
поделиться

Я принимаю решение записать в C, потому что я люблю работать с маленьким, трудным языком. Мне нравится иметь доступ к стандарту, который может быть прочитан за разумное количество времени (для меня - я - очень медленный читатель). Кроме того, я использую его для записи программного обеспечения для встроенных систем, для которых немного желательных компиляторов C++ существуют (как приблизительно микроконтроллеры PIC).

36
ответ дан 24 November 2019 в 00:40
поделиться

Я получаю другое представление: почему использование C++ вместо C?

книга Язык программирования C (иначе: K& R) говорит Вам ясно, как сделать все, что язык может выполнить в менее чем 300 страницах. Это - шедевр минимализма. Никакая книга C++ даже не приближается.

очевидный контрдовод - то, что то же могло быть сказано относительно большинства, если не все, современные языки - они также не могут сказать Вам, как сделать все только на нескольких сотнях страниц. Верный. Итак, почему использование C++ вместо этого? Богатство функции? Питание? Если Вам нужно что-то более многофункциональное, или мощное затем идут с C#, Objective C, Java или чем-то еще как этот. Почему нагрузка самостоятельно со сложностями C++? Если Вам нужен уровень контроля предоставления C++ затем, я требую использовать C. C может сделать что-либо и может сделать это хорошо.

34
ответ дан 24 November 2019 в 00:40
поделиться

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

Интерпретируемый Python во многих отношениях считается "медленным" языком, но для нетривиальных задач квалифицированный Python программист может легко произвести код, который выполняется быстрее, чем тот из неопытного разработчика C.

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

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

существует также вопрос совместимости для поставщиков. В то время как C имеет стабильный и четко определенный ABI (Двоичный интерфейс приложений), C++ не делает. ABI в C++ более сложен из-за таких вещей, как vtables и constructurs/destructors так реализованы по-другому с каждым поставщиком и даже версиями набора инструментальных средств поставщиков.

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

53
ответ дан 24 November 2019 в 00:40
поделиться

Если Вы хотите, чтобы Ваш код был понят под фактически любой записью программиста в C.

14
ответ дан 24 November 2019 в 00:40
поделиться

Мне нравятся минимализм и простота.

81
ответ дан 24 November 2019 в 00:40
поделиться
  • , поскольку они уже знают C
  • , поскольку они создают встроенное приложение для платформы, которая только имеет компилятор C
  • , поскольку они поддерживают унаследованное программное обеспечение, записанное в C
  • , который Вы пишете чему-то на уровне операционной системы, механизма реляционной базы данных или розничного 3D механизма видеоигры.
65
ответ дан 24 November 2019 в 00:40
поделиться

О боже, C против C ++, отличный способ начать войну пламени. :)

Я думаю, что C лучше подходит для драйвера и встроенного кода.

C ++ имеет несколько замечательных функций, которых нет в C, но многие из объектно-ориентированных функций C ++ могут вызывать огромные беспорядки при написании кода, когда люди пишут код с неочевидные побочные эффекты, возникающие за кадром. Сумасшедший код может быть спрятан в конструкторах, деструкторах, виртуальных функциях ... Красота кода C заключается в том, что язык не делает ничего неочевидного за вашей спиной, поэтому вы можете читать код и не смотреть на каждый конструктор и деструктор и так далее. Большая часть проблемы - это неправильная практика кодирования НЕКОТОРЫМИ людьми.

Мой идеальный язык был бы комбинацией C99 плюс минимальное подмножество более безопасных возможностей C ++, которые добавляют НУЛЕВЫЕ (или почти нулевые) накладные расходы компилятора на двоичный вывод. Прекрасным дополнением будет инкапсуляция классов и концепции именования данных и функций.

5
ответ дан 24 November 2019 в 00:40
поделиться