Skip to content

Commit

Permalink
見落としなどの修正。
Browse files Browse the repository at this point in the history
  • Loading branch information
hironori-hoshino committed Aug 1, 2019
1 parent 3f6c45a commit b43e3c0
Show file tree
Hide file tree
Showing 27 changed files with 37 additions and 41 deletions.
4 changes: 2 additions & 2 deletions 000-preface.md
Original file line number Diff line number Diff line change
Expand Up @@ -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上で公開した状態で行われた。
Expand Down
2 changes: 1 addition & 1 deletion 003-guide-to-c++.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ int main()

`-123``0``123`といった数値を整数という。`3.14`のような数値を浮動小数点数という。

数値を扱えるのだから、計算をしてみたいところだ。C++は整数同士の演算子として、四則演算(`+-*/`)や剰余(`%`)をサポートしている
数値を扱えるのだから、計算をしてみたいところだ。C++は整数同士の演算子として、四則演算(`+-*/`)や剰余(`%`)をサポートしている

~~~cpp
int main()
Expand Down
4 changes: 2 additions & 2 deletions 005-the-restaurant-at-the-end-of-the-branch.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ int main()
}
~~~

複数の```{}`で囲むことで、1つの文として扱うことができる。これを`複合文`という
複数の```{}`で囲むことで、1つの文として扱うことができる。これを`複合文`という

~~~cpp
int main()
Expand Down Expand Up @@ -168,7 +168,7 @@ else

`条件`が真(`true`)のときは`文1`が実行され、偽(`false`)のときは`文2`が実行される。

elseの部分は書かなくてもよい
`else`の部分は書かなくてもよい

~~~c++
if ( 条件 )
Expand Down
2 changes: 1 addition & 1 deletion 008-loop.md
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,7 @@ loop :
本当に重要で本質的な、繰り返し実行をする部分の2行のコードはまったく変わっていない。それでいて`while(true)`の方が圧倒的に簡単に書ける。


## 終了条件付きループ
### 終了条件付きループ

なるほど、無限ループを書くのに、`goto文`を使うより`while(true)`を使った方がいいことがわかった。ではほかのループの場合でも、`while文`の方が使いやすいだろうか。

Expand Down
2 changes: 1 addition & 1 deletion 009-vector.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ int main()
}
~~~

もちろん、上の`vector`を保持する`vector`も書ける。その場合、`std::vector<std::vector<std::vector<int>>>`になる。このvectorを保持する`vector`も当然書けるが省略する。
もちろん、上の`vector`を保持する`vector`も書ける。その場合、`std::vector<std::vector<std::vector<int>>>`になる。この`vector`を保持する`vector`も当然書けるが省略する。

`std::vector`型の変数にはメンバー関数`push_back`を使うことで値を保持できる。

Expand Down
2 changes: 1 addition & 1 deletion 011-integer.md
Original file line number Diff line number Diff line change
Expand Up @@ -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までを表現できる。どちらかに偏ってしまう。

Expand Down
2 changes: 1 addition & 1 deletion 014-iterator.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ int main()
~~~


## イテレーターの参照する要素に対する読み書き
## イテレーターの参照する要素に対する読み書き

イテレーターは`vector`の先頭の要素を指し示している。イテレーターの指し示す要素を参照するには`*`を使う。

Expand Down
2 changes: 1 addition & 1 deletion 015-reference.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# lvalueリファレンスとconst

ポップカルチャーリファレンスというのは流行の要素をさり気なく作品中に取り入れることで、流行作品を知っている読者の笑いを誘う手法である
-- キャプテン・オブビウス ポップカルチャーリファレンスについて
-- キャプテン・オブビウスポップカルチャーリファレンスについて

## lvalueリファレンス

Expand Down
3 changes: 1 addition & 2 deletions 016-algorithm.md
Original file line number Diff line number Diff line change
Expand Up @@ -969,8 +969,7 @@ int main()
}
~~~


`result`に代入されるのは関数`op`の戻り値だ。関数`op`は値を1つの引数受け取り値を返す関数だ。
`result`に代入されるのは関数`op`の戻り値だ。関数`op`は値を1つの引数で受け取り値を返す関数だ。

## replace

Expand Down
2 changes: 1 addition & 1 deletion 018-class.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ int main()
}
~~~
# まとめた変数に関数を提供する
## まとめた変数に関数を提供する
分数を表現するプログラムを書いてみよう。
Expand Down
2 changes: 1 addition & 1 deletion 019-operator-overloading.md
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ struct person
} ;
~~~

# 自然な演算子
## 自然な演算子

`int`型は`+-*/`といった演算子を使うことができる。

Expand Down
2 changes: 1 addition & 1 deletion 022-implement-array.md
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
2 changes: 1 addition & 1 deletion 023-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ T twice( T n )

通常の関数が値を引数に取ることができるように、テンプレートは型を引数に取ることができる。

