質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

Q&A

解決済

4回答

3124閲覧

C++の勉強について

TOC

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

2グッド

1クリップ

投稿2016/02/19 05:38

C言語についての質問です。
プログラミング初心者ですので、アドバイスを頂きたいです。

今後OpenCVやkinectを扱うためにC++を勉強しようと思っているのですが、C++を学ぶ前にC言語を学んだ方が良いという話をよく聞きます。
しかし、CとC++をざっと見ましたが、記述の仕方などあまり似てないようなのでCを学ぶ意味がいまひとつ掴めません。
そこで質問です。
①いきなりC++の勉強をしてよいのでしょうか。(現状Javaでしたら基礎の部分は扱えると思います)
②Cを勉強する場合、どこまで(どこを)理解すればよいのでしょうか。

C言語について色々な情報がありすぎて、今ひとつ整理できていない状態ですので、アドバイス頂けたらと思います。
何卒宜しくお願い致します。

afroscript, yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

C++学習が目的ならば、直接C++入門から始めることをオススメします。
C++言語で出来ること(機能)は非常に多岐にわたるため、あまり最初から気負い過ぎないことも重要かもしれません。

C→C++の順番がダメという事はないのですが、わざわざ遠回りする必要性もありません。昔はその様な学習順が主流だったのかもしれませんが、2016年も同じ方法論をとる必要はないと思います。

基本的にC++とCは別のプログラミング言語です。あくまで共通の祖先をもつ親戚関係であって、C++でしか出来ないこと、Cでしか出来ないこと(実際にはほぼ無いのですが)がそれぞれにあります。言語が違えばよい書き方もまた変わってきますから、CをここまでマスターしたからC++でどうというのは忘れて良いと思います。

投稿2016/02/19 06:07

編集2016/02/19 06:12
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2016/02/19 06:38

