C ++を学ぶ前にCを学ぶべきですか?[閉まっている]


117

今日は大学のCS学部の開校日を訪れました。ラボのツアーでは、学部生からの最終年度プロジェクトのいくつかを試してみました。1つは特に良かった-一種のFPS小惑星ゲーム。私はsrcそれがC ++(他のプロジェクトのほとんどがJava 3Dアプリであった)で行われたことを見つけるためにディレクトリをのぞくと決めました。

私は以前にCをやったことがありませんが、以前にCコードを調べました。このゲームの.cppコードで見たものとは、それほど違って見えませんでした。

私はCまたはC ++のどちらかを学ぶことに興味がありますが、おそらくもう一方については後で学ぶことになります。私は他の前に1学習への効果があるそうならば、人は?



7
実際には複製ではありません。暗黙的に、この質問は「最初にOOPまたは手続き型プログラミングを学ぶべきか」を尋ねます
bobobobo 2009

2
以下の答え(IMOはサークルに入る)に降りる前に、いくつかのアドバイスを提供させてください:TRUE:C ++ Cに適用されたすべての機能と属性を保持するため、暗黙的に「廃止された」C(以下の答えのほとんどの点は作る)。しかし、Cは、ではなくない死んいない。人々は、「両方を学ぶ必要はありません」という大切な人生のロープをつかんでいるようですが、実際にはこれには根拠がありません。C、から借り構文起点にC ++!= C。C ++を知っていても資格のあるC開発者にはなりません。同様に、Cを知っていても資格のあるC ++開発者にはなりません。
スーパーキャット

4
SAIDはTHATあります:NOの害は -より多くのあなたが知っている、より良いあなたがいる-しかし、逆に、ありませんC ++掘り下げる前に、Cに服用してますしている最終的な目標はC ++を学ぶのであればCを習得する必要は。あなたは、C ++を学びたいのであれば、外出先C ++を学び、そしてあなたがしたい場合tは、Cを学ぶCを学ぶ行きます。どちらにも長所と短所があり(Cの単純さとC ++の-超深度機能-両方とも独自の方法で呪いと祝福です)、どちらも今日でも使用されています(組み込みシステムのC、Unity、PHPなど-C ++) Unity、Unrealなども)。
スーパーキャット

3
ポイント: C ++を学びたいですか?次にCをスキップします。それは必要ありません。Cを学びたいですか?次に、C を学びます。両方を学びたい場合は、最初にCに進みます。彼らは両方とも世界に自分の場所を持っているので、どちらかが他方にとって十分であるとは思わないでください。
スーパーキャット

回答:


121

C ++を学ぶ前にCを学ぶ必要はありません。

彼らは異なる言語です。C ++が何らかの形でCに依存しており、それ自体が完全に指定された言語ではないというのは、よくある誤解です。

C ++が多くの同じ構文と多くの同じセマンティクスを共有しているからといって、最初にCを学ぶ必要があるわけではありません。

C ++を習得すれば、最終的にはCの大部分を習得しますが、時間の経過とともに習得する言語間でいくつかの違いがあります。実際、中間のC ++プログラマーはC / C ++を書く傾向があるため、適切なC ++を書くのは非常に困難です。

あなたが最初にCを知っているなら、それはC ++を学ぶのに良いプラスです。言語のチャンクを知ることから始めます。最初にCを知らなければ、別の言語に焦点を当てても意味がありません。何も知らないところから始まり、C ++にも当てはまるCから学べるものをすべてカバーする優れた書籍やチュートリアルがたくさんあります。

この回答のさらなる推論を参照してください


33
私はこれ以上反対することができませんでした。C ++を最初に学習すると、Cに「戻る」という非常に困難な経験が生じます。Cは、基本的な、基本のみのシステム言語です。C ++はまったく新しいボールゲームです。どちらの言語の問題へのアプローチも大きく異なります。幸運にも、C ++の仕事に飛び込む前にCをいじくり回すことができました。その後、C ++が提供する構文糖質を精神的に「ボイルオフ」することができ、どちらの言語の問題にも取り組むことができます。Cを言語ペアの "does stuff"部分として特定するのは非常に簡単です。最初にC ++を学ぶと、プログラマーは混乱し、惑わされます。
マットジョイナー

