みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CとC++の学習法

現在、Cを参考書で独学しています。(日曜プログラマ)

これまで、
PHP,Java,JavaScript,VBA、などに触れてきましたので、
プログラミングの基礎は分かっているつもりです。

Cの学習目的(Cで何をしようとしているのか)は、
「Cではどんなことができるのか」をまず知り、
その上で、Cならではの長所を生かしたプログラミングを
考えたいと思っています。
(ウェブと連携したプログラムで面白そうなものを作りたい。)

漠然とですが、CやC++に求めているものは、
その「処理速度」です。
(インタープリタ言語よりも速く処理させたい、という気持ちが強い。)

それと、サーバーソフトなど、
プログラムを走らせる基盤を必要とせずに、
実行できるソフトウェアに興味がある、ということもあります。

○○.exe ←これ1つあれば、実行できるプログラム という意味で。

例えば、PHPですと、○○.phpだけでは動かず、
そのファイルを逐次機械語に変換して実行するために
php.exeやphp.iniなどを必要としますよね。

他のPC(同じOSとして)でも、動かしたい場合、
その基盤も一緒に連れて行かないといけない、
という煩わしさからも解放されたいわけです。

と、これまでの文章の中に、既に誤った認識があるかもしれません。
その場合には、ご指摘頂けると助かります。

で、C言語を学び、最終的に、
より性能の充実したソフトウェアを作る上で、
C++の知識・技術が必要であると感じることになるのであれば、
Cだけに留まらず、C++も習得したいと考えています。

こうした考えのもと、質問をさせて頂きますが、

C++にできて、Cにできないこと
または、
Cでもできるけど、C++を知っていた方が良いケース、
について、
ざっくりと説明できる(一部、説明できる、ということでもOKです。)、
という方、その点について、どうか教えてください。

これから、Cをどう勉強していくか、どこまで勉強していくか、
その指針の確立に、みなさんからのご助言を参考にさせて頂くつもりです。

※要するに、Cを(必要そうであれば、C++も)効率的に学習したいわけです。
※その上で参考になるアドバイスを頂きたい、というのが本件の最大の目的です。

この手の質問をすると、まず、
「何がしたいの?」
と言われそうですが、
「何が出来るの?どれほどのパフォーマンスが期待できるの?」
という気持ちから勉強している場合には、
そうした質問をされると困りますので、その点、ご理解いただいた上で、
回答して頂けると非常に助かります。
(この点における、補足⇔回答のやりとり[手間暇]を極力抑えたい、という意図から。)

回答を頂きましたら、適宜、補足などさせて頂きます。
それでは皆さん、よろしくお願い致します。

投稿日時 - 2011-02-25 10:19:56

QNo.6548938

困ってます

質問者が選んだベストアンサー

パソコンでC/C++を使う理由といえばパフォーマンス、C/C++に慣れている、DLLなどプラットフォーム不要などの理由でしょう。
※ ただしプラットフォーム不要と言ってもMFCやDirectXなどを使った場合はインストールが必要な場合もある。

何が出来るという意味なら、一般アプリを作る場合はJavaよりも面倒臭いことすれば同じことが出来るよってぐらいで不便に成るだけです。
純粋なC/C++ならではの特別な事ってOSやドライバを作れたり、マイコン用のプログラムを作ることが出来る(特別なJavaVMなどプラットフォーム不要なため)って事ぐらいです。

>(ウェブと連携したプログラムで面白そうなものを作りたい。)
これなんかJavaの数十倍面倒です。
私ならC#やJavaで作ることを考えますし、さほどパフォーマンスが必要ないのではと言う疑問もあります。

>C++にできて、Cにできないこと
クラスがC言語に無いから大規模プログラミングに苦手と言われますが、LinuxもC言語で出来ていることを考えても作る人が作れば大規模プログラミングは出来ます。
実はC++に出来ることは、多少パフォーマンスを犠牲にしてもクラスを使って抽象的プログラミングが出来る(楽に組める)って事なんですね。

>Cでもできるけど、C++を知っていた方が良いケース、
楽をしたい時に限ります。
C++でもC言語的に組めるのでパフォーマンス追求なら多少C++で無くなってもソースコード一部だけC言語的に組むことはあります。

それでも近年のJavaはC++の性能に近づいています。
「Javaの性能 - Wikipedia」
http://ja.wikipedia.org/wiki/Java%E3%81%AE%E6%80%A7%E8%83%BD
「JavaとC++のパフォーマンスを比較する(1/5):CodeZine」
http://codezine.jp/article/detail/4935

投稿日時 - 2011-02-25 11:31:15

お礼

示唆に富んだ回答をありがとうございます。
その中でも特に気になった点について書かせて頂きます。

