diff --git a/004-debug-compile-error.md b/004-debug-compile-error.md index e53b4dc..a7c4f02 100644 --- a/004-debug-compile-error.md +++ b/004-debug-compile-error.md @@ -295,7 +295,7 @@ main.cpp:7:40: error: expected ‘;’ before ‘)’ token これに当てはめると、問題はソースファイル`main.cpp`の7行目の40列目にある。 -エラーメッセージは、「`';'`か`')'`がトークンの前にあるべき」だ。 +エラーメッセージは、「`';'`がトークン`')'`の前にあるべき」だ。 トークン(token)というのは`'std'`とか`'::'`とか`'cout'`といったソースファイルの空白文字で区切られた最小の文字列の単位のことだ。 diff --git a/025-array-iterator.md b/025-array-iterator.md index 7ae415d..63effbf 100644 --- a/025-array-iterator.md +++ b/025-array-iterator.md @@ -423,10 +423,10 @@ struct array return array_iterator( *this, 0 ) ; } - // 末尾要素へのイテレーター + // 最後の次の要素へのイテレーター iterator end() { - return array_iterator( *this, N-1 ) ; + return array_iterator( *this, N ) ; } } ; ~~~ @@ -1043,13 +1043,13 @@ struct array const_iterator begin() const { return const_iterator(*this, 0) ; } const_iterator end() const - { return const_iterator(*this, N-1) ; } + { return const_iterator(*this, N) ; } // 常にconst_iteratorを返す const_iterator cbegin() const { return const_iterator(*this, 0) ; } const_iterator cend() const - { return const_iterator(*this, N-1) ; } + { return const_iterator(*this, N) ; } // その他のメンバー } ; diff --git a/033-vector-implementation.md b/033-vector-implementation.md index d15bafd..8a30b28 100644 --- a/033-vector-implementation.md +++ b/033-vector-implementation.md @@ -132,13 +132,13 @@ int main() // 構築 std::string * s = new(p) std::string("hello") ; // 明示的なデストラクター呼び出し - s->basic_string() ; + s->~basic_string() ; // メモリー解放 a.deallocate( p, 1 ) ; } ~~~ -このように書くのはとても面倒だ。特に`std::string`の明示的なデストラクター呼び出し`s->basic_string`が面倒だ。なぜ`s->string`ではだめなのか。 +このように書くのはとても面倒だ。特に`std::string`の明示的なデストラクター呼び出し`s->~basic_string`が面倒だ。なぜ`s->~string`ではだめなのか。 実は`std::string`は以下のようなクラステンプレートになっている。 diff --git a/043-random.md b/043-random.md index 130cd4e..6b23ccc 100644 --- a/043-random.md +++ b/043-random.md @@ -647,7 +647,7 @@ void f( Engine & e ) } ~~~ -浮動小数点数の難しいところは、整数と違って値の範囲の状態が多いことだ。例えば`0.0`と`1.0`の間には`0.5`もあるし、`0.01`もあるし`0.001`もある。浮動小数点数の実装が表現できる状態はとても多い。。`uniform_real_distribution`は指定された値の範囲で浮動小数点数が表現できるすべての値のうちから乱数を生成してくれる。そのため読者は難しいことを考える必要はない。 +浮動小数点数の難しいところは、整数と違って値の範囲の状態が多いことだ。例えば`0.0`と`1.0`の間には`0.5`もあるし、`0.01`もあるし`0.001`もある。浮動小数点数の実装が表現できる状態はとても多い。`uniform_real_distribution`は指定された値の範囲で浮動小数点数が表現できるすべての値のうちから乱数を生成してくれる。そのため読者は難しいことを考える必要はない。 ## ベルヌーイ分布(Bernoulli distributions) @@ -847,7 +847,7 @@ int main() } ~~~ -100回コイントスとした結果、表が出た回数を乱数で得る関数`coinflips100`は以下のように書ける。 +100回コイントスをした結果、表が出た回数を乱数で得る関数`coinflips100`は以下のように書ける。 ~~~cpp template < typename Engine > @@ -880,7 +880,7 @@ int main() 期待値は50なので、50前後の乱数が出やすい。 -6面ダイスを60回振った結果出た1の目の合計を乱数で返す関数`'roll_for_one'`は以下のようになる。 +6面ダイスを60回振った結果出た1の目の合計を乱数で返す関数`roll_for_one`は以下のようになる。 ~~~cpp template < typename Engine > @@ -1105,7 +1105,7 @@ auto count_n_coinflips( unsigned int n, Engine & e ) } ~~~ -6面ダイスを10回、1の目が出るまで振った回数を乱数で返す関数`"count_10_rolls"`は以下のとおり。 +6面ダイスを10回、1の目が出るまで振った回数を乱数で返す関数`count_10_rolls`は以下のとおり。 ~~~cpp template < typename Engine > @@ -1116,7 +1116,7 @@ auto count_10_rolls( Engine & e ) } ~~~ -確率1%のくじを10回当てるまでくじを引いた回数を返す関数`count_10_lootbox`は以下のとおり。 +確率1%のくじを10回当てるまでくじを引いた回数を返す関数`count_10_lootboxes`は以下のとおり。 ~~~cpp template < typename Engine > diff --git a/046-random-part4.md b/046-random-part4.md index 0538e73..5dae42b 100644 --- a/046-random-part4.md +++ b/046-random-part4.md @@ -188,7 +188,7 @@ int roll_dice( Engine & e ) #### 数学的な説明 -`std::piecewise_constant_distribution`は浮動小数点数型の乱数$x$, $b_0 \leq x < b_n$を以下の確率密度関数に従って、それぞれの部分区間(subinterval)$[b_i, b_{i+1}$の間で一様に分布させる。 +`std::piecewise_constant_distribution`は浮動小数点数型の乱数$x$, $b_0 \leq x < b_n$を以下の確率密度関数に従って、それぞれの部分区間(subinterval)$[b_i, b_{i+1})$の間で一様に分布させる。 $$ p(x \,|\, b_0, \dotsc, b_n, \; \rho_0, \dotsc, \rho_{n-1}) = \rho_i @@ -290,7 +290,7 @@ int main() } ~~~ -この場合、区間は`[1.0, 2.0)`, `[2.0, 3.0)`, '[3.0, 4.0)', '[4.0, 5.0)'の4個になり、確率は`{1.5, 2.5, 3.5, 4.5}`となる。 +この場合、区間は`[1.0, 2.0)`, `[2.0, 3.0)`, `[3.0, 4.0)`, `[4.0, 5.0)`の4個になり、確率は`{1.5, 2.5, 3.5, 4.5}`となる。 ##### 区間数、最小、最大、関数オブジェクトによる指定 @@ -338,7 +338,7 @@ public : } ; ~~~ -`intervals`は区間、densitiesは確率を返す。 +`intervals`は区間、`densities`は確率を返す。 ~~~cpp int main() @@ -367,7 +367,7 @@ int main() 区分線形分布における確率は、区間に対してではなく、内部境界に対して指定する。指定した全区間における値の出現確率は、内部境界から内部境界に向かって指定した確率の差の方向に線形に増加、もしくは減少する。 -例えば区分`{0.0, 1.0}`と確率`{1.0, 2.0}`を指定した場合、これはひとつの区間`[0.0, 1.0)`について、内部境界`0.0`の確率は$\frac{1}{3}$、内部境界`1.0'の確率は`\frac{2}{3}`とし、$0.0 \leq x < 1.0$の範囲の乱数`x`を生成する。内部境界区間の範囲に注意。`1.0`未満なので。`1.0`は出ない。 +例えば区分`{0.0, 1.0}`と確率`{1.0, 2.0}`を指定した場合、これはひとつの区間`[0.0, 1.0)`について、内部境界`0.0`の確率は$\frac{1}{3}$、内部境界`1.0`の確率は`\frac{2}{3}`とし、$0.0 \leq x < 1.0$の範囲の乱数`x`を生成する。内部境界区間の範囲に注意。`1.0`未満なので、`1.0`は出ない。 そして、区間の間の値は、区間を区切る2つの内部境界の確率の差によって、線形に増加、もしくは減少する。例えば値`0.25`が出る確率は$\frac{1.25}{3}$、`0.5`が出る確率は$\frac{1.5}{3}$、値`1.75`がでる確率は$\frac{1.75}{3}$だ。 @@ -422,9 +422,9 @@ piecewise_linear_distribution( InputIteratorW firstW ); ~~~ -`[firstB, lastB)`は区間、`firstW`から区間数までのイテレーターが確立。 +`[firstB, lastB)`は区間、`firstW`から区間数までのイテレーターが確率。 -`firstB == lastB`もしくは`+firstB == lastB`の場合、つまり内部境界が1個以下で、空の場合、区間数はひとつで`[0.0, 1.0)`の範囲、確率は`{0.0, 1.0}`となる。 +`firstB == lastB`もしくは`++firstB == lastB`の場合、つまり内部境界が1個以下で、空の場合、区間数はひとつで`[0.0, 1.0)`の範囲、確率は`{0.0, 1.0}`となる。 ##### 使い方 diff --git a/200-cpp.md b/200-cpp.md index 27fde82..fa5fe65 100644 --- a/200-cpp.md +++ b/200-cpp.md @@ -493,7 +493,7 @@ FOO ### プリプロセッサーの定数式 -プリプロセッサーで使える条件式は、C++の条件式とは比べてだいぶ制限がある。基本的には整数定数式で、`true`, `false`が使えるほか、`123`, `1+1`, `1 == 1`, `1 < 1`のような式も使える。ただし、識別子はすべてマクロ名として置換できるものは置換され、置換できない識別子は、`true`, `false`以外はキーワードも含めてすべて`0`に置換される。 +プリプロセッサーで使える条件式は、C++の条件式と比べてだいぶ制限がある。基本的には整数定数式で、`true`, `false`が使えるほか、`123`, `1+1`, `1 == 1`, `1 < 1`のような式も使える。ただし、識別子はすべてマクロ名として置換できるものは置換され、置換できない識別子は、`true`, `false`以外はキーワードも含めてすべて`0`に置換される。 したがって、プリプロセッサーで以下のように書くと、 diff --git a/300-multiple-source-files.md b/300-multiple-source-files.md index fe612a0..ac46feb 100644 --- a/300-multiple-source-files.md +++ b/300-multiple-source-files.md @@ -14,7 +14,7 @@ C++のソースファイルをコンパイルして実行可能ファイルを `source.cpp`という名前のソースファイルがあるとき、ここから`program`という名前の実行可能ファイルを作るには、 ~~~ -$ g++ -o program source.file +$ g++ -o program source.cpp ~~~ としていた。毎回このコマンドを入力するのは面倒なので、`Makefile`を以下のように書いていた。 @@ -283,7 +283,7 @@ void f( double ) { } 名前は使う前に宣言が必要だが、肝心の定義は別のソースファイルに書いてある。宣言と定義を間違えてしまった場合はエラーになる。 ~~~cpp -// print_int.hpp +// print_int.cpp // 失敗状態を返す bool print_int( int x ) { @@ -404,7 +404,7 @@ void print_int( int x ) void print_int( int x ) ; // library.cpp -std::string delimiter ; +std::string delimiter{"\n"} ; void print_int( int x ) { std::cout << x << delimiter ; } @@ -492,7 +492,7 @@ ODRの例外的な回避の怖いところは、間違えてしまってもコ ~~~c++ // 宣言 -strut Foo ; +struct Foo ; // 定義 struct Foo @@ -615,7 +615,7 @@ struct S } ; ~~~ -`static`メンバー関数はクラスのオブジェクトには依存していない。そのため、クラスのオブジェクトなしで呼び出すことができる +`static`メンバー関数はクラスのオブジェクトには依存していない。そのため、クラスのオブジェクトなしで呼び出すことができる。 ~~~cpp struct S diff --git a/400-gdb.md b/400-gdb.md index 3c14b9b..f913ec3 100644 --- a/400-gdb.md +++ b/400-gdb.md @@ -60,7 +60,7 @@ int main() $ g++ -g program.cpp -o program ~~~ -GDBを使ってプログラムのデバッグを始めるには、GDBのオプションとして`"-g"`オプション付きでコンパイルしたプログラムのファイル名を指定する。 +GDBを使ってプログラムのデバッグを始めるには、GDBのオプションとして`-g`オプション付きでコンパイルしたプログラムのファイル名を指定する。 ~~~ $ gdb program @@ -102,13 +102,13 @@ Reading symbols from program...done. (gdb) help ~~~ -ヘルプメッセージが表示される。あるコマンドのヘルプを見たい場合は`"help コマンド"`と入力する。いまから使う予定のコマンドである`"list"`のヘルプを見てみよう。 +ヘルプメッセージが表示される。あるコマンドのヘルプを見たい場合は`help コマンド`と入力する。いまから使う予定のコマンドである`list`のヘルプを見てみよう。 ~~~ (gdb) help list ~~~ -`"list"`コマンドは現在のソースファイルの前後10行を表示する。 +`list`コマンドは現在のソースファイルの前後10行を表示する。 ~~~ (gdb) list @@ -123,7 +123,7 @@ Reading symbols from program...done. 9 } ~~~ -さっそく実行してみよう。実行するコマンドは`"run"`だ。 +さっそく実行してみよう。実行するコマンドは`run`だ。 ~~~ (gdb) run @@ -131,15 +131,15 @@ Starting program: 実行可能ファイルへのパス [Inferior 1 (process PID) exited normally] ~~~ -`"run"`コマンドを使うとデバッガーはプログラムを実行する。 +`run`コマンドを使うとデバッガーはプログラムを実行する。 -プログラムの実行を特定の場所で止めるには`"break"`コマンドを使ってブレイクポイントを設定する。 +プログラムの実行を特定の場所で止めるには`break`コマンドを使ってブレイクポイントを設定する。 ~~~ (gdb) help break ~~~ -`"break"`コマンドには関数や行番号を指定できる。 +`break`コマンドには関数や行番号を指定できる。 ~~~ (gdb) break main @@ -159,7 +159,7 @@ Breakpoint 1, main () at main.cpp:3 `main`関数にブレイクポイントを設定したので、プログラムは`main`関数が呼ばれたところ、最初のコードである3行目を実行する手前で止まる。 -プログラムの実行を再開するには`"continue"`コマンドを使う。 +プログラムの実行を再開するには`continue`コマンドを使う。 ~~~ (gdb) continue @@ -171,7 +171,7 @@ Breakpoint 2, main () at main.cpp:4 4行目にブレイクポイントを設定したので、4行目を実行する手前で止まる。 -この時点で、変数`val`が初期化され、その値は0になっているはずだ。確かめてみよう。変数の値を調べるには`"print"`コマンドを使う。 +この時点で、変数`val`が初期化され、その値は0になっているはずだ。確かめてみよう。変数の値を調べるには`print`コマンドを使う。 ~~~ (gdb) print val @@ -188,14 +188,14 @@ Breakpoint 3, main () at main.cpp:5 5 val += 1 ; ~~~ -4行目を実行し、5行目のブレイクポイントで止まる。4行目を実行したということは、変数`'val'`の値は`10`になっているはずだ。もう一度`"print"`コマンドで調べてみよう。 +4行目を実行し、5行目のブレイクポイントで止まる。4行目を実行したということは、変数`val`の値は`10`になっているはずだ。もう一度`print`コマンドで調べてみよう。 ~~~ (gdb) print val $2 = 10 ~~~ -値は`10`だ。GDBは`print`の結果の履歴を記録している。`$1`や`$2`というのはその記録を参照するための名前だ。その値は`"print"`コマンドで確認できる +値は`10`だ。GDBは`print`の結果の履歴を記録している。`$1`や`$2`というのはその記録を参照するための名前だ。その値は`print`コマンドで確認できる ~~~ (gdb) print $1 @@ -204,9 +204,9 @@ $3 = 0 $4 = 10 ~~~ -現在、プログラムは5行目を実行する手前で止まっている。このまま`"continue"`コマンドを使うとプログラムの終了まで実行されてしまう。もう一度1行だけ実行するには`"break 6"`で6行目にブレイクポイントを設定すればよいのだが、次の1行だけ実行したいときにいちいちブレイクポイントを設定するのは面倒だ。 +現在、プログラムは5行目を実行する手前で止まっている。このまま`continue`コマンドを使うとプログラムの終了まで実行されてしまう。もう一度1行だけ実行するには`break 6`で6行目にブレイクポイントを設定すればよいのだが、次の1行だけ実行したいときにいちいちブレイクポイントを設定するのは面倒だ。 -そこで使うのが`"step"`だ。次の5行目を実行すると、変数`val`の値は`11`になっているはずだ。 +そこで使うのが`step`だ。次の5行目を実行すると、変数`val`の値は`11`になっているはずだ。 ~~~ (gdb) step @@ -221,7 +221,7 @@ GDBの基本的な使い方を覚えたので、これから詳細な使い方 ## プログラムの実行 -GDBでプログラムをデバッグするには、GDBの起動時にプログラムのオプションとしてプログラムのファイル名を指定する。プログラムのファイル名が`"program"`の場合、以下のようにする。 +GDBでプログラムをデバッグするには、GDBの起動時にプログラムのオプションとしてプログラムのファイル名を指定する。プログラムのファイル名が`program`の場合、以下のようにする。 ~~~ $ ls @@ -229,13 +229,13 @@ program $ gdb program ~~~ -起動したGDBでプログラムを実行するには、`"run"`コマンドを使う。 +起動したGDBでプログラムを実行するには、`run`コマンドを使う。 ~~~ (gdb) run ~~~ -このとき、プログラムにオプションを指定したい場合は`"run"`に続けて記述する。例えばプログラムの標準出力を`"out.txt"`にリダイレクトしたいときは以下のようにする。 +このとき、プログラムにオプションを指定したい場合は`run`に続けて記述する。例えばプログラムの標準出力を`out.txt`にリダイレクトしたいときは以下のようにする。 ~~~ (gdb) run > out.txt @@ -247,9 +247,9 @@ $ gdb program ### ブレイクポイント -コマンド`"break"`はブレイクポイントを設定する。プログラムの実行がブレイクポイントに達した場合、GDBはブレイクポイントの直前でプログラムの実行を中断する。 +コマンド`break`はブレイクポイントを設定する。プログラムの実行がブレイクポイントに達した場合、GDBはブレイクポイントの直前でプログラムの実行を中断する。 -ブレイクポイントを設定する場所は`"break"`コマンドへの引数で指定する。省略して`"b"`だけでもよい。 +ブレイクポイントを設定する場所は`break`コマンドへの引数で指定する。省略して`b`だけでもよい。 ~~~ (gdb) break 場所 @@ -272,7 +272,7 @@ $ gdb program (gdb) break ファイル名:行番号 ~~~ -と書く。例えば`"foo.cpp"`の8行目にブレイクポイントを仕掛ける場合は、 +と書く。例えば`foo.cpp`の8行目にブレイクポイントを仕掛ける場合は、 ~~~ (gdb) break foo.cpp:8 @@ -282,7 +282,7 @@ $ gdb program #### ブレイクポイントの確認 -設定したブレイクポイントの一覧は、`"info breakpoints"`コマンドで確認できる。 +設定したブレイクポイントの一覧は、`info breakpoints`コマンドで確認できる。 ~~~ (gdb) break 5 @@ -298,7 +298,7 @@ Num Type Disp Enb Address What 3 breakpoint keep y 0x000000000000115b in main() at main.cpp:7 ~~~ -これは5,6,7行目にそれぞれブレイクポイントを設定したあとの`"info breakpoints"`の結果だ。 +これは5,6,7行目にそれぞれブレイクポイントを設定したあとの`info breakpoints`の結果だ。 この表の意味は、左から番号(Num, Number)、種類(Type)、中断後の処理(Disposition), 有効/無効(Enb, Enable/Disable)、アドレス(Address), 内容(What)となっている。 @@ -314,7 +314,7 @@ Num Type Disp Enb Address What #### ブレイクポイントの削除 -ブレイクポイントを削除するには`"delete"`コマンドを使う。削除するブレイクポイントは番号で指定する。 +ブレイクポイントを削除するには`delete`コマンドを使う。削除するブレイクポイントは番号で指定する。 ~~~ (gdb) delete 1 @@ -333,13 +333,13 @@ No breakpoints or watchpoints. ブレイクポイントは有効/無効を切り替えることができる。 -ブレイクポイントを無効化するには`"disable"`コマンドを使う。 +ブレイクポイントを無効化するには`disable`コマンドを使う。 ~~~ (gdb) disable 1 ~~~ -ブレイクポイントを有効化するには`"enable"`コマンドを使う。 +ブレイクポイントを有効化するには`enable`コマンドを使う。 ~~~ (gdb) enable 1 @@ -347,7 +347,7 @@ No breakpoints or watchpoints. ブレイクポイントは発動したあとに自動で無効化させることができる。 -`"enable [breakpoints] once"`コマンドで、ブレイクポイントが一度発動すると自動的に無効化されるブレイクポイントを設定できる。 +`enable [breakpoints] once`コマンドで、ブレイクポイントが一度発動すると自動的に無効化されるブレイクポイントを設定できる。 ~~~ (gdb) enable 1 once @@ -355,7 +355,7 @@ No breakpoints or watchpoints. このコマンドは、ブレイクポイント番号1が一度発動したら自動的に無効化する設定をする。 -ブレイクポイントは$n$回発動したあとに自動的に無効化することもできる。そのためのコマンドは`"enable [breakpoints] count n"`だ。 +ブレイクポイントは$n$回発動したあとに自動的に無効化することもできる。そのためのコマンドは`enable [breakpoints] count n`だ。 ~~~ (gdb) enable 1 count 10 @@ -401,7 +401,7 @@ int main() このようなプログラムで関数`f`にブレイクポイントを設定すると、`f`という名前の関数すべてにブレイクポイントが設定される。 -ブレイクポイントの一覧を表示する`"info breakpoints"`コマンドで確かめてみよう。 +ブレイクポイントの一覧を表示する`info breakpoints`コマンドで確かめてみよう。 ~~~ (gdb) break f @@ -686,7 +686,7 @@ int main() #1 0x0000555555556310 in main () at main.cpp:10 ~~~ -`#0`がバックトレースの最も深い現在のスタックフレームだ。これは関数`f`でソースファイル`main.cpp`の2行目だ。`#1`が`"#0`の上のスタックフレームで、これは関数`main`で10行目にある。 +`#0`がバックトレースの最も深い現在のスタックフレームだ。これは関数`f`でソースファイル`main.cpp`の2行目だ。`#1`が`#0`の上のスタックフレームで、これは関数`main`で10行目にある。 実行を再開して、次の関数`f`のバックトレースを見よう。 @@ -795,7 +795,7 @@ int main() { } (gdb) print hello() ~~~ -なんと関数`hello`が呼び出され、標準出力に`"hello"`と出力されるではないか。 +なんと関数`hello`が呼び出され、標準出力に`hello`と出力されるではないか。 `print`コマンドの式のもたらす副作用には注意しよう。