Что если таковые имеются, основы программирования лучше изучены в C в противоположность C++?

attr_accesor предоставляет вам методы для чтения и записи переменных экземпляра. Переменные экземпляра предназначены для сокрытия от внешнего мира, поэтому для связи с ними необходимо иметь методы attr _ibute accesor .

5
задан Community 23 May 2017 в 12:19
поделиться

19 ответов

If all you've ever used is object-oriented programming languages like C++ then it would be worthwhile to practice a little C. I find that many OO programmers tend to use objects like a crutch and don't know what to do once you take them away. C will give you the clarity to understand why OO programming emerged in the first place and help you to understand when its useful versus when its just overkill.

In the same vein, you'll learn what it's like to not rely on libraries to do things for you. By noting what features C++ developers turned into libraries, you get a better sense of how to abstract your own code when the time comes. It would be bad to just feel like you need to abstract everything in every situation.

That said, you don't have to learn C. If you know C++ you can drag yourself through most projects. However, by looking at the lower-level languages, you will improve your programming style, even in the higher-level ones.

16
ответ дан 18 December 2019 в 05:17
поделиться

Я бы выбрал C для изучения низкоуровневых примитивов программирования.

Для ООП существует , так что многие другие языки, которые нужно выучить до C ++, намного легче выучить. Это не 1990 год, когда единственными языками ООП были Smalltalk и C ++, и только C ++ использовался за пределами академических кругов. Почти каждый новый язык программирования, изобретенный с тех пор, имеет объекты, и почти все они менее сложны, чем C ++.

0
ответ дан 18 December 2019 в 05:17
поделиться

Если вы хотите получить новые навыки и у вас есть хорошие основы структурированного программирования (SP), вам следует перейти на C ++. научиться думать о данной проблеме объектно-ориентированным (ООП) способом (определять объекты, методы, наследование и т. д.). Иногда это самая сложная часть. Несколько лет назад я был в той же ситуации, что и вы, и выбрал C ++, потому что изучение новой парадигмы, нового образа мышления и разработки программного обеспечения иногда бывает сложнее, чем сам код, и если вам не нравится C ++ или ООП, вы можете вернуться к C и SP, но, по крайней мере, у вас будут некоторые навыки ООП.

0
ответ дан 18 December 2019 в 05:17
поделиться

Да, простое структурное программирование.

С ООП повсюду легко забыть, что вы можете построить звуковую систему, просто используя модули и функции. Модульная система Си довольно слабая, но все же ...

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

0
ответ дан 18 December 2019 в 05:17
поделиться

Coding Sytle

Под стилем кодирования я не имею в виду {} и пробелы, я имею в виду то, как вы организуете данные, классы, файлы и т. Д.

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

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

Это похоже на то, когда вы впервые изучаете Perl или Ruby или что-то в этом роде, и вы просто пытаетесь написать тот же код C #, только переведенный на этот новый язык, а не использовать функции этих языков .

Хотя C является подмножеством C ++,

0
ответ дан 18 December 2019 в 05:17
поделиться

Вам следует изучить структуры данных на C. Во-первых, это заставит вас по-настоящему понять указатели, которые помогут вам иметь дело с дырявыми абстракциями в языках более высокого уровня. Во-вторых, это сделает очевидными преимущества объектно-ориентированного подхода.

0
ответ дан 18 December 2019 в 05:17
поделиться

теория оптимизации

в первую очередь потому, что вывод asm компилятора C обычно намного более предсказуем и обычно хорошо коррелирует с C. Это позволяет вам научить / узнать , почему лучше структурировать код определенным образом, показывая фактически сгенерированные инструкции.

0
ответ дан 18 December 2019 в 05:17
поделиться

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

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

В C ++ вы можете быстро закрепиться на более высоких уровнях. абстракции. Это полезно для продуктивности, но не обязательно для понимания.

Мой совет:

0
ответ дан 18 December 2019 в 05:17
поделиться

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

0
ответ дан 18 December 2019 в 05:17
поделиться

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

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

Затем я изучил C ++. Чтобы упростить, C ++ добавляет уровень объектно-ориентированного программирования - у вас те же цели, что и у вас, независимо от языка, но подход и конструкции, которые вы создаете для их достижения, различны: классы, перегрузка, полиморфизм, инкапсуляция и т. Д. ..

Это не было какое-то осознанное решение с моей стороны, просто мой курс программирования был структурирован, и он оказался хорошей учебной программой.

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

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

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

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

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

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

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

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

1
ответ дан 18 December 2019 в 05:17
поделиться

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

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

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

