10

私は過去 5 年間、専門的に Java を書いてきました。最近、いくつかの Windows 固有の関数を呼び出すために、JNI を少し掘り下げる必要がありました。

この経験から、私の C (または C++) 言語の苦手さが浮き彫りになりました。私が C を初めて知ったのは、11 年前に高校で読んだ簡単な「ダミー」の本だけでした。

その間に両方の言語、特に C++ と標準ライブラリが進歩したことを私は知っています。

C または C++ を学ぶのは適切でしょうか? どの本が一番いいでしょうか?

また、Windows プログラミングに関する推奨事項はありますか? 特定の API 呼び出しを理解するのに十分なほど MSDN を読むことができますが、「全体像」に関して何かが欠けていると感じています。

ありがとう

4

11 に答える 11

37

良い質問。表面的には、「Java のようなオブジェクト指向」であるため、C++ を推奨することは明らかです。唯一の問題は、実際にはそうではないということです。C++ では OOP が許可されていますが、これは C++ がサポートするいくつかのパラダイムの 1 つにすぎません。C++ を OOP 言語のように扱う (特に Java のように扱う) と、フラストレーションがたまるだけです。

問題は、Java と C++ には実際にはあまり共通点がないことです。Java プログラマーは、Java が C++ に触発されたと信じがちですが、それは、C++ が C++ の最も初期のバージョンを意味する場合にのみ当てはまり、"C with classes" と呼ぶ方が適切かもしれません。それ以来、C++ は独自の方法で独自の言語に完全に変換されました。それ以来、おそらく Java よりもはるかに多くの変更が行われています。当時の Java プログラマーは、今日の Java コードを理解することができます。C++ ではそうではありません。したがって、C は実際には「最新の C++」よりも Java に近いと言えます。C は、Java から GC とクラスの概念とその他のいくつかの抽象化を取り除いた場合に得られるものです。C++ にたどり着くには、

さらに、C++ は非常に複雑な言語であり、それを十分に習得するには何年もかかります。そして、それをよく学ばないと、何度も自分の足を撃ちます。

最後に、それはあなたの目的に依存します。C++ は C よりもはるかに現代的な言語であり、一度習得すると、非常に表現力豊かで強力であり、驚くべきことに、非常にエレガントで簡潔になることさえあります。しかし、学習曲線は厄介です。したがって、長期的にネイティブ プログラミングを行う場合は、C よりも C++ をお勧めします。

しかし、主な目的が Win32 API (またはその他のネイティブ API) とのインターフェイスである場合は、C++ は必要ありません。Win32 およびその他のほとんどの API は C++ ではなく C で記述されており、Java とのインターフェイスに非常に複雑なコードはほとんど必要ありません。

Win32 の学習については、その通りです。必要な詳細はすべて MSDN にあります。全体像を知りたい場合は、Petzoldそのテーマに関する本です。

于 2009-01-21T00:31:32.580 に答える
8

目的にもよると思います。

マシンに近づきたい場合は、C.

C の上の OO Java のようなレイヤーの知識を補足したい場合は、C++ を使用してください。

Accelerated C++ (サニタイズされた Amazon リンク) は、C++ の観点から C++ を学ぶための素晴らしい本であり、他のビットが追加された C だけではありません。

そして、K'n'R C (無害化されたAmazon リンク) は、C IMHO を学習するための方法です。

ところで、C++ については、Effective C++ の本で Scott Meyers の知恵をフォローアップしてください。そして彼のEffective STLの本も。

HTH

乾杯、

ロブ

于 2009-01-21T00:15:33.363 に答える
5

「より優れた C」として使用するために十分な C++ を学びます。そのすべてを Java の理解に当てはめようとする必要はありません。必要なのは、C++ オブジェクトを抽象データ型、new および delete などとして使用できるようにすることだけです。STL が登場すれば、なおさらです。