テンプレートは以下のように宣言する
テンプレートは以下のように宣言する

~~~c++
template < typename T >
Expand Down
6 changes: 2 additions & 4 deletions 025-array-iterator.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

自作の`array`をイテレーターに対応させる前に、まず`'std::array'`のイテレーターについてひと通り調べよう。

イテレーターは`std::begin/std::end`で取得する
イテレーターは`std::begin/std::end`で取得する

~~~cpp
int main()
Expand Down Expand Up @@ -712,7 +712,7 @@ i += 3 ;

`i += n`はイテレーター`i``n`回進める。

`operator +`もある
`operator +`もある

~~~cpp
auto j = i + 3 ;
Expand Down Expand Up @@ -768,7 +768,6 @@ int main()
イテレーター`i``n`個先の要素を読み書きするのにいちいち`*(i+n)`と書くのは面倒なので、`std::array``std::vector`のイテレーターには`operator []`がある。これを使うと`i[n]`と書ける。

~~~cpp

int main()
{
std::array<int, 5> a = {1,2,3,4,5} ;
Expand Down Expand Up @@ -1090,7 +1089,6 @@ int main()
これに対応するために、`const_iterator`のコンストラクターは`iterator`から変換するためのコンストラクターも持つ。

~~~cpp

template < typename Array >
struct array_const_iterator
{
Expand Down
2 changes: 1 addition & 1 deletion 031-iterator-operations.md
Original file line number Diff line number Diff line change
Expand Up @@ -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までの距離
}
~~~

Expand Down
2 changes: 1 addition & 1 deletion 032-memory-allocation.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ void * ptr = ::operator new( 5 ) ;
::operator delete ( ptr ) ;
~~~

## 生のバイト列を基本的な型の値として使う方法
## 生のバイト列を基本的な型の値として使う方法

`int``double`のような基本的な型は、生のバイト列のポインターを型変換するだけで使える。

Expand Down
2 changes: 1 addition & 1 deletion 035-copy.md
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ int main()
}
~~~

関数の宣言に`=delete`を書くと、その関数を消すことができる。「消す」というのは、その関数を使った時点でプログラムがコンパイルエラーになるという意味だ。
関数の宣言に`= delete`を書くと、その関数を消すことができる。「消す」というのは、その関数を使った時点でプログラムがコンパイルエラーになるという意味だ。

この問題を解決するにはテンプレートを使う。

Expand Down
2 changes: 1 addition & 1 deletion 036-move.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ C++の基本型とクラスのデフォルトのムーブの実装は、単な
ムーブ後のオブジェクトは使えない状態になるということは、ムーブ後のオブジェクトの値はどうなってもいいということだ。


`std::vector`のようなクラスは動的メモリー確保をしてポインターでストレージを参照している。自作のvectorにコピーを実装するときは、コピー先でも動的メモリー確保をして要素を1つずつコピーしなければならないことを学んだ。
`std::vector`のようなクラスは動的メモリー確保をしてポインターでストレージを参照している。自作の`vector`にコピーを実装するときは、コピー先でも動的メモリー確保をして要素を1つずつコピーしなければならないことを学んだ。

とても簡単な、`T`型の配列を確保する`dynamic_array<T>`を考えてみよう。

Expand Down
4 changes: 2 additions & 2 deletions 037-rvalue-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ int & ref = object ;

### prvalue

`prvalue`は純粋なrvalue(pure rvalue)のことだ。つまり、名前なしのオブジェクトや計算結果の一時オブジェクトのことだ。
`prvalue`は純粋な`rvalue`(pure rvalue)のことだ。つまり、名前なしのオブジェクトや計算結果の一時オブジェクトのことだ。

~~~cpp
int f() { return 0 ; }
Expand Down Expand Up @@ -206,7 +206,7 @@ auto result = x + y + z ;

`xvalue`となる値は以下のような場合だ。

+ 戻り値の型がオブジェクトの型への`rvalue`リファレンスである関数の呼び出しの結果
+ 戻り値の型がオブジェクトの型への`rvalue`リファレンスである関数の呼び出しの結果

~~~cpp
int && f() { return 0 ; }
Expand Down
2 changes: 1 addition & 1 deletion 039-disable-copy.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

コピーできないクラスは`deleted定義`を使ってコピーコンストラクターとコピー代入演算子を消すことができる。

`deleted定義`は関数の本体`{...}`の代わりに`=delete`を書く。`deleted定義`されている関数を使うとエラーとなる。
`deleted定義`は関数の本体`{...}`の代わりに`= delete`を書く。`deleted定義`されている関数を使うとエラーとなる。

~~~cpp
struct X
Expand Down
4 changes: 2 additions & 2 deletions 042-string-intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ auto s = "abcdef" ;