>純粋なC/C++ならではの特別な事ってOSやドライバを作れたり、マイコン用のプログラムを作ることが出来る(特別なJavaVMなどプラットフォーム不要なため)って事ぐらい

>これなんかJavaの数十倍面倒です。
>私ならC#やJavaで作ることを考えます

■特にこの辺りは参考になりました。
>実はC++に出来ることは、多少パフォーマンスを犠牲にしてもクラスを使って抽象的プログラミングが出来る(楽に組める)って事

>「JavaとC++のパフォーマンスを比較する(1/5):CodeZine」

---------------------
C++の基礎には、やはりCがあり、
他の言語ではなく、Cで設計するのが良さそうなプログラムにおいて、
その内容が大規模になるなどの理由から、制作や保守に
手間暇が掛かりそうな場合には、
Cではなく、C++を使えば良さそうだ、という風に理解しました。

C++ですと、オブジェクト指向的に、
より楽に(Cと比べて、より楽に)制作、保守管理できるのでしょうね。

GUIのプログラムを組むとなると、また話は違って来そうですが、
とても参考になりました。

投稿日時 - 2011-02-25 16:49:09

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

zwi

>まず、1~5の評価値は、数字が小さいほど、優れているのでしょうか。
>また、言語の難度というのは、習得の難易度ということでしょうか。
>C++が「1」というのは、難しいという意味なんですよね?

解説を書きますね。
---------------------------------
A:パフォーマンス 数値が小さいほど速い。
B:記述の難度 数値が小さいほど難しい。
C:ネット・DBのライブラリ充実 数値が小さいほど充実している
D:実行ファイルの独立性 O独立 X独立していない。
---------------------------------

投稿日時 - 2011-02-26 10:23:42

お礼

解説、ありがとうございます。
これでよく分かりました!

CとC++では、
Cの方が速い傾向がある(より低レベルだからでしょうね)というのが、
新しい発見でした。

項目A、項目Cは、それぞれ、昇順、降順と、規則正しく並んでいるのに対し、
項目Bは、CとC++の所で逆転しているのが印象的でした。

投稿日時 - 2011-02-26 14:27:38

ANo.6

5S6

DBだと、サーバーの回線速度、CPUメモリにもよりますがDB-Serverの種類にも異なります。
メジャーなものでOracle,Sql-Swrverがあります。ほかにIBM-DB2とかフリーのDBもあります。
なのでDBを気にする場合はまたDBで質問した方がいいでしょう。

DBのセキュリティーホールもありますし。
C++はスタックオーバーフローなどの問題があります。
SQLインジェクションを探るには文字列操作が簡単なphpとかのほうが
記述は楽です。C++の場合もMFCとかのライブラリを使えるなら簡単です。

勉強法ですが、はっきりいって普通のC,C++は基本なのですがおもしろくありません。
printf("hoge = %d\n",sa);
などの練習しても私はおもしろく感じません。
改行すら"\n"とやらないとできませんし。
画面に円を描くというプログラムも面倒です。
右側をクリックしたら"右"と出すだけでも苦労します。APIを使う必要もあります。

Cを勉強すると難関?なポインタです。
・・・目に見えないものなので理解したところでおもしろくないですよ。
http://kmaebashi.com/programmer/pointer.html
これを理解できると高速なプログラムが作れるようになります。

C,C++の場合ファイル処理とかも命令によって大きく処理速度が変わります。
100倍以上違う場合もあります。

変な例かもしれませんが単語を調べるとき
・人間が紙の辞書を使う
・ネットでググる
・携帯で調べる。
ではスピードが全然違いますよね。効率も。
ネットでググるのと、携帯で調べるのはどっちが速いのか?
電源ONにしてから起動するのはWindowsのほうが時間かかる。
いっぽう携帯の場合は文字の入力がキーボードに比べて遅くなります。
パケット代(コスト)も気にしなくてはいけません。
便利なのは携帯だけど、多くの単語を調べるならパソコンです。

本屋で買った紙でできた辞書は、そのページにある前後の単語が人間の目に入ります。
これはあいまい検索のときに有利です。
よく名前覚えてないんだけど、確かこんな名前じゃなかったっけ?
とかいう場合は辞書のほうが役立つ場合もあります。
↑これをプログラムで書くのは難しいんです。
0と1の世界はコンピューター得意なんですけどね。
このようなプログラムは圧倒的にC++のほうが高速に作れます。
動画のエンコードソフトとかはアルゴリズム次第で処理速度が全然違います。
画像を表示するならjava,phpはファイル名を指定してやればあとは簡単に
やってくれますがC++は標準ではやってくれません。(MFCとかは別)
ファイルを読む、正しい形式かどうか判断、メモリに転送、VRAM(画像用メモリ)に転送・・・
エラー処理も同様です。
面倒だけど、やり方次第で超高速になります。
インテルの最新命令も使うことによりより高速化できます。
だけどその分不便なんです。