24
@Matt:私は最初にC ++を学びましたが、私は誤解したプログラマーではありません。だからあなたの主張は真実ではなく、反例による証明です。はい、Cにもゴールドバッジがあります。問題の真実は、2つの異なる言語であることです。もう1つの言語を依存関係として学習する必要はありません。それは愚かな誤解です。
ブライアンR.ボンディ

8
@Matt:また、私のリンクされた投稿から:C ++を最初に学習する必要があります。Cを最初に学習することで傷つくのではなく、何も学習しなければならない(あなたがそうしない)必要があるためではなく、Cを最初に学習することに利点がないためです。とにかくC ++に含まれているので、最終的にはCについてのすべてについてちょうど学ぶことになります。
ブライアンR.ボンディ

11
@マット:ごめんなさい、まだ理解できません。CとC ++のベン図を描き、交差する部分を確認します。C ++は、交差していない部分だけでなく、描画するC ++円全体で構成されます。あなたがたまたまCを最初に知っているなら、あなたはC ++をより速く学ぶことができます。Cを最初に知っていない場合は、最初にCを学ぶ必要はありません。C ++に関するすべての本がポインタとメモリ管理、および文字列リテラルなどをカバーしないと思いますか?今は議論をやめますが、最後にコメントを残してください。
ブライアンR.ボンディ

11
@マット:CはどのようにしてC ++の理解を深めるのですか?通常、C ++を学ぶCプログラマーは、醜くエラーが発生しやすい「C with classes」スタイルのコードを作成することになります。私はこれが常に起こると言っているわけではありませんが、Cは「モダン」なC ++よりもその恐ろしいスタイルのC ++に非常に近いため、Cで始めるときに最も自然な進歩です。
jalf

76

私はこの質問が大好きです。「最初に何を学ぶべきか、スノーボードやスキー」と質問するようなものですか。スノーボードをしたいのか、スキーをしたいのかによります。両方を実行したい場合は、両方を学習する必要があります。

どちらのスポーツでも、この質問を引き起こすのに十分に類似したデバイスを使用して、雪の丘を滑り降ります。ただし、これらは十分に異なるため、一方を学習しても他方ではあまり役に立ちません。CとC ++でも同じです。構文が十分に類似した言語のように見えますが、OOコードと手続き型コードを書くために必要な考え方は十分に異なるため、2番目に学習する言語に関係なく、最初から始める必要があります。


70

最初にCを学び、C ++を学ぶ前に、Cを使用するデータ構造のコースを受講しました。これでうまくいきました。Cのデータ構造コースでは、ポインターとメモリ管理についてしっかりと理解できました。また、オブジェクト指向パラダイムが何であるかを知った後で、それがオブジェクト指向パラダイムの利点を明らかにしました。

反対に、Cを最初に学習することにより、ポインター(C ++参照がそうである場合)やプリプロセッサーの過度の使用など、最初に悪いC ++コードを書く原因となったいくつかの習慣を開発しました。

C ++は、多くの機能を備えた非常に複雑な言語です。ただし、実際にはCのスーパーセットではありません。むしろ、Cに非常によく似た基本的な手続き型プログラミング構造(ループ、ifs、および関数)で構成されるC ++のサブセットがあります。あなたの場合、私はそれから始めて、より高度な概念に至るまで取り組みます。クラスやテンプレートのように。

IMHOで最も重要なことは、手続き型、オブジェクト指向型、関数型、論理型などのさまざまなプログラミングパラダイムに触れ、脳が世界を1つの視点から見る前にフリーズすることです。ちなみに、Schemeのような関数型プログラミング言語を学ぶことを強くお勧めします。それは本当にあなたの視野を広げます。


18

両方を学ぶことにした場合(そして他の人が述べたように、両方を学ぶ必要は特にない)、最初にCを学ぶ。CからC ++への移行は、自然な流れのように感じられます。反対側に行くと、意図的に片方の手を後ろで結ぶような感じになります。:-)


13

私はCを最初に学んだので、あなたはCを最初に学ぶべきだと思います。Cは、構文などをよく理解し、ポインターなどのすべてのことをC ++に流し込みました。

C ++はこれらすべての問題を簡単にまとめることができると思います([]演算子と危険なインデックスを使用してもオーバーフローしない配列が必要ですか?確かに、境界チェックを行う配列クラスを作成します)。彼らはそうであり、なぜ物事が特定の方法で行われるのかを理解する前に彼らに噛まれます。

