おまいらがワイにC++を1から教えるスレ

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/12/02(水) 07:55:19.15ID:u3DezFu7
全くのプログラム初心者のワイにC++を1から教えてちょんまげ
2020/12/02(水) 11:47:45.27ID:do1WpnXz
クソスレ立てるキチガイには教えません
2020/12/02(水) 13:08:26.42ID:BhIPzhZM
まずはパンツを脱ぎます
2020/12/02(水) 13:09:27.88ID:O0xkT2c9
首を左に90度曲げて、c++を見る。

ちょんまげ。
2020/12/02(水) 17:05:34.64ID:LINF+1vv
(u_・y)1日でプログラミング出来るようになる(キリッ)って人達がよくPHPスレ等にいるから聞いてくると良いぞ
2020/12/02(水) 17:21:32.22ID:6jV30dAb
ワイって書いてあってプログラミングというと
何かJavaScriptやっててでも嫁と娘の方がよく書けるイメージ
2020/12/02(水) 19:13:14.50ID:PTC/KGjG
全くの初心者が C++ ってのはやめたほうがいいんじゃなかろうか。
いいとこ C# ぐらいからとか。
2020/12/03(木) 00:55:42.95ID:zTFDF79p
C++/CLIから始めましょう
2020/12/03(木) 11:51:15.10ID:AYPEYoq4
C++について5年間無心に瞑想していると
突然天啓が降りてきて全てを理解する
これが一番の早道
2020/12/03(木) 13:41:30.40ID:qwumn+PG
>>8
止めといたほうが身のため
2020/12/03(木) 16:23:56.88ID:XxeqeIdP
a

これは小文字のエー。

A

これは大文字のエー。

アルファベットの最初の文字だよ。
2020/12/03(木) 16:25:02.95ID:XxeqeIdP
b

これは小文字のビー。

B

これは大文字のビー。

ビーはアルファベットの二番目の文字だよ。
2020/12/03(木) 16:30:56.37ID:XxeqeIdP
c

これは小文字のシー。

C

これは大文字のシー。

シーはアルファベットの三番目の文字だよ。
2020/12/03(木) 16:37:40.74ID:JrbU6AmL
...(中略)...

z

これは小文字のゼット。

Z

これは大文字のゼット。

ゼットはアルファベットの二十六番目の文字だよ。
2020/12/03(木) 16:40:39.87ID:JrbU6AmL
!

これは感嘆符。びっくりしたときや、叫ぶときに使う。C++では否定を意味する。

?

これは疑問符。質問のときに使う。
2020/12/03(木) 16:44:13.07ID:XxeqeIdP
#

これは、シャープ。ハッシュとか、ナンバーともいう。

*

これはアスタリスク。掛け算のときに使う。

キーボードでこうした記号を入力したい場合は、Shiftキーを押したまま、別のキーを押さなければならない。
2020/12/03(木) 19:03:31.14ID:XxeqeIdP
半角と全角の違いについて。

#$53abf

これは半角文字。

#$53abf

これは全角文字。全角の方が半角より幅が広い。プログラミングでは半角文字を主に使う。
2020/12/03(木) 19:11:31.52ID:XxeqeIdP
拡張子とはファイル名の最後に付く、ドットで始まる、ファイルの種類を表す文字列。

例えば.txtはテキストファイルを表す拡張子。.cはC言語のソースファイルを表す拡張子。.cppはC++のソースファイルを表す拡張子。

ウィンドウズで拡張子を隠す設定になってる場合は、拡張子を常に表示するように設定して下さい。

では、C言語プログラムのソースを書いてみよう。

メモ帳を開いて。

#include <stdio.h>
int main(){
printf("hello, world\n");
}

これをhello.cという名前で保存。拡張子が.c.txtになった場合は.c に変更して。
2020/12/03(木) 19:15:23.46ID:XxeqeIdP
<

これは不等号の「大なり」。

>

これは不等号の「小なり」。

"

これは二重引用符。

{ }

これは波カッコ。

( )

これは丸カッコ。
2020/12/03(木) 19:18:45.46ID:XxeqeIdP
\

これは半角の円記号。バックスラッシュともいう。

/

これはスラッシュ。

.

これはドット。終止符とか、ピリオドともいう。

,

これはカンマ。区切りに使う。

:

これはコロン。

;