> わざわざ遠回りする必要性もありません。昔はその様な学習順が主流だったのかもしれませんが、2016年も同じ方法論をとる必要はないと思います。 うはっ。言われてみればその通りですね。無駄な遠回りは避けるに越したことはないです。特にprintf(), scanf()はスルーしたいところです。 ただ、ポインタは頭痛いかも。C++は参照があるのでいきなり参照を使われると辛いだろうと思います。 私は「速度が問題になる全ての言語(Java, C#等を含む)」でポインタの理解は必須と考えてます。そして、「参照」はポインタの学習をより困難にするように感じます。ポインタの学習が終わるまで参照を持ち出さないC++学習教材があればベストなのですが。
TOC

2016/02/19 07:01

ご回答有難うございます。 他の方の回答と合わせまして、2,3日でC言語の本(特にポインタの辺りを)を一通り読んでからC++に移ろうと思います。 >言語が違えばよい書き方もまた変わってきますから、CをここまでマスターしたからC++でどうというのは忘れて良いと思います。 C言語を学ばなければ、という先入観がありましたが、C言語にあまりこだわらず、C++を勉強しようという気持ちになれました。有難うございました。
yohhoy

2016/02/19 08:30

ポインタ周りも、今や目的別に参照やイレテータやスマートポインタがありますから、(生の)ポインタが必要な場面は減ったと思います。とはいえC++のイレテータやスマートポインタは言語機能ではなく、ライブラリによるサポートなので慣れるまでは使いづらい面はありますね。 ポインタについて理解しておくに越した事はありませんが、避けて学習を進めるというやり方もあるとは思います。(上手くいく保証はできないけど…)
Chironian

2016/02/19 09:33

yohhoyさん。 オブジェクトをやり取りする時、一々コピーしないでやり取りする仕組みを理解するにはポインタの概念(≒アドレス+型)の理解が必須と考えています。 そして、ポインタの概念を理解するために、生のポインタは学習教材として適切と思います。参照と違って何時でもアドレスを設定できますし、間違ったらエラーを出して指摘してくれることが多いですし。
yohhoy

2016/02/19 12:38 編集

Chironianさん 前半には同意です。ただ、質問者(TOCさん)はJavaのバックグラウンドがあるとのことなので、ポインタの概念についてはあまり障壁ではないかなと(勝手に)思いました。 後半については少しスタンスが違います。(生の)ポインタ型という言語機能は、原始的な機構であるがゆえ正しい使い方も誤用もふくめて、何でも"出来てしまい"ます。加えて、コンパイル時や実行時の誤り検出機構も極めて貧弱です。この性質はC/C++特有のものであり、熟練者がいざという時に頼る最終手段としては心強いですが、学習段階では混乱のもとになるため出来れば直接的には関わらない方が良いという立場です。(もちろん、完全に排除はできないのですが…)
Chironian

2016/02/19 12:56

yohhoyさん。 そのような立場もあるのですね。なるほどです。
guest

0

こんにちは。

C++はC言語にオブジェクト指向を追加したイメージに近いので、C→C++というのが一般的な流れです。
しかし、既にJavaでオブジェクト指向を学ばれている場合、なかなか悩ましいかも。
C++はC言語を拡張したものですが、C++を使うのであれば使わない方が良いC言語の記述方法もあります。
主に標準ライブラリ周りです。

ところで、Javaでもポインタの概念を理解していないとハマるケースがありますが、もしかして既にポインタを理解されていますでしょうか?
もし、既に理解されているのであれば、私は直接C++言語を始められても良いのではないかと思います。
まだでしたら、ポインタ、配列へのポインタ、ポインタの配列を理解する部分はC言語で学ばれた方がよいように思います。

投稿2016/02/19 05:44

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TOC

2016/02/19 06:56

ご回答有難うございます。 >私は「速度が問題になる全ての言語(Java, C#等を含む)」でポインタの理解は必須と考えてます。そして、「参照」はポインタの学習をより困難にするように感じます。 ポインタはC言語特有の概念だという話は聞いていたのですが、どのように大事なのか、よくわかっておりませんでした。ですので短期間でC言語の本を一通り読んで(特にポイントの辺りを)からC++に移ろうと思います。その他の方の回答でもありますが、あまりC言語にこだわらず、C++の勉強を始めようと思います。 ご回答有難うございました!
Chironian

2016/02/19 07:33

別の変数を指し示すものがポインタです。 ある場所にある変数を他の関数で使いたい時ってよく有ります。その時、変数の中身ごと全てコピーすれば確実ですね。でも、その度にコピーすると無駄に時間がかかります。その変数へのポインタを渡せば処理時間を節約できますね。また、呼びだされた側の関数でその変数の中身を変更したい場合、中身をコピーしてはいけませんね。この時もその変数へのポインタを渡します。 Javaの場合もクラス型のメンバ変数は実装上ポインタとして保存され、それを「参照」と呼んでます。ですので、単純にコピーすると同じオブジェクトが複数のメンバ変数から「参照」されてしまい、片方で変更するともう一方も一緒に変わってしまいます。同じものですから当たり前なのですが、それが見えにくいので頭痛いです。 この辺は「シャローコピー」や「ディープコピー」の話題で時々解説されてます。 http://www.creative-forest.com/java/java_tips/oop/shallow_deep/shallow_deep.html 常に中身ごとコピーすれば良いのですが、Javaと言えども実行時間は気になるし、多くのケースでポインタのコピーで足るため、処理時間を節約するためポインタのみコピーしているのです。 そして、JavaやC#はポインタと実体の表記が同じなので、直接理解することは難易度がかなり高いと思います。 C++の「参照」もある種のポインタなのですが、ポインタ変数とは結構異なる特性を持ちポインタより理解するのがたいへんです。 C/C++の「ポインタ」は実体とは異なる表記になり、多くのケースで間違うとエラーを出してくれるので比較的学習し易いです。 そして、残念なことにC/C++では配列とポインタについて混乱しやすい表記ができます。例えば、int foo[5];の時、fooと書いたらfoo先頭へのポインタでもあるのですよ。 char* argv[]とか、なかなか頭痛い表記が直ぐに出てきます。ですので、まずはポインタをきちんと理解され、次にポインタの配列や配列へのポインタのC/C++言語での表現方法を学ばれると良いと思います。
TOC

2016/02/19 08:47

ご返信有難うございます。 今この文章を読んでも詰まるところがあるので、やはりC言語のポインタ周りは学習しておくことに意味がありそうですね。 詳しい解説有難うございました。 ポインタについて勉強しつつ、アドバイスいただいた件についても理解を深めようと思います。
guest

0

C++はC言語とは独立した別々の言語というよりは、C言語をベースにして機能を追加したプログラミング言語ですので、C++を学ぶということは必然的にC言語部分を学ぶことも含まれます。

①いきなりC++の勉強をしてよいのでしょうか。(現状Javaでしたら基礎の部分は扱えると思います)

Javaでプログラミングの基礎を学んでいるということであれば、まったく問題ありません。すでにC言語を習得している人にとってはC++の習得難度が下がるということはありますが、C++の前にC言語を学ばないといけないということはありません。

②Cを勉強する場合、どこまで(どこを)理解すればよいのでしょうか。

あえてC++とは別にC言語を学ぶ必要はないと思います。ただし、ポインタ周りはC言語の入門書の方が詳しく解説しているかもしれません。C++はCを丸ごと含んでいるので、C言語コードもそのまま動かせます。

投稿2016/02/19 07:06

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TOC

2016/02/19 07:11

ご回答有難うございます。 >あえてC++とは別にC言語を学ぶ必要はないと思います。ただし、ポインタ周りはC言語の入門書の方が詳しく解説しているかもしれません。C++はCを丸ごと含んでいるので、C言語コードもそのまま動かせます。 ポインタ周りはC言語の方が解説が詳しいようですので、短期間でC言語の本(特にポインタ周り)を読んで、早々にC++の勉強に移ろうと思います。 C言語を学ばなければ、という不安がありましたが、C言語にこだわらず、C++へ移行しようという気持ちになれました。 有難うございました。
guest

0


プログラミング初心者がいきなりC++だとつらいと思いますが、
Javaの基礎ができているのであれば、いきなりC++でも問題ないと思います。


C++とC言語を混ぜて書くことができるので、場合によってはC言語の知識が必要なこともあります。
そのため、C言語で書かれたコードをある程度は読めたほうが良かったりするかも。

...

過去の質問で少し関係のありそうな質問がありましたので、リンクをはっておきます。

C++の必要性(25745)|teratail
https://teratail.com/questions/25745

投稿2016/02/19 06:34

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TOC

2016/02/19 07:06

ご回答有難うございます。 >プログラミング初心者がいきなりC++だとつらいと思いますが、 Javaの基礎ができているのであれば、いきなりC++でも問題ないと思います。 いきなりC++を始めることに不安がありましたが、そこまで気にならなくなりました。他の方の回答にもあるように、やはりC言語も少し見ておいた方が良いようですので、短期間でC言語の本に一通り目を通そうと思います。ただあまりC言語にこだわらず、早めにC++に移ろうと思います。 リンクまで貼っていただき有難うございます。 参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問