すべてのことを言い終えたら、C ++の通常の教え方は「C ++はオブジェクトを伴うCであり、ここにCの要素があり、ここにすべてのOOの要素がどのように機能するか」ということです。とにかくほとんどのテキストに従ってください。


同意しません。その価値のあるC ++プログラミングブックには、配列のしくみ(およびオーバーフローを防ぐ方法)など、少なくともいくつかの「落とし穴」が含まれます
moonman239

11

ここでは大多数に反対するつもりです。C ++を学ぶ前にC 学ぶべきだと思います。絶対に必要ではありませんが、C ++の学習がずっと簡単になると思います。CはC ++の中核です。Cについて学んだことはすべてC ++にも当てはまりますが、Cの方がはるかに小さく、学習しやすくなっています。

K&Rを手に取り、それを読み通してください。それは短く、あなたに言語の十分な感覚を与えます。ポインタと関数呼び出しの基本を理解したら、もう少し簡単にC ++に進むことができます。


15
違う。Cが教えるほとんどすべてのことは、C ++では悪い習慣です。CはC ++の中核ではなく、たまたま多くの構文を共有しています。世界にはすでに「C with classes」プログラマーが十分にいます。CまたはC ++を学ぶ。ただし、CがC ++ liteであると偽ってはいけません。
2009年

13
私は私の言葉に立ち向かいます。C ++はCの上に構築されているため、Cが中心です。C ++で使用されるイディオムはCで使用されるイディオムとは大きく異なりますが、構文は同じです。Cで始まるC ++の正しいプログラミング方法を学ぶことができます。C++ Primerをご覧ください。それは基本的にそれを行います。
スティーブ・ロウ

6
+1。Cは小さい言語なので、習得が容易です。Cとの下位互換性を保つ試みは、C ++の主要な問題の1つの原因であり、もう1つは、90%のC ++プログラマーが使用するには複雑すぎるテンプレートシステムです。
hillu 2009年

1
変数、型[ポインタと修飾を含む]、スコープ、関数、プリプロセッサ、およびリンケージの理解は、CとC ++の両方に不可欠です。私はCでこれらの概念を学ぶことはあなたも知っているクラスの別の意味に対処する必要はありませんので、容易になります言うstaticなど(コンパイラが発することと途方もなく威圧的なテンプレートエラー)テンプレート、
dreamlax

1
あなたはポイントを持っています。実際には、Cを学び、そのルーツをよりよく理解してC ++に進むことができるようにするとよいでしょう。
Daniel Daranas 2014年

10

C ++を学習する過程で、Cのほとんども学習します。ただし、C ++コードの多くは有効でないCであることに注意してください。C++はCコードと互換性があるように設計されているため、最初にC ++について学習します。ブライアンはこれに関して素晴らしい答えを書きました。


8

Cを学ぶと、コードを書くときに、明示的および暗黙的なメモリ管理や基本データ型のストレージサイズなど、いくつかの問題についてより深く考える必要があります。

Cの機能や誤機能を気に入るようになったらことができるようになったら、C ++での学習や記述の問題は少なくなります。

ご覧になったC ++コードは標準のCとそれほど異なっていない可能性がありますが、それはオブジェクト指向ではなく、例外、オブジェクト指向、テンプレート、またはその他の高度な機能を使用していなかったためと考えられます。


8

番号。

EiffelやC#などの最新のOOベースの言語に近いため、一般的にC ++を学ぶ方が便利です。

あなたの目標がC ++を学ぶことであるなら、そもそも現代の標準C ++を学びなさい。mallocは脇に置いておきます。


しかしスティーブ・ロウ はポイントを持っています ...


最近のC ++は、C#やEifelなどのOO言語に近づいていません。
アインポクルム

7

人生における他の多くの質問への回答と同様に、それは場合によって異なります。それはあなたのプログラミングの興味と目的が何であるかに依存します。おそらくGUIを使用してデスクトップアプリケーションをプログラミングする場合は、C ++(およびOOP)がおそらくより良い方法です。x86チップセット以外のハードウェアプログラミングに興味がある場合は、Cが通常は速度の点でより良い選択です。新しいメディアプレーヤーを作成する場合や、ビジネスアプリを作成する場合は、C ++を選択します。銀河の衝突や流体力学の科学的シミュレーションを実行したい場合は、Cの力を見てください。