これはセミコロン。
2020/12/03(木) 19:30:41.49ID:XxeqeIdP
全角と半角の違い、コンマとドットの違い、コロンとセミコロンの違いがわからないと、プログラマーにはなれぬぞ。

ソースプログラムを動かすには、コンパイラというプログラムでコンパイルして、実行可能なファイルに変換する必要がある。コンパイラを用意しないとコンパイルできない。

コンパイラのインストール方法やコンパイル方法がわからない場合は、オンラインコンパイラの ideone.com を使えば、コンパイラをインストールしなくてもコンパイル・実行できる。

https://ideone.com

最初のうちは ideone で試してみよう。
2020/12/03(木) 19:36:12.89ID:XxeqeIdP
ideoneの使い方。

1. 右下のボックスから言語(C++)を選ぶ。
2. ソースを隠すor貼り付ける。
3. Runボタンを押す。

かんたん、簡単。
2020/12/03(木) 19:39:37.73ID:XxeqeIdP
>>22

訂正。
右下→左下
隠す→書く
2020/12/03(木) 19:49:34.17ID:XxeqeIdP
続きを読むには、「ワッフルワッフル」と書き込んで下さい。
2020/12/06(日) 07:29:04.61ID:9Dsm0Weg
なにわともあれ、先ずtemplateと入力してから考えよう。
2020/12/07(月) 21:37:47.54ID:IvEQCqk0
まず2000万円用意します
2020/12/19(土) 12:25:26.61ID:j5nTXDk0
ワッフルワッフル
2020/12/19(土) 14:19:31.26ID:AdgNEvZP
ideoneで次のC/C++プログラムを実行してみよう。

#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 10; ++i) {
printf("i: %d\n", i);
}
}

このプログラムはforループとループ変数iを使ってprintfによる標準出力に対する出力を十回繰り返す。コンピューターは繰り返し処理が得意である。
int i;は、整数(integer)型の変数iを宣言して、iという変数を使えるようにしている。
波カッコ{ }で囲まれた部分のことをブロックという。
変数は宣言されたブロックの内部でしか使えない。変数の使える範囲をスコープという。
2020/12/19(土) 14:29:46.14ID:/5LHU1jG
i = 0;
これは変数iに対するゼロの代入である。
i < 10
これはiと10を比較している。iが10より小さいと1になり、以下ならばゼロになる。
++i
これはiを1増やすという意味であり、1増やすことをインクリメントという。

printf関数は標準出力に書式付き文字列を出力する関数である。
関数というのは0個以上のパラメータ(引数)をカンマ区切りで指定して呼び出せる機能的な処理の単位である。
C/C++にはたくさんの関数が用意されている。標準で用意されている関数のことを標準関数と呼ぶ。
標準関数の使い方は、リファレンスマニュアルに書いてある。
2020/12/19(土) 14:38:48.95ID:/5LHU1jG
まずは、printf標準関数の使い方をリファレンスで確認しよう。

(日本語)
https://ja.cppreference.com/w/cpp/io/c/fprintf

(英語)
https://en.cppreference.com/w/cpp/io/c/fprintf

初めのうちは理解できないかもしれないが、さっと目を通してもらいたい。
2020/12/19(土) 14:50:34.47ID:/5LHU1jG
リファレンスはここにある:

https://ja.cppreference.com

リファレンスを完全に理解すればおそらくC/C++の達人になれる。まずは「C言語リファレンス」の「言語」から順番に読み進めるとよいだろう。
2020/12/19(土) 14:58:13.77ID:/5LHU1jG
オプションというのは、追加的な選択肢のことで、あってもなくてもいいものである。

戻り値とは関数の実行結果を返すためのものである。
例えば
int n;
n = printf("abc");
とすれば、nがprintf("abc")の"abc"の文字数3となる。
2020/12/19(土) 15:30:02.52ID:/5LHU1jG
では、Windowsをお使いであれば、MSYS2をインストールしよう。

...(中略)...

次にC言語ソースファイルhello.cを作成し、gcc -o hello hello.cを実行すればgccコンパイラがhello.exeを生成する。
C++では拡張子を.cppにしてg++コンパイラでコンパイルする: g++ -o hello hello.cpp

./helloを実行すると
Hello, world
と表示される。./は現在位置のフォルダ(ディレクトリ)を意味する(Bashなどではセキュリティのために必要だが、コマンドプロンプトでは必要ない)。
2020/12/19(土) 15:59:21.66ID:/5LHU1jG
pure C/C++では、ボタンやウィンドウなどのGUI(graphical user interface)は作れない。標準C/C++ではGUIが用意されてないからである。

