Это нормально, если я не знаю C, но у меня все хорошо с C ++? [закрыто]

23

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

Я довольно хорошо справляюсь C++, хорошо знаю язык, я прочитал Accelerated C++и выполнил почти все упражнения.

Однако у меня большая проблема. Нужно ли учиться C? Я никогда не делал Cникогда в своей жизни. Я только начал, C++когда я начал с программирования. Наверное потому, что мне всегда было интересно узнать, почему все называют язык таким сложным. Теперь, хотя я знаю ответ на этот вопрос;)

Мне особенно интересно узнать, смогу ли я выжить, не зная Cв современном мире. Например, если я дам интервью в компании, если я скажу им, что я не знаю C- они примут это как хорошо? Два языка, с которыми я хорошо знаком, это Python и C ++. Я спрашиваю об этом, потому что я слышал, что компании спрашивают структуры данных в интервью. Так что, если они попросят меня реализовать это, и если я сделаю это на C ++, это приемлемо?

И люди, которые говорят «как вы можете не знать C, когда вы C ++», пожалуйста, не отвечайте :) Не обижайтесь, но я не понимаю, почему изучение C является обязательным условием.

SS
источник
1
В статье, цитируемой DumbCoder, рассказывается о популярности C во встроенном программировании.
ChrisW
2
@ChrisW - Да, но он все еще показывает, что C не так легко освоить, а C ++ не так легко освоить.
DumbCoder
@DumbCoder: О нет, встроенное программирование. Сколько рабочих мест во встроенных по сравнению с настольным компьютером?
DeadMG
@DeadMG - владение языком не имеет никакого отношения к тому, сколько рабочих мест доступно для этого языка. И с чего вы взяли, что C используется только во встроенном программировании?
DumbCoder

Ответы:

36

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

Я бы предпочел встретить человека, который утверждает, что знает C ++, но не C, чем человека, который утверждает, что знает C / C ++.

CB Bailey
источник
О да. Это первый вопрос в SO-вопросе о городских мифах C ++: stackoverflow.com/questions/2245196/c-urban-myths
4
+1. Если вы знаете C ++, для начала, это очень полезно для изучения C, а во-вторых, это действительно неважно.
DeadMG
6
@DeadMG Может быть легко изучить синтаксис, поскольку это просто знание того, какие части C ++ оставить без внимания, но изучение общих идиом сложнее и, возможно, является наиболее важной частью. Но я бы не выучил C, если бы не нуждался.
KeithB
6
@chubsdad ты имеешь в виду, что я не должен помещать "я знаю Java / Javascript" в мое резюме?
Инкогнито
@ user257493: Нет такой вещи как Java / Javascript
Джон Диблинг
23

Ответ из нескольких частей. Только мои мнения.

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

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

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

Удачи.

Стив Таунсенд
источник
Что заставляет вас говорить, что C ++ становится все более необычным? По вашему опыту, что его вытесняет?
Праксеолит
insights.stackoverflow.com/survey/…
Стив Таунсенд
13

Вот что говорит Бьярне:

Знание C является обязательным условием для изучения C ++, верно?

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

Chubsdad
источник
4

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

Алекс Ф
источник
3
@ Алекс Фарбер - «Если вы знаете C ++, вы можете писать на C». Я очень сомневаюсь в этом :)
DumbCoder
4
Не согласен. IME, программисты, которые сначала изучают C ++, обычно не понимают, чего нет в C ++. Программисты, которые сначала изучают C, могут легко писать на C ++, но начинают не идиоматически.
dan04
1
Это основано на моем личном опыте. Я изучил C ++ и большую часть своей работы делал на C ++. Но я использую C, когда это необходимо, без каких-либо проблем.
Особенно с учетом того, что все симпатичные библиотеки классов недоступны в C. По моему мнению, победа таких языков, как C ++ и Java, является библиотеками, а не неотъемлемыми характеристиками языка как таковыми.
8
Программисты C ++, пытающиеся взломать свой путь через C, пишут плохой код по тем же причинам, почему программисты C, пытающиеся взломать свой путь через C ++, пишут плохой код. Ребята из C используют C ++ как «C с классами», а ребята из C ++ используют C как «C ++ без классов».
Джон Диблинг
4

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

Во-вторых, это полностью ситуативно. Нужно ли вам знать C, полностью зависит от того, требует ли это работа. Если вы хотите быть парнем по встроенным системам, то да, изучение C поможет. В противном случае большинство рабочих мест не требуют этого. Если работа нуждается в C, это должно сказать так. Если это не так, то, вероятно, это не нужно. Что касается структур данных, опять же, дело за компанией. Обычно компания говорит: «Мы программируем на этих языках, напишите нам эту структуру данных. Используйте язык по вашему выбору из списка выше». Если они просят вас написать это на C, вы просто скажете: «Я не знаю C - в моем резюме не сказано, что я знаю C, эта работа не для меня».

Стивен
источник
Почему знание C мешает изучению C ++? Я не говорю, что я не согласен, но это смелое утверждение.
Кейси Паттон
3

Например, если я дам интервью в компании, если я скажу им, что я не знаю C - они примут это как хорошо?

Спросите, нужен ли им С (и хотите ли вы учиться этому или нет, если они это делают).

Так что, если они попросят меня реализовать это, и если я сделаю это на C ++, это приемлемо?

Я бы так и ожидал, если бы они брали у вас интервью и нанимали вас на работу в C ++.