投稿日時 - 2011-02-26 09:34:29

お礼

色々とありがとうございます。

私の作ろうとしているものが、
CやC++で速くなるかは、
もう、やってみるまで分からない!
そんな風に思えてきました。苦笑

また、やってみるにしても、
そのやり方次第では、速くも遅くもなるでしょうから、
目的を達するまでには、かなりの手間暇を要すのだろうと思います。

ということで、
本質問では、
1、CやC++で作ったら速くなることが期待できるかどうか
2、CやC++の勉強法
の2点を柱に質問をさせてもらっていましたが、
「もう、やってみるっきゃない!」という気持ちになりましたので、
1については解決(とりあえず、速くなることを期待する)とし、
あとは2をなんとかしたいなと思っているところです。
で、その2ですが、
今、ふつーの参考書を読んでいるところですが、確かにつまらないですね。笑
これまで、各種の言語習得に、それぞれ最低でも5冊は読んで来ましたから、
今回も同じ道を辿ることになるのでしょう。。。
つまり、王道はない、と。
(良著を選ぶ、ということはできるかもしれませんが。)

ということで、
Cを学習し終えたら、その足で、C++のお尻まで、突っ走ってみようかと思います。苦笑
ただ、C++のお尻に辿り着く頃には、Cの頭を忘れてしまってそう…。^^;

投稿日時 - 2011-02-26 14:24:22

ANo.5

zwi

言語は状況に応じてメリット・デメリットをうまく使うべきです。

私なりの評価を書いておきますので参考にしてください。
---------------------------------
A:パフォーマンス
B:言語の難度
C:ネット・DBのライブラリ充実
D:実行ファイルの独立性
---------------------------------
言語 A B C D 依存環境
---------------------------------
C  1 2?3 O 使用するライブラリによる。
C++ 2 1 2 O 使用するライブラリによる。
C#  3 3 1 X .Net FrameWork
Java 4 3 1 X JavaVM
PHP 5 4 1 X PHP.exe
---------------------------------
等幅のメモ帳などにコピペしてください。

投稿日時 - 2011-02-26 01:00:33

お礼

評価リストまで書いて下さり、本当にありがとうございます。

ただ、ちょっと見方について質問させて下さい。

まず、1~5の評価値は、数字が小さいほど、優れているのでしょうか。

また、言語の難度というのは、習得の難易度ということでしょうか。
C++が「1」というのは、難しいという意味なんですよね?

で、項目Cでは、数値が小さいほど、これは、充実して、、、いる?いない?
ちょっと分かりませんでした。すみません。

投稿日時 - 2011-02-26 01:25:26

ANo.4

zwi

なんか大事なことが伝わっていないみたいなので補足します。
C/C++で高速化するのは、大抵はCPUとメモリ内で完結する事に限ります。
つまり、USB、ファイル、データベース、LAN、インターネットが絡んでくる場合はスクリプト言語で組んでも大差はありません。

例えば、ブラウザを作るとしてインターフェイス部分や通信部分はJavaやC#などを作ったほうが圧倒的に作り易くメンテナンス性も高いでしょう。
でもHTMLを解析・表示するレンダリングエンジンは、やはりC/C++で組まないと速い動作は期待できません。
つまり、CPU使用率が高い部分はC/C++が有利です。
それとC++で抽象化性の高い記述をすると、たぶんJavaとそう大差ない速度まで落ちると思います。特にC#だと負けるかも。

投稿日時 - 2011-02-25 18:50:49

お礼

補足をありがとうございます。

>C/C++で高速化するのは、大抵はCPUとメモリ内で完結する事に限ります

>USB、ファイル、データベース、LAN、インターネットが絡んでくる場合はスクリプト言語で組んでも大差はありません

こちら、非常に参考になりました。
ありがとうございます。
PHPではなくC。
というより、Java!という選択肢も見えてきました。
もっとも、PHPとJavaの処理速度に大して違いがなさそうなら、
PHPのままで良いのでしょうが。

投稿日時 - 2011-02-25 21:08:13

ANo.2

>C++にできて、Cにできないこと

これは非常に簡単な質問。
Qtなどの有名なGUIライブラリはC++しかできない。
GUIをCでやろうとするとWindowsAPIを使用したやり方しかなく、一般的ではない。

投稿日時 - 2011-02-25 11:14:44

お礼

回答有り難うございます。

>GUIをCでやろうとするとWindowsAPIを使用したやり方しかなく、一般的ではない。

こちら、大変参考になりました。
ありがとうございます!

投稿日時 - 2011-02-25 16:50:26

ANo.1

5S6

コンソールアプリケーションでなければ実際
cとc++の違いはありません。
Classが使えるかどうかもありますけどね。