C/C++でGUIを作るにはC++/Tcl、Win32API、MFC、WTL、GTK、wxWidgets、Qtなどを選び、言語とは別に学習する必要がある。

しかし、GUIの学習は難易度が高く、どれでもいい訳ではない。GUIの特徴を調べて自分に合ったものを選ぶ必要がある。
2020/12/19(土) 18:36:05.93ID:/5LHU1jG
続きを読むには、「ワッフルワッフル」と書き込んで下さい。
2020/12/19(土) 19:23:29.77ID:Sj3ZjFN+
ワッフルワッフルワ
2020/12/19(土) 20:28:41.45ID:AdgNEvZP
(1)
https://sehermitage.web.fc2.com/devel/win_msys2.html
に従ってMSYS2とgccとg++とmakeとcmakeとgitをインストールして下さい。
(2)
$ gcc --version
$ g++ --version
$ make --version
$ cmake --version
$ git --version
を順番に実行して正しくインストールされているか確認して下さい。
2020/12/19(土) 20:40:28.92ID:AdgNEvZP
(3) プロジェクト「hello-cpp」
(3.1) 次のような内容のソースファイル「hello-cpp.cpp」を作成する。
#include <cstdio>
int main(void)
{
printf("Hello, C++!\n");
}
(3.2) 次のような内容のテキストファイル「CMakeLists.txt」を作成する。
cmake_minimum_required(VERSION 3.0)
project(hello-cpp CXX)
add_executable(hello-cpp hello-cpp.cpp)
(3.3) MSYS2で
$ cmake -G "MSYS Makefiles" .
$ make -j3
を実行する。成功すればhello-cpp.exeができる。
(3.4) $ ./hello-cpp.exeを実行すると「Hello, C++!」と表示される。

ここまでのソース:https://github.com/katahiromz/hello-cpp
2020/12/19(土) 20:48:45.69ID:AdgNEvZP
(4) C++/Win32でハローワールド。
(4.1) MSYS2上で
$ git clone https://github.com/katahiromz/HelloWin32
を実行する。現在の位置にHelloWin32フォルダができる。
(4.2) $ cd HelloWin32を実行してフォルダの中に入る。
(4.3) ビルドする。
$ cmake -G "MSYS Makefiles" .
$ make -j3
buildフォルダの中にHelloWin32.exeができる。
(4.4) build/HelloWin32.exeをダブルクリックして動作を確認する。
2020/12/19(土) 20:53:23.93ID:AdgNEvZP
(5) プロジェクトHelloWin32のダイアログを編集する。
(5.1) HelloWin32のリソースファイル「HelloWin32_res.rc」をリソーエディタで
開いてダイアログを編集し、同名で保存する。
例えばボタンの位置を移動させたり、サイズを変更したりする。

リソーエディタ
https://katahiromz.web.fc2.com/re/ja/
(5.2) $ make -j3を実行してリビルドする。新しいbuild/HelloWin32.exeができる。
(5.3) HelloWin32.exeをダブルクリックして前回と比較する。
2020/12/19(土) 21:03:34.66ID:AdgNEvZP
(6) HelloWin32の解説(その1)。
(6.1) HelloWin32.cppのLoadStringDx関数は、LoadString API関数を使用して
STRINGTABLEリソースから文字列を読み込む関数である。
(6.2) DialogProcは、ダイアログのふるまいを決定づけるダイアログプロシージャと
呼ばれる関数であり、後述のDialogBoxWで使用する。
(6.3) OnInitDialog関数はダイアログの初期化を行うもので、
ダイアログにWM_INITDIALOGメッセージが来たときに呼び出される。
(6.4) OnCommand関数は、WM_COMMANDメッセージが来たときに呼び出される。
これは何らかのイベント(ボタンを押すなど)に対して、何かのコマンドを実行する関数である。
(6.5) WinMain関数は、Win32アプリで最初に呼び出される関数である。
(6.6) DialogBoxWはDialogBox関数のUnicode版であり、DialogBox API関数は
DIALOGリソースを元にしてモーダルなダイアログを表示するのに使う。
(6.7) MessageBoxWはMessageBox関数のUnicode版であり、メッセージボックスを表示するのに使う。
2020/12/19(土) 21:12:44.44ID:AdgNEvZP
(7) HelloWin32の解説(その2)。
(7.1) DialogProcのHANDLE_MSGはメッセージの処理を行うためのマクロである。
HANDLE_MSGを使うには<windowsx.h>が必要。
(7.2) MsgCrackというプログラムを使えばOnInitDialogやOnCommandなどのプロトタイプを
簡単に入力できる。