Если это вопрос «структур данных», вы можете спросить их, хотят ли они, чтобы вы продемонстрировали использование контейнеров STL, или же (потому что это интервью) они хотят, чтобы вы реализовали структуры данных с нуля.

ChrisW
источник
2

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

frankc
источник
2

Нужно ли учить C?

Нет, вам не нужно. Период.

Но изучение любого нового языка программирования полезно в долгосрочной перспективе. Изучение языков на основе различных парадигм программирования еще более полезно. Будь то язык ООП (Smalltalk или C ++), динамический язык (Lisp, Clojure, Python), функциональный (Lisp, Haskell, Erlang), параллельный (Erlang, Go, Algol 68, Smalltalk) или любой другой (Fortran 03, Perl, Forth) другие новые опутанные парадигма поражает ваше воображение; Изучение разных языков помогает вам разобраться в нескольких направлениях мышления, каждый из которых имеет свои сильные и слабые стороны для решения поставленной задачи.

Fortran по-прежнему доминирует в числовых вычислениях, COBOL по-прежнему является опорой в крупных страховых компаниях, Unix, BSD и Linux по-прежнему основаны главным образом на C. Старый код не теряет свою ценность с возрастом всегда, потому что он не обязательно изнашивается как механические устройства, которые должны быть заменены с течением времени. Так старый язык может быть ценным с точки зрения занятости по сравнению с более новой языка прохлады фактором .

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

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

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

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

Не торопитесь и продолжайте учиться - это самый важный совет, который я могу вам дать. Для того, чтобы кто-то другой решил это сделать, я призываю вас прочитать книгу Питера Норвига « Научите себя программировать за десять лет» .

оборота mctylr
источник
1

Очень короткий ответ на ваш вопрос: это сильно зависит от ваших потребностей. Некоторые компании полагаются в первую очередь на C, иногда в качестве реликвии (если C уже несколько лет использовался там). Другие компании не имеют ничего общего с C. Язык C - это язык более низкого уровня, чем, скажем, Python или Java, и во многих прикладных программах может не потребоваться знание языка C. В отличие от языков ООП, C требует другого подхода, благодаря которому Я имею в виду, что программы структурированы и организованы по-разному, и необходимо учитывать некоторые более тонкие аспекты. Как правило, полезно изучить эту идиому, даже если можно так выразиться. Но опять же, заботятся ли компании, зависит от их потребностей. Кто-то может дать вам выбор языка, кому-то может потребоваться Java, другим - C ++, другим - C и т. Д. Можете ли вы выжить? Да, сегодня' В мире так много разных областей программирования, что вы никогда не сможете пройти мимо кода Си. Стоит ли учить С? Я бы сказал - да, независимо от дальнейшего использования.

user400348
источник
1

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

В C ++ существует «защитная» структура, которая способствует управлению не только структурой, но и алгоритмами программы. Например, помощь структуры и алгоритмов STL, очевидный подход объектно-ориентированного программирования, кон / деструктор, добавленный уровень абстракции, исходящий из шаблонов ...

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

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

Кроме того, хорошая C-программа подразумевает хорошие навыки работы с системой разработчика, поскольку язык требует (как правило) четкого понимания компонентов системы для создания эффективного запуска.

Кольцо Ø
источник
Я бы не сказал, что это увеличивает свободу программиста - вы всегда можете написать свою собственную структуру и алгоритмы на C ++.
DeadMG
0

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

Однако я бы предложил изучить функции printfи scanfряд функций, чтобы вы могли ПРОЧИТАТЬ код, который их использует. Они довольно популярны в C ++, поэтому полезно знать, как их использовать. Я не предлагаю использовать их в своем собственном коде без особой причины.

Марк Б
источник
0

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

Я не писал С профессионально за последние 6 лет или около того; Есть множество областей применения, лучше обслуживаемых другими языками (по крайней мере, с точки зрения производительности, если не производительности), такими как Java, C # или Python. Вы наверняка можете выжить и даже процветать как разработчик программного обеспечения, даже не прикасаясь к C.

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

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

Джон Боде
источник
-1

Я думаю, что если вы чувствуете себя комфортно с C ++, вы тоже будете с C.

Основное различие между ними заключается в том, что C ++ является чистым - объектно-ориентированным, а C - нет :)

Нуно
источник
1
Я большой поклонник C ++, но я бы не назвал это чистым. А C ++ является мультипарадигмой, что означает, что хороший код C ++ не обязательно является объектно-ориентированным.
KeithB
-1

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

Это также зависит от того, хотите ли вы программировать на C или нет. :)

Александр Либерсон
источник
-1

Да, это нормально ...

ИМХО, так как ты хорош C++, этого действительно достаточно ...

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

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

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

liaK
источник
-1

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

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

Убедитесь, что вы понимаете все основные функции C ++, которых нет в C. Если вы достаточно прочтете stackoverflow.com, вы увидите много вопросов, которые касаются различий в языках и недопонимания их людьми.

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

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

Что касается интервью, если кто-то просит вас написать код для какого-то общего алгоритма на C, и вы делаете что-то вроде:

struct foo {
       int a;
       void * b;
};
foo x;  // in C++ this would work, but in C it would fail because struct names aren't in the
        // type name table unless you put them there with typedef

Я не думаю, что они решат, что вы не знаете, что делаете, потому что не делали:

struct foo x;

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

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

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

nategoose
источник