処理速度はご指摘の通りかなり違います。
昔仕事で作ったSGML解析ソフトはVBで3日(70時間弱)ほどかかった処理が
C++にして、コンパイラを最適化したら5秒程度まで短縮しました。

メモリを直接操作できるので圧倒的なパフォーマンスを誇ります。
最近はCPUも速くなってきたのでよほどの処理をするものでないと体感速度はわかりません。
ベンチマークで高得点をだしたところで体感速度はわかりません。

Windowsであれば3Dゲームや画像、動画処理などでは大きな違いを発揮します。

より高速化を規模するならアセンブラがあります。
処理速度はC++よりさらに圧倒的な速さを誇ります。
暗号作成、解読プログラムとかではあればCPU内部キッシュに収まってしまうようなサイズですし。
非常に小さな実行ファイルができます。
またEXEである必要もないのでIPLを作ったりもできます。


C,C++のデメリットは変数を初期化しなくてはいけない。
strcpyなどでスタックオーバーフロー、セキュリティーホールにつながります。
だからVBやdelphiほか宣言した時点で初期化してくれて、このような心配のない言語が
はやっています。でも遅いです。
プログラムで初期化を宣言しなくても、コンパイラがそのような処理を書いています。
つまり無駄なコードが多いのです。
あとエラー処理が面倒だと言うことでしょうか。



C++のメリットはjavaのようにプラットフォームを選ばない。
Linux,Mac,携帯電話,DOSでもOKというところと制限がないところでしょうか。
メモリやハードウェアを直接制御できるので、プリンタドライバ、携帯電話とのやりとりを
するプログラム、ネットワークプログラム、ウイルスを作るのに適しています。
WindowsAPIもWindowsに制限されるので作りにくいですね。
たとえば'ABC'と入力したとき画面に"ABC"と表示されるのは
そういうプログラムが動いているからです。
本来はなにも表示されませんし、"DEF"と表示させたり(中身は"ABC")することもできます。





DESの暗号プログラムです。
マルチコア対応させれば、さらに高速な暗号/復号ができますよ。
http://efgh.com/software/desc.txt



参考までに各言語の処理速度比較です。
http://ivystar.jp/programming/%E5%90%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E3%81%AE%E5%87%A6%E7%90%86%E9%80%9F%E5%BA%A6%E6%AF%94%E8%BC%83%E8%A1%A8/


どんなものを作りたいか?がはっきりしないとC++は面倒なので不便ですよ。
処理速度が100倍、1000倍以上あってもつまらないプログラムであれば違いはわかりません。

投稿日時 - 2011-02-25 11:04:14

お礼

多少、まだ私には難しい所もありましたが、
とても参考になる回答だと感じました。
ということで、いくつか気になった点を書かせて頂きます。

>昔仕事で作ったSGML解析ソフトはVBで3日(70時間弱)ほどかかった処理が
>C++にして、コンパイラを最適化したら5秒程度まで短縮

まさに、こういうことをC/C++には期待しています。

データ数5000件ほどのデータベースに対し、
更新作業を頻繁に行うようなプログラムの制作も検討しているのですが、
PHPに比べ、CやC++で実装した方が速くなりそうでしょうか。
ウェブ上からデータを引っ張ってきて、それを加工し、DBへインサート。
という流れですが、
データを引っ張ってくる際の処理時間は回線速度に大きく依存しそう?なので、
この部分では、PHPもCも関係ないのかなぁ、と思っていたりします。
で、その次のステップの「加工」ですが、ここでは真価を発揮しそうですね。
そして、最後のDBへのインサートですが、
この辺りについては私には検討がつきませんでした。
データの書き込み速度については、
ハードウェア(HDD、メモリ、CPU)、およびSQLを最適化することで得られる速度アップに比べれば、
プログラムで改善できる速度アップなど、たかがしれているのかもしれない云々…

>C,C++のデメリットは変数を初期化しなくてはいけない

この辺りは、まだ私には難しかったです。
つまり、メモリ管理?が繁雑といった感じでしょうか。

>C++のメリットはjavaのようにプラットフォームを選ばない

こちらは、
「C,C++のメリットは~」
と読み替えても良いでしょうか。

>Linux,Mac,携帯電話,DOSでもOKというところと制限がないところでしょうか。
>メモリやハードウェアを直接制御できる

プログラミング言語のまさに王様的な存在ですね。
大変魅力的に映ります。

また、勉強法についてですが、
Cをある程度使いこなせるようになってから、
C++の学習を始めるべきか、
一気に、C++の文法まで頭に入れた上で、Cの知識を踏まえつつ、
初めからC++で組めるものはC++で組んでいきながら、
理解を深めていくべきなのか、
この辺りのこともご助言頂けると嬉しいです。
まとまりのない文章で恐縮ですが、宜しくお願いします。

投稿日時 - 2011-02-25 17:18:06

あなたにオススメの質問