diff --git a/000-preface.md b/000-preface.md index b566ad0..b3a8889 100644 --- a/000-preface.md +++ b/000-preface.md @@ -2,10 +2,10 @@ 本書はプログラミングの経験はあるがC++は知らない読者を対象にしたC++を学ぶための本である。本書はすでに学んだことのみを使って次の知識を説明する手法で書かれた。C++コンパイラーをC++で書く場合、C++コンパイラーのソースコードをコンパイルする最初のC++コンパイラーをどうするかというブートストラップ問題がある。本書はいわばC++における知識のブートストラップを目指した本だ。これにより読者は本を先頭から読んでいけば、まだ学んでいない概念が突如として無説明のまま使われて混乱することなく読み進むことができるだろう。 -C++知識のブートストラップを意識した入門書の執筆はなかなかに難しかった。ある機能Xを教えたいが、そのためには機能Yを知っていなければならず、機能Yを理解するためには機能Zの理解が必要といった具合に、C++の機能の依存関係の解決をしなければならなかったからだ。著者自身も苦しい思いをしながらできるだけ今までに説明した知識のみを使って次の知識を教えるように牡蠣進めていった結果、意外な再発見をした。ポインターを教えた後はC++のほとんどの機能を教えることに苦労しなくなったのだ。結局C++では未だにポインターの機能は様々な機能の土台になっているのだろう。 +C++知識のブートストラップを意識した入門書の執筆はなかなかに難しかった。ある機能Xを教えたいが、そのためには機能Yを知っていなければならず、機能Yを理解するためには機能Zの理解が必要といった具合に、C++の機能の依存関係の解決をしなければならなかったからだ。著者自身も苦しい思いをしながらできるだけ今までに説明した知識のみを使って次の知識を教えるように書き進めていった結果、意外な再発見をした。ポインターを教えた後はC++のほとんどの機能を教えることに苦労しなくなったのだ。けっきょくC++ではいまだにポインターの機能はさまざまな機能の土台になっているのだろう。 -本書の執筆時点でC++は現在、C++20の規格制定に向けて大詰めを迎えている。C++20では`#include`に変わるモジュール、軽量な実行媒体であるコルーチン、高級なassert機能としてのコントラクトに加え、とうとうコンセプトが入る。ライブラリとしてもコンセプトを活用したレンジ、span、flat_mapなど様々なライブラリが追加される。その詳細は、次に本を出す機会があるならば江添亮の詳説C++17と似たようなC++20の参考書を書くことになるだろう。C++はまだまだ時代に合わせて進化する言語だ。 +本書の執筆時点でC++は現在、C++20の規格制定に向けて大詰めを迎えている。C++20では`#include`に変わるモジュール、軽量な実行媒体であるコルーチン、高級なassert機能としてのコントラクトに加え、とうとうコンセプトが入る。ライブラリとしてもコンセプトを活用したレンジ、`span`、`flat_map`などさまざまなライブラリが追加される。その詳細は、次に本を出す機会があるならば『江添亮の詳説C++17』と似たようなC++20の参考書を書くことになるだろう。C++はまだまだ時代に合わせて進化する言語だ。 本書の執筆はGitHub上で公開した状態で行われた。 diff --git a/003-guide-to-c++.md b/003-guide-to-c++.md index a8a071c..e07b272 100644 --- a/003-guide-to-c++.md +++ b/003-guide-to-c++.md @@ -186,7 +186,7 @@ int main() `-123`や`0`や`123`といった数値を整数という。`3.14`のような数値を浮動小数点数という。 -数値を扱えるのだから、計算をしてみたいところだ。C++は整数同士の演算子として、四則演算(`+-*/`)や剰余(`%`)をサポートしている +数値を扱えるのだから、計算をしてみたいところだ。C++は整数同士の演算子として、四則演算(`+-*/`)や剰余(`%`)をサポートしている。 ~~~cpp int main() diff --git a/005-the-restaurant-at-the-end-of-the-branch.md b/005-the-restaurant-at-the-end-of-the-branch.md index 56dde43..c6bfbfd 100644 --- a/005-the-restaurant-at-the-end-of-the-branch.md +++ b/005-the-restaurant-at-the-end-of-the-branch.md @@ -22,7 +22,7 @@ int main() } ~~~ -複数の`文`を`{}`で囲むことで、1つの文として扱うことができる。これを`複合文`という +複数の`文`を`{}`で囲むことで、1つの文として扱うことができる。これを`複合文`という。 ~~~cpp int main() @@ -168,7 +168,7 @@ else `条件`が真(`true`)のときは`文1`が実行され、偽(`false`)のときは`文2`が実行される。 -elseの部分は書かなくてもよい。 +`else`の部分は書かなくてもよい。 ~~~c++ if ( 条件 ) diff --git a/008-loop.md b/008-loop.md index f3349cc..52683a7 100644 --- a/008-loop.md +++ b/008-loop.md @@ -663,7 +663,7 @@ loop : 本当に重要で本質的な、繰り返し実行をする部分の2行のコードはまったく変わっていない。それでいて`while(true)`の方が圧倒的に簡単に書ける。 -## 終了条件付きループ +### 終了条件付きループ なるほど、無限ループを書くのに、`goto文`を使うより`while(true)`を使った方がいいことがわかった。ではほかのループの場合でも、`while文`の方が使いやすいだろうか。 diff --git a/009-vector.md b/009-vector.md index 2aef288..3f3aada 100644 --- a/009-vector.md +++ b/009-vector.md @@ -57,7 +57,7 @@ int main() } ~~~ -もちろん、上の`vector`を保持する`vector`も書ける。その場合、`std::vector>>`になる。このvectorを保持する`vector`も当然書けるが省略する。 +もちろん、上の`vector`を保持する`vector`も書ける。その場合、`std::vector>>`になる。この`vector`を保持する`vector`も当然書けるが省略する。 `std::vector`型の変数にはメンバー関数`push_back`を使うことで値を保持できる。 diff --git a/011-integer.md b/011-integer.md index c2aa4a7..d610197 100644 --- a/011-integer.md +++ b/011-integer.md @@ -141,7 +141,7 @@ auto max = 0b11111111 ; 正数だけを表現するならば話は簡単だ。1バイトの整数は0から255までの値を表現できる。これを符号なし整数(unsigned integer)という。 -では負数を表現するにはどうしたらいいだろう。正数と負数を両方扱える整数表現のことを、符号付き正数(signed integer)という。1バイトは256種類の状態しか表現できないので、もし$-1$を表現したい場合、$-1$から254までの値を扱えることになる。 +では負数を表現するにはどうしたらいいだろう。正数と負数を両方扱える整数表現のことを、符号付き整数(signed integer)という。1バイトは256種類の状態しか表現できないので、もし$-1$を表現したい場合、$-1$から254までの値を扱えることになる。 $-1$しか扱えないのでは実用的ではないので、負数と正数を同じ種類ぐらい表現したい。256の半分は128だが、1バイトで表現された整数は$-128$から128までを表現することはできない。0があるからだ。0を含めると、1バイトの整数は最大で$-128$から127までか、$-127$から128までを表現できる。どちらかに偏ってしまう。 diff --git a/014-iterator.md b/014-iterator.md index 00029f2..37593c2 100644 --- a/014-iterator.md +++ b/014-iterator.md @@ -28,7 +28,7 @@ int main() ~~~ -## イテレーターの参照する要素に対する読み書き。 +## イテレーターの参照する要素に対する読み書き イテレーターは`vector`の先頭の要素を指し示している。イテレーターの指し示す要素を参照するには`*`を使う。 diff --git a/015-reference.md b/015-reference.md index 0da1929..e5acccf 100644 --- a/015-reference.md +++ b/015-reference.md @@ -1,7 +1,7 @@ # lvalueリファレンスとconst ポップカルチャーリファレンスというのは流行の要素をさり気なく作品中に取り入れることで、流行作品を知っている読者の笑いを誘う手法である - -- キャプテン・オブビウス ポップカルチャーリファレンスについて + -- キャプテン・オブビウス、ポップカルチャーリファレンスについて ## lvalueリファレンス diff --git a/016-algorithm.md b/016-algorithm.md index 63146a6..e015154 100644 --- a/016-algorithm.md +++ b/016-algorithm.md @@ -969,8 +969,7 @@ int main() } ~~~ - -`result`に代入されるのは関数`op`の戻り値だ。関数`op`は値を1つの引数受け取り値を返す関数だ。 +`result`に代入されるのは関数`op`の戻り値だ。関数`op`は値を1つの引数で受け取り値を返す関数だ。 ## replace diff --git a/018-class.md b/018-class.md index fba33e2..8fab07e 100644 --- a/018-class.md +++ b/018-class.md @@ -221,7 +221,7 @@ int main() } ~~~ -# まとめた変数に関数を提供する +## まとめた変数に関数を提供する 分数を表現するプログラムを書いてみよう。 diff --git a/019-operator-overloading.md b/019-operator-overloading.md index dd4f966..d215d9b 100644 --- a/019-operator-overloading.md +++ b/019-operator-overloading.md @@ -460,7 +460,7 @@ struct person } ; ~~~ -# 自然な演算子 +## 自然な演算子 `int`型は`+-*/`といった演算子を使うことができる。 diff --git a/022-implement-array.md b/022-implement-array.md index 4759916..c9dedeb 100644 --- a/022-implement-array.md +++ b/022-implement-array.md @@ -80,7 +80,7 @@ int a[5] = {1,2,3,4,5} ; double b[3] = {1.0, 2.0, 3.0 } ; ~~~ -配列の要素にアクセスするには`operator []`を使う +配列の要素にアクセスするには`operator []`を使う。 ~~~cpp int main() diff --git a/023-template.md b/023-template.md index 9de10a1..92bc13d 100644 --- a/023-template.md +++ b/023-template.md @@ -183,7 +183,7 @@ T twice( T n ) 通常の関数が値を引数に取ることができるように、テンプレートは型を引数に取ることができる。 -テンプレートは以下のように宣言する +テンプレートは以下のように宣言する。 ~~~c++ template < typename T > diff --git a/025-array-iterator.md b/025-array-iterator.md index 6fcec18..7ae415d 100644 --- a/025-array-iterator.md +++ b/025-array-iterator.md @@ -4,7 +4,7 @@ 自作の`array`をイテレーターに対応させる前に、まず`'std::array'`のイテレーターについてひと通り調べよう。 -イテレーターは`std::begin/std::end`で取得する +イテレーターは`std::begin/std::end`で取得する。 ~~~cpp int main() @@ -712,7 +712,7 @@ i += 3 ; `i += n`はイテレーター`i`を`n`回進める。 -`operator +`もある +`operator +`もある。 ~~~cpp auto j = i + 3 ; @@ -768,7 +768,6 @@ int main() イテレーター`i`の`n`個先の要素を読み書きするのにいちいち`*(i+n)`と書くのは面倒なので、`std::array`や`std::vector`のイテレーターには`operator []`がある。これを使うと`i[n]`と書ける。 ~~~cpp - int main() { std::array a = {1,2,3,4,5} ; @@ -1090,7 +1089,6 @@ int main() これに対応するために、`const_iterator`のコンストラクターは`iterator`から変換するためのコンストラクターも持つ。 ~~~cpp - template < typename Array > struct array_const_iterator { diff --git a/031-iterator-operations.md b/031-iterator-operations.md index 8ec4915..4c10ceb 100644 --- a/031-iterator-operations.md +++ b/031-iterator-operations.md @@ -142,7 +142,7 @@ template < typename RandomAccessIterator > void f( RandomAccessIterator a, RandomAccessIterator b ) { b - a ; // aからbまでの距離 - a - b ; // bからaまでの距離。 + a - b ; // bからaまでの距離 } ~~~ diff --git a/032-memory-allocation.md b/032-memory-allocation.md index 75c4280..30a7290 100644 --- a/032-memory-allocation.md +++ b/032-memory-allocation.md @@ -77,7 +77,7 @@ void * ptr = ::operator new( 5 ) ; ::operator delete ( ptr ) ; ~~~ -## 生のバイト列を基本的な型の値として使う方法。 +## 生のバイト列を基本的な型の値として使う方法 `int`や`double`のような基本的な型は、生のバイト列のポインターを型変換するだけで使える。 diff --git a/035-copy.md b/035-copy.md index da1d42e..e987a42 100644 --- a/035-copy.md +++ b/035-copy.md @@ -460,7 +460,7 @@ int main() } ~~~ -関数の宣言に`=delete`を書くと、その関数を消すことができる。「消す」というのは、その関数を使った時点でプログラムがコンパイルエラーになるという意味だ。 +関数の宣言に`= delete`を書くと、その関数を消すことができる。「消す」というのは、その関数を使った時点でプログラムがコンパイルエラーになるという意味だ。 この問題を解決するにはテンプレートを使う。 diff --git a/036-move.md b/036-move.md index cc9e20c..e64ad44 100644 --- a/036-move.md +++ b/036-move.md @@ -184,7 +184,7 @@ C++の基本型とクラスのデフォルトのムーブの実装は、単な ムーブ後のオブジェクトは使えない状態になるということは、ムーブ後のオブジェクトの値はどうなってもいいということだ。 -`std::vector`のようなクラスは動的メモリー確保をしてポインターでストレージを参照している。自作のvectorにコピーを実装するときは、コピー先でも動的メモリー確保をして要素を1つずつコピーしなければならないことを学んだ。 +`std::vector`のようなクラスは動的メモリー確保をしてポインターでストレージを参照している。自作の`vector`にコピーを実装するときは、コピー先でも動的メモリー確保をして要素を1つずつコピーしなければならないことを学んだ。 とても簡単な、`T`型の配列を確保する`dynamic_array`を考えてみよう。 diff --git a/037-rvalue-reference.md b/037-rvalue-reference.md index f8a126d..9eed3d0 100644 --- a/037-rvalue-reference.md +++ b/037-rvalue-reference.md @@ -168,7 +168,7 @@ int & ref = object ; ### prvalue -`prvalue`は純粋なrvalue(pure rvalue)のことだ。つまり、名前なしのオブジェクトや計算結果の一時オブジェクトのことだ。 +`prvalue`は純粋な`rvalue`(pure rvalue)のことだ。つまり、名前なしのオブジェクトや計算結果の一時オブジェクトのことだ。 ~~~cpp int f() { return 0 ; } @@ -206,7 +206,7 @@ auto result = x + y + z ; `xvalue`となる値は以下のような場合だ。 -+ 戻り値の型がオブジェクトの型への`rvalue`リファレンスである関数の呼び出しの結果。 ++ 戻り値の型がオブジェクトの型への`rvalue`リファレンスである関数の呼び出しの結果 ~~~cpp int && f() { return 0 ; } diff --git a/039-disable-copy.md b/039-disable-copy.md index 89147f3..40f46c3 100644 --- a/039-disable-copy.md +++ b/039-disable-copy.md @@ -8,7 +8,7 @@ コピーできないクラスは`deleted定義`を使ってコピーコンストラクターとコピー代入演算子を消すことができる。 -`deleted定義`は関数の本体`{...}`の代わりに`=delete`を書く。`deleted定義`されている関数を使うとエラーとなる。 +`deleted定義`は関数の本体`{...}`の代わりに`= delete`を書く。`deleted定義`されている関数を使うとエラーとなる。 ~~~cpp struct X diff --git a/042-string-intro.md b/042-string-intro.md index c63d799..575437a 100644 --- a/042-string-intro.md +++ b/042-string-intro.md @@ -283,7 +283,7 @@ auto s = "abcdef" ; -具体的な例では、`"abc"`という通常の文字列リテラルの型は``const char [4]`'になる。これは以下のような配列に等しい。 +具体的な例では、`"abc"`という通常の文字列リテラルの型は`const char [4]`になる。これは以下のような配列に等しい。 ~~~c++ const char s[4] = {'a', 'b', 'c', '\0'} ; @@ -482,7 +482,7 @@ baz このようなわかりにくい記述ではなく、ソースコードに書いたままの文字列を文字列として扱いたい。そのための機能が生文字列リテラル(Raw String Literal)だ。 -生文字列リテラルは以下のような文法で書く +生文字列リテラルは以下のような文法で書く。 ~~~c++ R"(...)" diff --git a/043-random.md b/043-random.md index 65cd0b0..130cd4e 100644 --- a/043-random.md +++ b/043-random.md @@ -24,7 +24,7 @@ $ ./dice コンピューターで使われる乱数のほとんどは疑似乱数と呼ばれる方法で生成されている。さまざまなアルゴリズムがあるが、とても簡単に理解できる疑似乱数のアルゴリズムに、線形合同法(Linear congruential generator)がある。 -線形合同法ではいまの乱数を$X_n$、次の乱数$X_{n+1}$とすると、$X_{n+1}$は以下のように求められる。 +線形合同法ではいまの乱数を$X_n$、次の乱数を$X_{n+1}$とすると、$X_{n+1}$は以下のように求められる。 $$ X_{n+1} = (a \times X_{n} + c) \bmod m @@ -102,7 +102,6 @@ int main() では乱数エンジンを使って、生の乱数を標準入力で得た個数だけ出力するプログラムを書いてみよう。 ~~~cpp - int main() { // 乱数エンジン @@ -719,7 +718,7 @@ $$ std::bernoulli_distribution d( p ) ; ~~~ -`p`は`double`型で、値の範囲は$0 \leq p \leq 1$ +`p`は`double`型で、値の範囲は$0 \leq p \leq 1$。 使い方。 diff --git a/044-random-part2.md b/044-random-part2.md index cd3435b..16368b1 100644 --- a/044-random-part2.md +++ b/044-random-part2.md @@ -34,7 +34,7 @@ $$ std::poisson_distribution d( mean ) ; ~~~ -`T`は整数型でデフォルトは`int`、`mean`は`RealType`型。$\mu$と同じで浮動小数点数型の値で所定の時間に平均して発生する事象の回数だ。値の範囲は$0 < \text{mean}$ +`T`は整数型でデフォルトは`int`、`mean`は`RealType`型。$\mu$と同じで浮動小数点数型の値で所定の時間に平均して発生する事象の回数だ。値の範囲は$0 < \text{mean}$。 使い方。 @@ -110,7 +110,7 @@ $$ std::exponential_distribution d( lambda ) ; ~~~ -`RealType`は浮動小数点数型でデフォルトは`double`、`lambda`は`RealType`型。ポアソン分布の`mean`と同じで、ある時間間隔における事象の発生回数だ。値の範囲は$0 < \text{lambda}$ +`RealType`は浮動小数点数型でデフォルトは`double`、`lambda`は`RealType`型。ポアソン分布の`mean`と同じで、ある時間間隔における事象の発生回数だ。値の範囲は$0 < \text{lambda}$。 `std::exponential_distribution`の生成する乱数は`1.0`のとき、ある時間間隔に等しくなる。`0.5`なら半分の時間間隔、`2.0`なら2倍の時間間隔だ。 diff --git a/045-random-part3.md b/045-random-part3.md index 3f787c3..6f9d602 100644 --- a/045-random-part3.md +++ b/045-random-part3.md @@ -59,7 +59,7 @@ $$ std::lognormal_distribution d( m, s ) ; ~~~ -`RealType`は浮動小数点数型でデフォルトは`double`。`m`, `s`は`RealType`型。値の範囲は$0 < s$ +`RealType`は浮動小数点数型でデフォルトは`double`。`m`, `s`は`RealType`型。値の範囲は$0 < s$。 使い方。 @@ -198,7 +198,7 @@ $$ std::student_t_distribution d( n ) ; ~~~ -`RealType`は浮動小数点数型でデフォルトは`double`。`n`は`RealType`型で、値の範囲は$0 < n$ +`RealType`は浮動小数点数型でデフォルトは`double`。`n`は`RealType`型で、値の範囲は$0 < n$。 使い方。 diff --git a/200-cpp.md b/200-cpp.md index ff864a0..27fde82 100644 --- a/200-cpp.md +++ b/200-cpp.md @@ -41,7 +41,7 @@ foo foo foo // end bar.cpp ~~~ -`bar.cpp`をCプリプロセッサーにかけると、以下のようなソースファイルが出力される +`bar.cpp`をCプリプロセッサーにかけると、以下のようなソースファイルが出力される。 ~~~cpp // bar.cpp diff --git a/300-multiple-source-files.md b/300-multiple-source-files.md index 02841fe..fe612a0 100644 --- a/300-multiple-source-files.md +++ b/300-multiple-source-files.md @@ -460,7 +460,7 @@ inline int f( int y ) { return y ; } インライン関数と変数のトークン列を同じにするには、ヘッダーファイルに書いて`#include`で取り込むことを徹底する。 -3. 意味が同じである。 +3. 意味が同じである 同じトークン列でも意味が異なることがある。 @@ -599,7 +599,7 @@ void main() ~~~ ##### staticメンバー -クラスのメンバーは非`static`メンバーと`static`メンバーにわけることができる。`static`メンバーは`static`キーワードを付けて宣言する。 +クラスのメンバーは非`static`メンバーと`static`メンバーに分けることができる。`static`メンバーは`static`キーワードを付けて宣言する。 ~~~cpp diff --git a/400-gdb.md b/400-gdb.md index 2c2c8a1..3c14b9b 100644 --- a/400-gdb.md +++ b/400-gdb.md @@ -96,7 +96,7 @@ Reading symbols from program...done. (gdb) ~~~ -ここにgdbのコマンドを入力する。ヘルプを表示するコマンド`"help"`と入力してみよう。 +ここにGDBのコマンドを入力する。ヘルプを表示するコマンド`"help"`と入力してみよう。 ~~~ (gdb) help @@ -574,7 +574,7 @@ int main() このまま`step`コマンドを続けていくと、また`main`関数に戻り、また次の行が実行され、また関数`f`が実行される。 -1行ずつ実行するのではなく$n$行実行したい場合は、`step`コマンドに$n$を指定する +1行ずつ実行するのではなく$n$行実行したい場合は、`step`コマンドに$n$を指定する。 ~~~ (gdb) step n