4
多くの高性能コンピューティングシナリオでは、これらの数百のクロックサイクルが実際に重要です。
スコッティーT

1
@ScottieT:指定子を除いて、restrictCにはC ++の他にパフォーマンス関連の構文/セマンティックコンストラクトがないため、C ++コードの構文が豊富で、メタプログラミングなどにより低速のコードが生成されると思いますか?式テンプレートさえ知っていますか?
セバスチャンマッハ

1
@phresnel:関連性。C ++は非常に複雑な言語であり、多くの場合、購入する価値のない機能を備えています。一般的に、Cは、C ++ と同じパフォーマンスの機会を、非常に少ない複雑さで提供します。
マットジョイナー、2013

1
@MattJoiner:保守性/拡張性もパフォーマンスの要因ですが、科学的なコードは多くの場合ワンショットです。ただし、(例として)expression-templates-argumentを繰り返すと、C ++には最適化の機会が多くなると(また、組み込みコードよりもexpression-template-codeを記述する方が簡単であるため)、1つの例外があります(restrictただし、すべての主要なC ++コンパイラが拡張機能として提供されています)。また、同じコンパイラーを使用した場合、同じコンパイラーを使用すると、C ++とCのパフォーマンスに違いがあると本当に思いますか?[...]
セバスチャンマッハ

1
@MattJoiner:[...]、そして「C ++が嫌いなだけ」のようなステートメントを読むときに、この議論であなたがわずかに偏っているという仮定を立てることができます。C ++コードのパフォーマンスが低下する原因は何だと思いますか?Cが同じパフォーマンス機会を持っている場合、式テンプレート、一般的なテンプレート、非組み込みデータ型、ファンクターでのコンパイル時の計算と同等のものは何ですか?そして、コスト/保守性の要素を追加します:RAII、オペレーター/関数のオーバーロード、汎用標準コンテナー、標準スレッド、汎用標準アルゴリズム、リファレンス?
セバスチャンマッハ

7

Cを最初に学ぶのは良い考えだと思います。

comp sciコースがまだCを使用している理由があります。

私の意見では、主題のすべての「混雑」を回避することは、OOPを要求する義務が担います。

手続き型プログラミングは、プログラミングを最初に学ぶ最も自然な方法だと思います。結局のところ、それはあなたが持っているものだからです。コード行が次々と実行されるからです。

今日、多くのテキストが「オブジェクトファースト」アプローチを推し進めており、アレイを導入する前に自動車やギアシフトについて話し始めています。


4
最近のcomp sciコースの多くはJavaを使用しているようで、これがあなたが話している問題を悪化させています。
ディマ

2
あなたは非常に良い点を作ります。第一言語としては複雑すぎることに加えて、C ++の大部分は、優れたコンピュータサイエンスの授業に不可欠なオペレーティングシステムやメモリとの低レベルのやり取りを隠すことを奨励しています。配列はオブジェクトよりもずっと前に教える必要があります。
マットジョイナー2010年

1
一方、数学が苦手でない場合は、関数型プログラミングの方が見た目や使い心地がよく、機能もしているため、より自然なものになる可能性があります。
セバスチャンマッハ

2
「comp sciコースがまだCを使用する理由があります。」ええ、ほとんどのcomp sciコースは不十分に教えられているからです。
2014

6

Javaを最初に習得した人々がC ++でのポインタとメモリ管理の概念に苦労しているのを観察したので、他のC ++の複雑さから切り離されたこれら2つの概念を理解するには、Cを最初に習得することをお勧めします。特徴。


5

私の2セント:

最初にCを学ぶことをお勧めします。

  • それは基本的な言語です-多くの言語はCに由来します
  • 組み込みシステム、GPUチップなど、C ++よりも多くのプラットフォームがCコンパイラをサポートしています。
  • TIOBEインデックスによると、Cは依然としてC ++の約2倍の人気があります。

3

私はcは本当に素晴らしいプログラミング言語だと思います。それはコンパクトで、やや学習が簡単です。しかし、c ++だけを学びたい場合は、c ++から始めてください。しかし、両方を学ぶことをお勧めします。そしてあなたがそれをしたいなら 私はcから始める方が良いと思います。前に述べたように、それは小さく、いくぶん学びやすいです。C ++のようなより複雑なプログラミング言語への良いステップアップかもしれません。(cはいくつかの基本を提供するため)

幸運を。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.