web-dev-qa-db-ja.com

Cを学ぶ実用的な方法は?

私はCを掘り下げたいのですが、通常、新しい言語を学びたいときは、実用的な目的(APIの使用、タスクの自動化など)を持つシンプルで達成可能なプロジェクトの目標について考えます。

私がCの1つを思い付くのは、主にCの主な用途が現在組み込みシステムとオペレーティングシステムのようなより複雑なソフトウェアプロジェクトであることを指摘しているためです。

これは、私がそれを学ぶ必要がないという事実、または私の学習戦略でもう少し複雑にする必要があるという事実を指摘していますか?

実践的な学習リソースへの参照? (チュートリアル/どのようにそれが何らかの目的/利益を持つ最終結果を生み出すか)

10
jondavidjohn

Kernighan and RitchieのThe C Programming Language(2nd Edition) を入手することをお勧めします。各章の終わりには、C言語の非常に優れた入門書を提供するとともに、実行できる多くの演習があります。それはあなたを言語のマスターにすることはできませんが、おそらく本を読み、演習を行うために十分な理解が必要です Cで書かれたオープンソースプロジェクト ソースを読んで、おそらく貢献してください。

Cコードを含む実際の実際のプロジェクトを見たい場合。それは難しくなっています-多くのプロジェクトは「より高いレベル」の言語を使用していますが、Cはまだ生きており、活発です。 Cを学びたい場合は、学習を達成するために車輪を再発明することを恐れないでください。ソリューションを24時間体制で再発明することは良い考えではありませんが、学術的な演習としてそれを行うのはまったく問題ありません。

27
Thomas Owens

あなたは本当にメモリ割り当てを理解する必要があるでしょう。以前に他の言語を使用したことがあるように聞こえますが、他の言語がメモリ管理の面倒な詳細を隠していた可能性があります。 Cでは、メモリ管理は常に明示的です。これにはいくつかの利点がありますが、それを正しく行うには注意が必要です。そうしないと、すべての地獄が壊れてしまいます。

使用しているプラ​​ットフォームで利用可能なメモリデバッグ機能を使用してください。 LinuxにはElectric Fence、Mac OS XにはGuard Mallocがあります。また、いくつかのオペレーティングシステムをサポートするValgrindもあります。

解放する必要があるメモリの解放に失敗すると、メモリリークが発生します。それを続けると、メモリが不足します。バッキングストア(ほとんどの人が仮想メモリと呼ぶもの)を使用しても、システムのページングが過剰になったり、スワップ領域が不足したりする可能性があります。

すでに解放されているメモリを解放すると、ヒープが破損してクラッシュしますが、おそらくすぐには解放されません。バッファーをオーバーランすると、ヒープも破損します。メモリデバッグツールは、これらすべてに役立ちます。

単体テストも役立ちます。

1
Mike Crawford

あなたはコマンドラインから機能することができる何かをしたいでしょう。 CでのGUIプログラミングは、good GUIフレームワークであっても、お尻の大きな痛みです。

実践的なC学習体験に対する私のいつもの提案は、連絡先リストまたは他の単純なデータ管理アプリでした。これで、ほとんどの重要なビット(I/O、メモリ管理、テキスト処理など)がカバーされ、標準のCライブラリ以外のものを使用する必要はありません。 Cには、グラフィック、ネットワーキング、サウンドなどのサポートが組み込まれていません。1なので、Cプログラミングへの最初の進出については、そのようなことに依存するものはすべて避けるのが最善です。

C can汎用プログラミングに使用できます。期待をやや下げる必要があるだけです(1983年で、VAX 11/750に接続されたVT52の前に座っているとしたら、正しい考え方になります)。

覚えておいてください、Cにはブレードガードがなく、あなたが愚かなことをするのを妨げません。言語の定義は少し緩やかであり、illegalには該当しない操作もありますが、適切に定義されていません。


1-言語標準の最新(2011)リビジョンに組み込みのスレッドサポートが追加されました
0
John Bode

今日の言語は現在のタスクによって決定されるということは、ここにいるほとんどの人に同意します。あなたがこの点で限られた選択肢しかなかった時代がありました。現在、Cは主にコードの最適化が必要な組み込み/システムプログラミングドメインで使用されています。最大限に活用するには、正確なコードを記述する必要があります。その抽象化を使い始めたとしても、基礎となるものは非常に堅牢でなければならないためです。私はあなたがいくつかのオープンソースを回避しようとすると思いますGNU Linux自体またはC開発者を必要とするもののようなプロジェクト。Cで最初から何かを書くのではなく、それらのプロジェクトで手を試してください。これはおそらくコードを書いて言語を学ぶより良い方法でしょう。

0
Nishant

Project Euler をお勧めします。私はC++を改善するためにそれを使用し、それは素晴らしいです。それぞれの問題は小さなタスクなので、完了するのに1時間もかからない可能性があります(少なくとも最初の問題)。

速度を上げるためにプロファイラーとコードの最適化についての本が必要です。必ず1分のルールを守ってください。1分以内に回答を得る必要があります。

0
B Seven

あなたがすでにプログラマーで、Cを学ぶ必要があるだけで、古いバージョンの言語を学ぶことを気にしない場合(コアはまだほとんど同じです)、 Leendert Ammeraalの「C for Programmers」 打ち負かすことはできません。最初から最後まで、それを処理します。

0
John R. Strohm