- ベストアンサー
C++かCの再選択
いつもお世話になっています。 c++の初心者ですが、煮詰まったので質問させてもらいます。 私はC++の入門書を理解し2~3個のコンソールプログラムを作った位のレベルです。煮詰まったのは、このままC++を勉強するかそれともCを勉強した方がいいのか迷っています。Cは知らないのでC++入門書を勉強した時、Cを勉強しているのと一緒なのですか(軽くSTL、オブジェクト志向の考え方を追加した感じ) Cのほうが文法、メモリの動きなどサンプルプログラム を作るにもクラスをつくる手間が省け簡単に書けますし 早く習得できると思うのですが。気になったのは ここの書き込みで、Cの拡張がC++とCとはC++ は異言語の意見があり、私にはわかりません。 ただ「C++がわかっていてCを知らない人はいない」との意見に納得した事もあり私の選択は間違っていた のかなと思ったのです。できればC->C++経験者と いきなりC++経験者のアドバイスが聞きたいのです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>職業にするならという事でしょうか。 いえ、もし時間的制約がなければC++を選択するべきです。 現状では、オブジェクト指向を学ぶのならJavaですし、メモリなど計算機を知るためにはCなので、C++は学習目的ではあまりオススメしません。 しかし、C or C++ということだと、オブジェクト指向をまったく考慮していないCでは不十分なので、C++を選択するほうをオススメしています。 >短期的に実用レベルに達したいと思っているので、Cでしょうか。 Cの方が良いと思います。C++は短期で習得できるほど簡単ではありません。ただ、STLなど、便利なもののみを使うという選択はアリなので、C+-という気持ちでC++を学ぶのは悪くないと思います。 #C+-としてでも、関数途中での変数宣言とか割と便利な事が多いです。 >ただメモリ内の動きまではわかっていない段階です メモリの様子が全く分からないのであればCをきちんと学習した方がよいです。C++でももちろんメモリを想像することはできるのですが、非常に難しいですし、そのような解説をする書籍もあまりありませんので。
その他の回答 (5)
- matyrcry
- ベストアンサー率47% (101/213)
なんだかVC++かボーランドCかっていうツールの選 択の話みたいに見えるんですが。 PCベースのソフト屋さんは、既存のライブラリの使い 回しがメインになるんで、そのあたりで有利なツールを 選択するんでは? ROM容量が足りないマイコンの世界だと標準関数を入 れる余裕もないので機能削った関数を自作します。 こっちの世界ではC++の機能は資源を浪費しすぎて選 択の余地がないですよ。 小数意見っぽいですが、そういう話もあるってことで。
お礼
回答ありがとうございます。 また違った角度からのアドバイスですね。 Cをやろうと思います。また本屋にいかなくてはなりません 。
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
まずは、何がしたいか、って所でしょうか? Cが得意とする所、C++が得意とする所、全く持って違います。 形は似ていても、名前は似ていても、全く違う言語です。 あくまでも簡単にいいますが Cは、単純処理系をしっかりと記述するのに向いています。 (コンソールアプリ、サーバー等) C++は、複雑な処理を容易に記述するのに向いています。 (Windowsアプリ等) そして、Cはやろうと思えば標準ライブラリを一切使用せずに完全にくみ上げることもできます。 (例:ゲーム専用機(メーカーライブラリは使うが)、qmail http://qmail.jp/ 等) まず、C++を覚えるにしろ、Cは最初に覚えるべきです。 Cの本当の基本を抑えた後に、C++を勉強するといいでしょう。 WindowsはC++で組むのが前提ですので、いきなりWindowsアプリであれば、C++を覚える必要がありますが・・・ 最後に・・・C と C++ で、MS-DOSで 「Hello world」 と表示するプログラムを組んだときのことです。 Cだと、1000バイト程度(やろうと思えば100バイト以下になりますが) しかし、C++だと、いきなり、50kにもなってしまいました。
お礼
回答ありがとうございました。 ymdaさんもCを最初に覚えるべきですね。 いきなりC++から勉強している人はあまりいないのでしょうか?。もしかして私は無謀な事をしていたのでしょうか? 怖いです。 >Cの本当の基本を抑えた後に、C++を勉強するといいでしょう。 そうします。
- nyan5504
- ベストアンサー率42% (6/14)
現状で、Javaなどが選択肢になく、CとC++のどちらかということであれば、間違いなくC++を選択するべきです。 ただし、習得が簡単なのは当然Cですので、短期的に実用レベルに達したいなどの場合にはCの方が良いでしょう。 またどうやってもC++を理解できない人がたまにいらっしゃいます。そのような人はCを選ぶしかありませんが、これはC++を学んでみないと何とも言えないので結局はC++を始めた方がいいです。 C++の学習の方法として、Cの部分から始めるか、C++とCを合わせて学ぶかという二通りの道があります。これは両者一長一短で、その人に合わせて選ぶものですので、一概には判断できません。
お礼
回答ありがとうございます!。 >現状で、Javaなどが選択肢になく、CとC++のどちらかということであれば、間違いなくC++を選択するべきです。 職業にするならという事でしょうか。 >習得が簡単なのは当然Cですので、短期的に実用レベルに達したいなどの場合にはCの方が良いでしょう。 短期的に実用レベルに達したいと思っているので、Cでしょうか。 >C++の学習の方法として、Cの部分から始めるか、C++とCを合わせて学ぶかという二通りの道があります。これは両者一長一短で、その人に合わせて選ぶものですので、一概には判断できません。 初心者向けのC++の本を理解した所なので、文法的には わかります。ただメモリ内の動きまではわかっていない 段階です、Cのプログラマーとしての資質もわかりません ので、Cを勉強してみたほうがいいのでしょうか。
- togino
- ベストアンサー率75% (97/129)
私は C 言語から C++ 言語に移行したタイプです。 理由は簡単。C++ 言語の方が上位だからです。 「Cの拡張がC++」これは定義からしても正しいです。 「CとC++は異言語」これも正しいです。同じ言語なら同じ名前がつきます。 C 言語と同じ文法体系を踏襲し、新しい機能を追加して拡張した言語が C++ 言語なのですから。 あまりよい例えではないですが、 「数ある動物の中で、私とあなたは同じ人間ですが違う人間です」という感じで、ある側面で見ると同じですが、別の側面から見ると違うものでしょう。そんな感じ。 で、学習の順番となりますが、まず C 言語を知らずして C++ 言語を扱うことは不可能です。 C++ 言語は、C 言語ととってかわる代物ではありません。 C++ 言語から C 言語の部分を差し引いた ++ の部分だけで、プログラムは書けないです。(^^;) よって tomojyuu さんが今 C 言語の勉強になるのは当然だと思います。 そして、このまま C 言語にどっぷり浸かっていくのか、それとも C++ 言語に踏み込むのか、という決断になる訳ですよね。 それは、あなたが 「オブジェクト指向の必要性、STL の便利さ」を感じるか感じないのか、ここが宗教論争の起源になる訳ですが、この点にかかってきます。 「クラスを作らなくてもプログラムは作れる」も正論ですし 「クラスを作った方がプログラムの拡張性・保守性において優れる」も正論です。 後者においては、業務用や規模が大きくなれば 「クラスを作らないとプログラムは作れない」が正論でしょう。 あなたは、この2点が共に正論になる点をどう思われます? ■ クラスを作らなくてもプログラムは作れる ■ クラスを作らないとプログラムは作れない 私は、この点に関して、こういう結論をもっています。 「『なんのプログラムを作るのか?』に依存する」というわけです。 ありきたりに言えばケースバイケースな訳です。 クラスをつくるのは手間ですし、習得には時間がかかるでしょう。しかし、そこにどっぷり浸かってしまうとクラスを作ることが出来なくなってしまい、そのクラスの必要性・重要性すらも感じなくなってしまうでしょう。 そして、規模の大きめなプログラムを書く必要が生じた時、C++ を勉強する段になって、そのめんどくささに(クラスをつくらない手軽さに慣れすぎ)破綻をきたした人が「初めから C++ をしとけばよかった」となる訳です。 C++ 言語が生まれたのは、やはりその必要性があったからです。しかし、それがなくても C 言語ですばらしいプログラム・ソフトが生まれてきたのも事実です。いわゆる UNIX なんか、あの OS すべてを C 言語で書き上げて、かつメンテしてる訳ですから、それだけの力が C 言語にはあるのです。 tomojyuu さんがなんの為にプログラムを勉強されているのか分かりませんが(←でもこれが一番重要だったりするのですが(^^;)) 変数の型(intなど)・構造体(struct)・ポインタ(int* や &)・メモリ管理(malloc,free) などの C 言語の習得をまず最優先させ、それが使えるようになった段階で クラス(class)・メモリ管理(new,delete)・テンプレート(template)・イテレーター(iterator) の C++ 言語の習得をはかった方がよいと思います。 後半になればなるほど、必ずしも必要とはいえない概念(かつ難しい)が多くなりますので、必要と思えないうちは分からなければ、「そんなんがあるんだ~」程度におさえておけばいいと思います。 そして、Java 言語や BASIC 言語、Perl 言語、Ruby 言語と幅を広げられた方が、 C/C++ 言語の理解がより一層深まるものと思います。 結論ですが、「ぐだぐた言わないで勉強してみること!分からなければ、飛ばして次に進む」 ある一線を越えると、プログラム言語が結局すべて同じものであるように思え、かつ違うものと認識して使い分かることができるようになりますよ。 長くなってすみませんでしたが、参考にして頂ければ幸いです。 int n = 3; cout << n << endl; と int n = 3; print("%d\n", n); の違い・・・本質的に大きく違うが結果は一緒。 cout は不要といえば不要だが、必要な場合もある。 とりあえず使ってみて、面倒・不要と思えば使わなければよい。ただ世の中にはそれが必要な場面があるから存在していることをお忘れなく。
お礼
長文の回答ありがとうございます。 「Cの拡張がC++」「CとC++は異言語」どちらも正しいのですか、わかりました。 >tomojyuu さんがなんの為にプログラムを勉強されているのか分かりませんが(←でもこれが一番重要だったりするのですが(^^;)) 職業にしたいと思っています。なので、習得に差が あまり無ければC++を覚えたいのです。 私がイメージできる回答で助かりました。 >クラスをつくるのは手間ですし、習得には時間がかかるでしょう。しかし、そこにどっぷり浸かってしまうと クラスを作ることが出来なくなってしまい、そのクラスの必要性・重要性すらも感じなくなってしまうでしょう。 怖い事です。それを怖がるあまり、Cに移行できないのです。 >int n = 3; cout << n << endl; と int n = 3; print("%d\n", n); 微妙に入出力命令違いますよね。C++のほうが簡単でわかりやすいですよね、C++には文字列関数STRING、便利ですよね。 >結論ですが、「ぐだぐた言わないで勉強してみること!分からなければ、飛ばして次に進む」 簡単なコンソールプログラムを作っているのですが、テンプレートをいれようとか、クラスはこうして...など勉強した事を使おうと思うあまり、悩んでしまうのです。クラスは使わず、C++の良い部分(入出力関係、STL、)だけを使うのは邪道なんでしょうか?。
- mitoneko
- ベストアンサー率58% (469/798)
難しい問題ですね。(宗教論争になりそうです。これやりはじめると。) まず、文法的には、CはC++のサブセットです。したがって、Cの拡張がC++という言い方は、言語の定義的には正しいです。 これをもう少し進めると、C++をすべて知っているということは、文法的には、Cの文法もすべて知っているはずです。Cは、C++の一部分ですから。というわで、純粋に文法的な話なら、C++で作成ができるなら、Cでも組めるはずでしょうが・・・ 問題は、C++で便利に使えるようになった、オブジェクト指向の考え方です。 「プログラムを書くのにクラスを作る手間が省けるから、Cの方が楽・・・」なら、何のために、クラスが使えるようになったのでしょうね?そんなのいらないじゃないの。というのが本題に近いでしょう。 プログラミングのパラダイムの話ですが、少々掘り起こしてみましょうか。 手続き重視のプログラムの考え方では、プログラムを作成するというのは、手順を考えるということでした。その為にまず作れといわれたのが、フローチャートという図面です。 しかし、プログラムがだんだん大規模になると、プログラムの主人公は、実は、データの構造とそれを操作するための一連の手続きではないか?という考え方が出てきました。単純にいってしまえば、これがオブジェクト指向の考え方です。 たとえば、伝票を入力して、この伝票の合計をレポートに出力するプログラムを考えます。 手続き重視でものを考えると、まず、伝票の入力ルーチン、集計ルーチン、レポートの作成ルーチン、そして、伝票のデータを保存・読み出しするための関数群・・・といった具合に、ものを考えます。これが、CをCらしく組んだ場合の手法です。 これに対して、オブジェクト思考的には、まず、伝票というデータ構造・レポートというデータ構造・データ保存のためのファイル・・・と言ったものがあるという風に考えます。そして、ファイル構造は、「伝票を入力として受け取り、保存する」、「レポートは、必要なデータをファイルから受け取る」といった具合に、これらのデータ構造に対して、どんな操作を加えるのかということを中心にプログラム全体を構成していきます。 だいぶん、駆け足で書いてますが、まぁ、大筋こんなところです。 「オブジェクト指向のプログラムは、Cではかけないか?」といえば、実は、書けます。ちゃんと、プログラマーが注意して、そのように構成すれば、かけるんです・・・が、C++の新しい構文を利用すれば、より簡単に書けます。C++がCに付け加えた部分は、ここにあります。 そして、プログラムを組むためのパラダイムが変わると、プログラムの構造が根本的に変わります。C++の文法も使ったCのプログラム・C++らしいC++のプログラム・・・といったあたりの差は、ここに起因します。この意味でいうと、CとC++はまったくの異言語でしょう。設計のスタートの考え方が違いますから、まぁ、見かけが大幅に変わるのは無理ない話です。 さて・・・それでは、学習ですが・・・ オブジェクト指向の考え方も、実は、その前の構造化プログラミングを土台に構築されています。突然ぽっと出てきたまったくの異文化というわけではないのです。 しかし、どうせ、オブジェクト指向のパラダイムを学んでいけば、必然的に構造化プログラミング以前のパラダイムも吸収できますから、これも、C/C++の関係と同じかもしれません。 結論としては、今の小さなプログラムを組んで、プログラムというものを学習し始めている段階であれば、CでもC++でもどちらでもいいです。C++だから、クラスを作らなければならないと考える必要はまったくありませんし、オブジェクト指向でなければ既存のクラスライブラリを使ってはいけないというわけでもありません。よって、便利であれば、STLもどんどんつかえば良いでしょう。 ただ、ある程度、大きなプログラムを組もうとすれば、必然的に、全体を細分化しないと、わかりやすい・綺麗なプログラムは組めません。その辺は意識しておいた方がよいでしょう。 そして、だんだんと、実用的なプログラムを組めるようになってきた頃、もう一度、オブジェクト指向の本を読んでみてください。このとき、クラスを作成するというのが、手続きを分けるために関数を作るのと同じ事なんだということが判れば、C++の拡張の本来の意味がわかると思います。 そして、それが、冒頭の「何のために、クラスが使えるようになったのでしょうね?」という問いへの答えになります。
お礼
長文の回答ありがとうございます!。 >結論としては、今の小さなプログラムを組んで、プログラムというものを学習し始めている段階であれば、CでもC++でもどちらでもいいです。C++だから、クラスを作らなければならないと考える必要はまったくありませんし、オブジェクト指向でなければ既存のクラスライブラリを使ってはいけないというわけでもありません。よって、便利であれば、STLもどんどんつかえば良いでしょう。 あくまで現段階では、それでよいのですか?、非常に 楽になりました。実際クラスをつくるのは手間ですし C++を勉強していても実質Cの基本を勉強しているような ものなので、C++の楽な部分のみ勉強すればよいのですね そしてC++に慣れる事が大事なのですね。
補足
たびたびの回答ありがとうございます。 補足質問なのですが、C+-(?)を勉強して、企業では Cプログラマーとして雇用してくれるのでしょうか? C+-プログラマーとしては無理ですよね?