本当の問題は、JNI がこれほどまでに絶対に必要であると考える理由です。Windows 呼び出しは、アプリの移植性を維持するという考えを台無しにします。私は、JNI を使用する Java アプリケーションを掘り下げなければならない人の隣に座っています。SEG FAULT でサーバーをランダムにダウンさせます。彼の仮説は、ヒープがいっぱいになると、malloc を呼び出してヒープにスペースを割り当てるルーチンに対して JNI 呼び出しが行われるというものです。ルーチンは返されたポインタの null をチェックせず、割り当てを解除し、サーバーをダウンさせます。GC が起動する直前に JJNI メソッドを正確なタイミングで呼び出す必要があるため、彼はまだローカルでエラーを再現しようとしています。

100%確実に必要ですか? 尋ねるだけ....

于 2009-01-21T00:52:39.090 に答える
4

Java を十分に理解している場合は、C から始めることをお勧めします。C++ から直接始める場合は、Java との間に多くの違いがあり、おそらく気に入らないでしょう。

両方の言語を真剣に学習する場合は、Bjarne Stroustrup の「The C++ Programming Language」と Dennis Ritchie の「The C Programming Language」をお勧めします。

于 2009-01-21T00:15:19.447 に答える
3

C++ は C よりも習熟しやすいと思います。

Java を使用している場合は、クラス、例外、参照の形式、動的バインディングなどの便利な機能や、もちろん適切なライブラリを廃止するのに苦労するでしょう。

ただし、最初に C を学習して、ボンネットの下にあるものを本当に理解していることを確認し、ポインターとその使用法、および「保護具なしで」作業する感覚を体験する必要があります。

それをマスターしたら、C++ の継承メカニズムと Java との違い (多重継承など) について学びます。

于 2009-01-21T00:08:19.663 に答える
2

これは本当にあなたの強みと弱みに依存します。デザイン パターンが本当に好きなら、C++ を使うことをお勧めしますが、JNI でいくつかの単純なメソッドを実装する必要があるだけなら、C をお勧めします。 C++ の複雑さ (コンストラクターの呼び出し順序、デストラクタ、および C++ と Java のその他の違い) について心配する必要はありません。

C を学習するための決定的なマニュアルとして、Kernighan と Ritchie による「The C Programming Language」をお勧めします。

*nix システムを使用している場合は、さまざまな機能のマンページに十分なドキュメントがあります。例えば、

bash$ man malloc

于 2009-01-21T00:14:28.077 に答える
1

C に関する優れたリソースが必要な場合は、Dennis Ritchie 著の「The C Programming Language」が最適です。

于 2009-01-21T01:08:49.947 に答える
0

ここでの「主な目標」がWindowsプログラミングを行うことである場合は、CまたはC ++よりもC#をお勧めします。ただし、地球上のすべてのプログラマー、および低軌道では、Cを知っている必要があります。C++を知らなくてもかまいませんが、少数の関係者に招待されることはないかもしれません:)しかし、Cは、アプリケーション間の通過儀礼のようなものです(高-レベル)プログラマーとライブラリー(低レベル)プログラマー。

于 2009-01-21T01:48:22.753 に答える
0

あなたの意図が JNI コードを書き続けることであるなら、私は断然 C++ をお勧めします。

特に、JNI インターフェースでは、Java オブジェクトへの参照を取得 (およびその後解放) する必要があります。C++ の自動変数を使用すると、メモリ管理をはるかに簡単にする「RAII」(リソース割り当ては初期化) 手法を使用してこれらの参照を取得できます。

于 2009-01-21T00:58:29.500 に答える
0

100%確実に必要ですか? 尋ねるだけ....

残念ながらそうです。

回答ありがとうございます。

フォローアップのいくつかの質問に答えるために、私は C や C++ への転職を求めているわけではありません。基本を学びたいので、少しずつ書く必要があるときに盲目的に飛んでいるような気がしません。

于 2009-01-21T01:00:10.603 に答える
0

特に、JNI インターフェースでは、Java オブジェクトへの参照を取得 (およびその後解放) する必要があります。C++ の自動変数を使用すると、メモリ管理をはるかに簡単にする「RAII」(リソース割り当ては初期化) 手法を使用してこれらの参照を取得できます。

ありがとう、それは役に立ちます。私の胃の中で増大する懸念をかき立てた領域の 1 つは、JNI オブジェクトに関連付けられたメモリを手動で管理することでした。

于 2009-01-21T01:06:57.347 に答える