Несколько мыслей.

1
ответ дан 18 December 2019 в 05:17
поделиться

Простота C чудесным образом фокусирует ум .

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

2
ответ дан 18 December 2019 в 05:17
поделиться

Это действительно зависит от того, какое подмножество C ++ вы изучили. Например, вы можете обойтись C ++, используя только библиотеки iostreams; это оставит вас без опыта работы с библиотекой C stdio. Я не уверен, что назвал бы stdio фундаментальным навыком, но это определенно область опыта, с которой следует быть знакомым.

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

1
ответ дан 18 December 2019 в 05:17
поделиться

Я бы не сказал, что вы пропустили ничего фундаментального . Тем не менее, ознакомьтесь с Совместимость C и C ++ , чтобы ознакомиться с несколькими нефундаментальными примерами.

Некоторые добавления C99 не поддерживаются в C ++ или конфликтуют с функциями C ++, такими как макросы с переменными числами, составные литералы, переменные -длины массивов и собственные типы комплексных чисел. Тип данных long long int и квалификатор ограничения, определенные в C99, не включены в текущий стандарт C ++, но некоторые компиляторы, такие как GNU Compiler Collection [3], предоставляют их как расширение. Тип данных long long вместе с вариативными шаблонами, с помощью которых может быть достигнута некоторая функциональность вариативных макросов, будет в следующем стандарте C ++, C ++ 0x. С другой стороны, C99 уменьшил некоторые другие несовместимости за счет включения функций C ++, таких как // комментарии и смешанные объявления и код.

2
ответ дан 18 December 2019 в 05:17
поделиться

I find it's better to learn memory management in C before attempting to dive into C++.

In C, you just have malloc() and free(). You can typecast things around as pointers. It's pretty straightfoward: multiply the sizeof() by the # items needed, typecast appropriately, and use pointer arithmetic to jump all over the place.

In C++, you have your various reinterpret_cast<> (vs. dynamic_cast, etc) kind of things, which are important, but only make sense when you're realizing that the various castings are meant to trap pitfalls in multiple inheritance and other such lovely C++-isms. It's kind of a pain to understand (learn) why you need to put the word "virtual" on a destructor on objects that do memory management, etc.

That reason alone is why you should learn C. I also think it's easier to (at first) understand printf() vs. the potentially overloaded "<<" operator, etc, but to me the main reason is memory management.

3
ответ дан 18 December 2019 в 05:17
поделиться

Конечно, есть одна вещь: управление памятью . Возьмем, к примеру, следующий код:

struct foo {
   int bar;
   char **box;
};

struct foo * fooTab = (struct foo *) malloc( sizeof(foo) * 100 );
for(int i = 0; i<100; i++) {
   fooTab[i].bar = i;
   fooTab[i].box = (char **) malloc( sizeof(char *) * 10 );
   for(int j = 0; j<10; j++) {
      fooTab[i].box[j] = (char *) malloc( sizeof(char) * 10 );
      memset(fooTab[i].box[j], 'x', 10);
   }
}

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

Код C ++ будет выглядеть следующим образом:

struct foo {
    int bar;
    static int idx;
    vector< vector<char> > box;
    foo() : bar(idx), box(10) {
       idx++;
       for ( auto it = box.begin(); it != box.end(); it++) {
           it->resize(10,'x');
       }
    }
};

int foo::idx = 0;
foo fooTab[100];

Как видите, просто невозможно изучить необработанное управление памятью с помощью кода в стиле C ++.

РЕДАКТИРОВАТЬ: by "C ++ - код стиля "Я имею в виду: конструкторы / деструкторы RAII, контейнеры STL. Во всяком случае, я, вероятно, преувеличил, лучше было бы сказать: Гораздо сложнее научиться управлять сырой памятью с помощью кода в стиле C ++.

5
ответ дан 18 December 2019 в 05:17
поделиться

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

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

7
ответ дан 18 December 2019 в 05:17
поделиться

Сравните следующие примеры кода (извините, мой C ++ немного заржавел).

C ++:

int x;

std::cin >> x;

C:

int x;

scanf("%d", &x);

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

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

5
ответ дан 18 December 2019 в 05:17
поделиться

Зависит от вашего подхода к C ++. Обычно я рекомендую начинать с высокого уровня, с контейнеров STL и интеллектуальных указателей, и это не заставит вас изучить детали низкого уровня. Если вы хотите изучить их, вам, вероятно, следует сразу перейти к C.

1
ответ дан 18 December 2019 в 05:17
поделиться