MsgCrack
https://katahiromz.web.fc2.com/msgcrack/ja/
(7.3) lang/ja_JP.rcをテキストエディタで開けばDIALOGリソースやSTRINGTABLEリソースが確認できる。

テキストエディタの「サクラエディタ」
https://sakura-editor.github.io/
(7.4) CMakeLists.txtはcmakeによるビルド方法を指示するファイルである。
MSYS2ではcmakeはMakefileを作成し、makeコマンドがMakefileを元に
実際にビルドする。
(7.5) .gitignoreはバージョン管理システムのGitに無視したいファイルやフォルダを指示するファイルである。
2020/12/19(土) 21:19:37.31ID:AdgNEvZP
(8) メッセージボックスだけの単純なWin32プログラムMsgBoxを作成する。
(8.1) MsgBoxというフォルダを作成する。
(8.2) 次のような内容でMsgBox.cppという名前のファイルを作成する。
#include <windows.h>
int main(void) {
MessageBoxA(NULL, "This is a Windows application", "Info", 0);
}
(8.3) 次のような内容のCMakeLists.txtを作成する。
cmake_minimum_required(VERSION 3.0)
project(MsgBox CXX)
add_executable(MsgBox MsgBox.cpp)

(8.4)
$ cmake -G "MSYS Makefiles" .
$ make
を順番に実行して、MsgBox.exeをビルドする。
(8.5) MSYS2で./MsgBox.exeを実行して動作を確認する。
2020/12/19(土) 21:23:16.13ID:SjgWLpk6
でも何で拡張子.cppでCなん?
それとシープラプラの書式ならCと違ってmainの引数にvoidは書かんよ
2020/12/19(土) 21:30:37.30ID:AdgNEvZP
(9) MsgBoxを少し改変する。
(9.1) 「int main(void)」をINT WINAPI
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
に変更する(MsgCrackで「WinMain」を検索すること)。
WinMainのブロックの最後に「return 0;」を追加する。
(9.2) CMakeLists.txtの「add_executable(MsgBox MsgBox.cpp)」を
「add_executable(MsgBox WIN32 MsgBox.cpp)」に変更する(WIN32を追加する)。
(9.3) add_executableの前に
「set(CMAKE_EXE_LINKER_FLAGS "-static")」を追記する。
これでダブルクリックで実行できる。
(9.4) $ make を実行すると、新しいMsgBox.exeができる。
(9.5) このMsgBox.exeをダブルクリックして実行しても黒い画面は出ない。
ダブルクリックすると、最初に例の黒い画面が出るアプリのことを「コンソールアプリ」と呼び、
黒い画面が出ないアプリのことを「Windowsアプリ」と呼ぶ。
2020/12/19(土) 21:44:52.15ID:AdgNEvZP
>>44 ほんとだね。C++では引数void必要ないね。C言語でも省略可能だし。
2020/12/19(土) 22:06:18.46ID:/5LHU1jG
定番のWin32学習サイト。

・MSDN
・EternalWindows
・猫でもできるプログラミング
・WisdomSoft(旧)