具体的な例では、`"abc"`という通常の文字列リテラルの型は``const char [4]`'になる。これは以下のような配列に等しい。
具体的な例では、`"abc"`という通常の文字列リテラルの型は`const char [4]`になる。これは以下のような配列に等しい。

~~~c++
const char s[4] = {'a', 'b', 'c', '\0'} ;
Expand Down Expand Up @@ -482,7 +482,7 @@ baz

このようなわかりにくい記述ではなく、ソースコードに書いたままの文字列を文字列として扱いたい。そのための機能が生文字列リテラル(Raw String Literal)だ。

生文字列リテラルは以下のような文法で書く
生文字列リテラルは以下のような文法で書く

~~~c++
R"(...)"
Expand Down
5 changes: 2 additions & 3 deletions 043-random.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -102,7 +102,6 @@ int main()
では乱数エンジンを使って、生の乱数を標準入力で得た個数だけ出力するプログラムを書いてみよう。

~~~cpp

int main()
{
// 乱数エンジン
Expand Down Expand Up @@ -719,7 +718,7 @@ $$
std::bernoulli_distribution d( p ) ;
~~~

`p``double`型で、値の範囲は$0 \leq p \leq 1$
`p``double`型で、値の範囲は$0 \leq p \leq 1$

使い方。

Expand Down
4 changes: 2 additions & 2 deletions 044-random-part2.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ $$
std::poisson_distribution<T> d( mean ) ;
~~~
`T`は整数型でデフォルトは`int`、`mean`は`RealType`型。$\mu$と同じで浮動小数点数型の値で所定の時間に平均して発生する事象の回数だ。値の範囲は$0 < \text{mean}$
`T`は整数型でデフォルトは`int`、`mean`は`RealType`型。$\mu$と同じで浮動小数点数型の値で所定の時間に平均して発生する事象の回数だ。値の範囲は$0 < \text{mean}$
使い方。
Expand Down Expand Up @@ -110,7 +110,7 @@ $$
std::exponential_distribution<RealType> 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倍の時間間隔だ。

Expand Down
4 changes: 2 additions & 2 deletions 045-random-part3.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ $$
std::lognormal_distribution<RealType> d( m, s ) ;
~~~
`RealType`は浮動小数点数型でデフォルトは`double`。`m`, `s`は`RealType`型。値の範囲は$0 < s$
`RealType`は浮動小数点数型でデフォルトは`double`。`m`, `s`は`RealType`型。値の範囲は$0 < s$
使い方。
Expand Down Expand Up @@ -198,7 +198,7 @@ $$
std::student_t_distribution<RealType> d( n ) ;
~~~
`RealType`は浮動小数点数型でデフォルトは`double`。`n`は`RealType`型で、値の範囲は$0 < n$
`RealType`は浮動小数点数型でデフォルトは`double`。`n`は`RealType`型で、値の範囲は$0 < n$
使い方。
Expand Down
2 changes: 1 addition & 1 deletion 200-cpp.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ foo foo foo
// end bar.cpp
~~~

`bar.cpp`をCプリプロセッサーにかけると、以下のようなソースファイルが出力される
`bar.cpp`をCプリプロセッサーにかけると、以下のようなソースファイルが出力される

~~~cpp
// bar.cpp
Expand Down
4 changes: 2 additions & 2 deletions 300-multiple-source-files.md
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ inline int f( int y ) { return y ; }
インライン関数と変数のトークン列を同じにするには、ヘッダーファイルに書いて`#include`で取り込むことを徹底する。
3. 意味が同じである
3. 意味が同じである
同じトークン列でも意味が異なることがある。
Expand Down Expand Up @@ -599,7 +599,7 @@ void main()
~~~

##### staticメンバー
クラスのメンバーは非`static`メンバーと`static`メンバーにわけることができる`static`メンバーは`static`キーワードを付けて宣言する。
クラスのメンバーは非`static`メンバーと`static`メンバーに分けることができる`static`メンバーは`static`キーワードを付けて宣言する。


~~~cpp
Expand Down
4 changes: 2 additions & 2 deletions 400-gdb.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ Reading symbols from program...done.
(gdb)
~~~

ここにgdbのコマンドを入力する。ヘルプを表示するコマンド`"help"`と入力してみよう。
ここにGDBのコマンドを入力する。ヘルプを表示するコマンド`"help"`と入力してみよう。

~~~
(gdb) help
Expand Down Expand Up @@ -574,7 +574,7 @@ int main()

このまま`step`コマンドを続けていくと、また`main`関数に戻り、また次の行が実行され、また関数`f`が実行される。

1行ずつ実行するのではなく$n$行実行したい場合は、`step`コマンドに$n$を指定する
1行ずつ実行するのではなく$n$行実行したい場合は、`step`コマンドに$n$を指定する

~~~
(gdb) step n
Expand Down

0 comments on commit b43e3c0

Please sign in to comment.