参考にしてね。
2020/12/19(土) 22:37:48.42ID:addgFCLw
めんどくさーい
2020/12/26(土) 04:56:17.90ID:MmCRaN+2
まずはラムダ式から教えようかな
2020/12/26(土) 05:14:20.66ID:IS/9s11k
ラムダ式があると何が便利かも書いて欲しい。
2020/12/27(日) 00:00:27.09ID:3O0UlW8w
この業界の権威にでもなりたいんでなければC++は開発ブランチだと思って美味しいとこだけcherry-pickした言語使った方がいいと思うよ。
2020/12/27(日) 00:48:15.94ID:JCBOGJxb
>>51
例えば?
2020/12/27(日) 12:32:57.26ID:VwRLyYFg
ワッフルワッフル
2020/12/27(日) 14:30:54.32ID:3O0UlW8w
>>52
Javaが筆頭やね
2020/12/27(日) 15:19:37.66ID:Xx+NlMtq
>>53
どこまでできた?
2020/12/27(日) 15:46:21.74ID:u2IOFb+r
>>51
最近のC++ってC#などから取り入れてる機能も多いだろ
2020/12/27(日) 17:47:43.17ID:3O0UlW8w
>>56
老いては子に教えられ、だね
2021/01/02(土) 18:40:40.10ID:89HkmNsX
>>54
Javaはねーわ
死にゆく言語筆頭じゃん
2021/01/03(日) 20:21:52.71ID:bRO3e+JV
Javaに限定してないが
2021/01/04(月) 04:06:06.18ID:vXy+uC1b
>>59
屁理屈言うなよ
2021/01/04(月) 09:13:24.81ID:v1M5xjgk
>>60
つまりJavaに続くクラスベースの他の言語もいずれ死にゆくからC++以外は学ばなくても良いと言いたいのか?
2021/01/04(月) 11:46:38.28ID:OpGFyjtN
死にゆくのが目に見えてる言語勧めるくらいならそうだろうな
で、Java以外にC++からcherry-pickした死の見えてる言語あるの?
2021/01/04(月) 19:44:51.64ID:RRkyDjZk
ちゃんとリファレンスも示したし、コンパイルのしかたも書いた。自分で学習して、他にもわからないことがあれば質問してね。
64デフォルトの名無しさん
垢版 |
2021/01/04(月) 20:38:52.91ID:wIiDK2+4
Javaの何が凄かったかって、文法がLALR(1)に収まってるんだよな。
文法を作ったことがあれば、天才にしか無理なことがわかるだろう。
そう、奴は本物の天才だ。
誰が作ったのか知らんけど。
65デフォルトの名無しさん
垢版 |
2021/01/04(月) 21:17:14.33ID:wIiDK2+4
割り切りもすごいよな。
プリミティブはコピー渡し、それ以外は参照渡し。
たしかにそれは良い考えだと思うけど、スパッと割り切ったのが凄いな。
我々がその立場なら同じことが出来ただろうか?

まあしかし、C++と比べるものではないよな。
対象領域が被ってるので比べたくなるが、狙いが違うので、綺麗に住み分けが出来ると思う。
2021/01/05(火) 00:51:36.88ID:BHDE7fBu
配置newはどんな時に使うの?
2021/01/05(火) 01:35:28.72ID:tS+yAQzd
>>64
メリットとしては
1. コンパイラがスッキリかける
2. コンパイラを動かすときのメモリが少なくて済む
3. コンパイラの実行速度が速い
が挙げられるけど
実行時のメリットはなんかあるの?
2021/01/05(火) 08:26:22.14ID:3Qznmkzr
>>66
std::vectorなどのコンテナの実装で使うよ。
2021/01/05(火) 12:00:55.46ID:BHDE7fBu
>>68
allocatorでメモリ確保して配置newで初期化?
2021/01/05(火) 16:39:04.88ID:A4RAMnFV
>>69
libc++のソース見ればわかるよ。
2021/01/05(火) 17:07:18.70ID:A4RAMnFV
char buf[sizeof(std::string)];
std::string *pstr = new(buf) std::string;
*pstr = "test";
std::puts(pstr->c_str());
pstr->~basic_string();

汚いコードだね。
2021/01/05(火) 18:13:27.15ID:Nygh6omE
何らかの連続したメモリーブロックを指すポインタがあって、そこをコンストラクタで初期化するときに使うんでないかい?
2021/01/06(水) 00:02:56.17ID:2hpPqzu4
ゲームエンジンの本によく書いてある、タスクシステムとかだろ

例えば、弾100個分のメモリを、事前にキープしておくとか。
1個ずつ確保すると、メモリの断片化が起こるから
2021/01/10(日) 23:10:15.53ID:AxUCQbZG
>>19
大なりと小なり逆だぞ
2021/01/11(月) 00:11:32.57ID:eNWdcNvL
これは恥ずかしい
2021/01/14(木) 16:10:21.69ID:t4C1HzYM
そうでもない
2021/01/14(木) 16:20:55.01ID:D3V1bvbS
足すと引く間違えてるようなもの
2021/01/15(金) 00:27:45.68ID:kCwrH4rk
だいな
2021/01/15(金) 00:29:11.34ID:kCwrH4rk
みっく
2021/01/15(金) 00:56:24.72ID:wdDcsVvR
ディスィザペーン
なんだバカヤロー
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況