C++プログラミングの基礎

The basics of C++ programming

概要 Abstract
本章では,C++プログラミングの基礎を解説する.
In this chapter, explain the basics of C++ programming.
目次 Table of contents

C++の特徴 Characteristic of C++

C++は オブジェクト指向プログラミング(Object Oriented Programming, OOP)言語 の一種である. OOPが提案される以前の関数型言語(例えばC言語)との本質的な違いは,C:「関数型言語は関数が主体で変数は単なるデータ」という考え方に対して,C++: 「変数が主体で関数は変数に属するもの」 という考え方である.つまり 関数と変数の立場が逆転 している.OOPでは,(関数を要素の一部として持つ)変数型を, オブジェクト と呼んでいる. 「関数を要素の一部として持つ変数型」と言うのは,C++では クラス(class) によって実現される. クラスとは,Cにおける構造体に,関数を要素として加えたもの だと思えばよい.ひとつ例を示そう.ロボットをシミュレートするプログラムを作ることを考える.ロボットは (x,y) 座標系に配置され,ともに整数で表されるとする.このとき,ロボットを表す構造体をCで書くと,

C++ is kind of object-oriented programming (Object Oriented Programming, OOP) language. Essential difference with functional language (e.g., C language) before OOP is suggested is, C: "For Functional language, function is main body and variable is simple data", C++: " Variable is main body and function belongs to variable". In other words, viewpoint of Function and variable are reversing. For OOP, variable type(having function as part of of element) is called as object. "Variable type having function as part of of element" is realized in C++ by class. You should regard that class is which added function as factor in structure in C. Let's indicate one example. Now create program to simulate robot. Robot is placed for (x,y) coordinate system, and assume that both are expressed in integers. At this time, when write structure to represent robot in C,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  struct TRobot
  {
    int x,y;
  };

となる.このロボットを移動させる関数は,次のように定義できる.

It becomes as this. Define function to move this robot as follows.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
 void robot_move (TRobot *robot, int dx, int dy)
  {
    robot->x += dx;
    robot->y += dy;
  }

この関数の第一引数 TRobot *robot から, この関数は構造体( TRobot )にのみ有効である ことがわかる.したがって,このようにある型( TRobot )に属する関数( robot move )は,その型に含めてしまったほうが自然である.これを実現したのがクラスで,

From first argument TRobot *robot of this function, you can understand that this function is valid for only structure (TRobot). Therefore, it is natural to Include function (robot move) to belong to type (TRobot) like this in the type. It is class to have realized this, and

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  class TRobot
  {
  private:
    int x,y;
  public:
    void move (int dx, int dy)
      {
        x += dx;
        y += dy;
      };
  };

というコードを書けば,移動関数( move )を含むロボットクラス( TRobot ) が定義できる.なお, privatepublic は,クラスの要素にアクセスする制限を設けるための宣言である. クラス化することのメリットは,コードが「自然」だということ(ロボット型が移動関数を持つのは自然),その型の変数(インスタンス と呼ぶ)しか使えないから安全であるということ(上の関数 robot move は,第一引数にどのような型を持って来ても(キャストすれば)使用できるが, TRobot クラスの move 関数は TRobot クラスの変数しか使用できない)などである.また,クラスの継承などを使うことにより,同じようなコードをまとめたり,階層化したりできる. JavaやC#など,近年開発されたプログラミング言語もOOPを採用しており,C++を学ぶことは有益である. このほかのC++の主な特徴として,次のようなものがある.

If writing this code, you can define robot class (TRobot) including transfer function (move). In addition, private and public are declaration. to establish restriction to access class element. Merit of class is that, code is "natural" (It is natural that robot type has transfer function), Only variable of the type (call it instance) is available, so it is safe (Upper function robot move can be used(if cast) even if with any type as first argument, but move function of TRobot class can use only variable of TRobot class ), and so on. Besides, by using the succession of class, you can gather up similar code and hierarchize it. Programming language such as JAVA, C#, that was developed recently, are also adopting OOP, so it is useful to learn C++. As other main characteristic of C++, there is the following.

  • 充実したOOPの実現(例えばクラスの 継承多重継承ポリモーフィズム など) Substantial OOP implementation (e.g. The inheritance of class, multiple inheritance, polymorphism)
  • テンプレート ;関数やクラスの「ひながた」.同じコードを何度も書く必要がなくなる Template; "Model" of function and class. It is not necessary to write the same code many times
  • Standard Template Library (STL); ベクタやリストなどのデータ構造のテンプレート.これを使えば,自分でメモリ管理をするコードを書く必要がかなり減る.安全性の向上 Standard Template Library (STL); Template of data structure such as vector or list. If use this, you can considerably decrease to write code performing memory management. Safe improvement
  • new/delete ;型情報を含めたメモリ確保・解放ができるため,安全性が向上 new/delete; Because securing/release of memory, included type information, is possible, safety improves.
  • 例外処理 機構( try - catch )の導入;高度なエラー処理機能 Introduction of exception handling (try - catch); Advanced error processing facility
  • 名前空間 の導入;識別子(変数や関数の名前)が重複してもトラブルにならないようにする機能 Introduction of namespace, Functionality to prevent from trouble even if identifier (the name of variable and function) is duplicated.

残念ながら本資料ではC++プログラミングの細部には踏み込まないが,以下のような入門書を参考にするとよい.

Unfortunately, this document does not step into the details of C++ programming, so you should refer to the following introductory book.

  • Dr.JamsaのC++超入門, クリス ジャムサ (著), Kris Jamsa (原著), 春木 良且 (翻訳) C++ ultra getting started of Dr.Jamsa, Kris Jamsa (writter), Kris Jamsa (original writter), Yoshikatsu Haruki (translation)
  • CプログラマのためのC++入門, 柴田望洋 Introduction to C++ for C programmer, Boyo Shibata

また,STLなどの解説が充実しているサイトとして,以下がある.

In addition, refer to following site where explanation such as STL is substantial.

  • http://www.cplusplus.com/ (C++全般.STLの辞書としてお勧め) http://www.cplusplus.com/ (Overall C++. Recommendable as STL dictionary)
  • http://www.cppreference.com/ http://www.cppreference.com/
    もっとも正しい知識を得るためには, C++ の規格を読むのが一番よい.
    It is best way to read C++ standard to get the be proper knowledge.
  • ISO/IEC 14882 を google で検索すれば,規格の PDF が手に入る. If search ISO/IEC 14882 via google, PDF of standard is available.
  • http://www.open-std.org/jtc1/sc22/wg21/ The C++ Standards Committee
    ひとつ付け加えておくと,多くのコンパイラは完璧にこれらの規格に準拠しているわけではない.独自の拡張をしたり,あるいはバグか何かで規格とは違う動作をしたりする場合がある.いくつかの開発環境を経験しておくのがいいのかもしれない.
    To add one thing, a lot of compilers are not completely based on these standards. They may perform original extension and action unlike standard due to bug or anything. You should experience several development environments.

Cとの違い Difference with C

基本的にはC++はCをサブセットとして含むと考えておいてよい.CのコードはC++でもコンパイルできる.C++では多少のパフォーマンス(メモリ使用量や速度)を犠牲にして安全性や再利用性を実現しているため,Cよりも若干パフォーマンスが劣ったりコストが掛かったりする.例えば例外処理のために関数呼び出しにおけるオーバーヘッドが若干増加する.このため組み込み系(マイコンなど)のプログラミングではCがよく用いられる.しかし,その差は微小で,Matlabのような高級言語に比べると,格段にパフォーマンスはよい.実際,適当なプログラムを作って比較すると,パフォーマンスの差はほとんどみられないだろう.現にワープロソフトなどの商用ソフトの多くはC++で書かれている.

You can think that C++ includes C as subset basically. You can compile C code in C++. Because C++ realize safety and re-availability at a cost of some performances (memory utilization and speed), performance and and cost are slightly inferior to C. For example, due to exception handling, some overhead in function call increases. Therefore, C is well used for programming of built-in predefined system (including micon). However, the difference is small, and performance is good remarkably as compared to high-level language such as Matlab. Actually, when you create suitable program and compare it, difference of performance is rarely found. In fact, most of commercial software such as word processing softwares are written by C++.

ちなみに,

By the way,

  • 組み込みC/C++プログラミング入門, 石原 亘(著) Introduction to built-in predefined C/C++ programming, (written) by Wataru Ishihara

組み込みでもC++が使われることもあるようだ.

It seems that C++ is used in embodiment.

コンパイル Compilation

伝統に従って, Hello World 的なプログラムから始めよう.

According to tradition, let's begin with Hello World-like program.

Hello World:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>
  using namespace std;
  int main(int argc, char**argv)
  {
    cout << "Hello Robotics!" << endl;
    return 0;
  }

このプログラムを書いて保存(hello world.cpp とする)し,以下のようにコンパイルする.

Write this program(hello world.cpp) and save it, then compile it as follows.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
% g++ hello_world.cpp

すると,伝統的な出力ファイル a.out が生成されるから,これを実行する.

Then, traditional output file a.out is created, execute this.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  % ./a.out

結果::

Result::

 Hello Robotics!

#include <iostream> は, iostream というライブラリを読み込むプリプロセッサ指令(結果として, cout などが読み込まれる), using namespace std; は std という 名前空間 を使うという宣言である.

# include <iostream> is Preprocessor directive to read library called iostream(as a result, read cout etc.). using namespace std; is a declaration using namespace called std.

コンパイルオプション Compile option

g++ (GNU プロジェクト C++ コンパイラ) はとても洗練されたコンパイラで,多様なコンパイルオプションを提供している.ほぼ必ずつけておいた方がよいオプションは,

g++ (GNU project C++ compiler) is very refined compiler, and is providing a variety of compile option. Option which you should use definitely is

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
 % g++ -g -Wall hello_world.cpp

などである.これらは,シェルのエイリアスを使って,コマンド g++ に含めてしまおう. -g はデバッグ情報を生成するオプション, -Wall は警告(コンパイルエラーにはならないが避けることが望ましいプログラムに対するメッセージ)をすべて出力するオプションである. -g をつけてコンパイルすると, gdb (デバッグツール)でデバッグできるようになる. -Wall をつけたときに表示される警告は,ゼロにしよう .わけのわからないバグに悩まされる割合が減る.

and so on. Let's include it in command g++ using shell Alias. -g is option to generate debugging information. -Wall is options to output all of warnings (Message for program that is not compile error but desirable to avoid.) When you use -g and compile it, debug is available with gdb (debug tool). Let's eliminate displayed warning when using -Wall. You can decrease trouble by unreasonbale bug.

ほかのオプションに,

As for other options,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
 % g++ -g -Wall hello_world.cpp -o hello_world -O2 -I/usr/local/include -lglut

などがある.-o hello world は生成する実行ファイルを hello_world にするオプション, -O2 はレベル2の最適化, -I/usr/local/include は ディレクトリ /usr/local/include を include の検索ディレクトリに加える, -lglut はライブラリ GLUT を使うというオプション(リンカが /usr/lib/libglut.so をリンクする)である. 詳細なコンパイルオプションは,

There are these etc.. -o hello world is option to create execute file as hello_world, - O2 is optimization of level 2, -I/usr/local/include is to add directory /usr/local/include to search directory of include, -lglut is option to use library GLUT (Linker links /usr/lib/libglut.so). For Detailed compile option,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  % man gcc

とすると調べられる.これは g++ はすでに gcc に統合されているからだ.

Examined it as this. As g++ has been already unified in gcc.

C++ プログラムの構成 Configuration of C++ program

C++ のプログラムは,「文」をたくさん書いたものだ.「文」には次の種類がある:

Program of C++ has a lot of written "sentence". There are following kinds in "statement" :

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  文:
    宣言/定義
    式
    制御文
    複合文

宣言/定義というのは, int a のように変数を宣言したり,構造体などの型を定義したりする文のこと,式とは a=a*a などの式(関数呼び出し func(a) も式に含まれる),制御文とは for ループなど,複合文とは

Declaration/definitions is the statement which declares variable like int a and defines types such as structures. formula is expressions such as a=a*a(Function call func(a) is included in formula, too), control statement is for loops etc., compound statement is

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  {
    int b;
    b=10;
    cout<<b<<endl;
  }

のように,「文」を複数書いたブロックである.コンパイラは,これらの「文」がたくさん書かれたプログラムを,上から順に処理する.コンパイル で紹介した例を分解してみよう:

block where plural "statement" are written like this. Compiler handles program that these "statements" were written a lot sequentially from the top. Parse example introduced at compilation:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>   // プリプロセッサのディレクティブ (iostream をインクルード)
  using namespace std;  // 名前空間 std を使うぞという「宣言」
  int main(int argc, char**argv)  // 関数「定義」の開始
  {                               // 「複合文」の開始
    cout << "Hello Robotics!" << endl;  // 「式」
    return 0;                           // 「制御文」
  }                               // 「複合文」の終了

こんな感じだ. It is as this.  予備知識 : プリプロセッサのディレクティブという要素が入っている.厳密に言うと, g++ は プリプロセッサコンパイラリンカ の3つのプログラムから構成され,コンパイラが処理するのは,プリプロセッサによって処理されたプログラムである.だから上のプログラムの場合,コンパイラは #include <iostream> が読み込まれたプログラムを処理することになるので,上で紹介した「文」には #include などは含まれないのだ. Background knowledge: It is including element called directive of preprocessor. To say strictly, g++ is composed of three programs of preprocessor, compiler, linker, and compiler process programs processed by preprocessor. Therefore, in the case of upper program, as compiler handle program that #include <iostream> read, #include is not includedin "statement" introduced at the top.

変数の宣言と定義 Declaration and definitions of variable

変数とは,データ(整数とか実数,文字列など)を計算機のメモリに記憶させておくためのメカニズムのことである.数学で言う変数とは若干意味が異なる.C++に限らず,変数に値を代入したり読み出したりすることはプログラミングの基本だ. 変数は,それが使われるよりも前の文で,宣言/定義されていなければならない.例えば整数の変数 a を使いたいとすると,

Variable is mechanism that memorize data (including integer or real number, character string) in memory of computer. Meanings are slightly different as compared to variable in mathematics. In not only C++, it is basics of programming to assign and read value from variable. Variable must be defined/declared before they are used. For example, if you want to use variable a of integer,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  int a;

のように定義する.詳細は[宣言/定義と代入] を参照.

Define as this. Refer to [declaration / definitions and assignment] for details.

変数は, 名前(識別子)アドレス から構成される.識別子とは x とか hoge とかのことで,予約語( if とかのキーワード)以外ならなんでも構わない.型とは,保存したいデータの型で,例えば整数型とかである.アドレスは,メモリ上のどこにデータが配置されているかを表すもので,コンパイラが決めてくれるから,当面(「ポインタ」を勉強するまで)は気にしなくてよい.なお,C++は python のように型を自動判別するようなことはない.

Variable is composed of the name (identifier), type, address. Identifier is such as x or hoge, and it is OK except reserved word (key word such as if). Type is type of saving data, and there is integer type for example. Address is which represents where data are placed in memory, and compiler decides it, so you do not need to mind (until you study "pointer") for the time being. In addition, C++ does not distinguish type automatically like python.

基本型 Base type

型には,以下のような基本型がある.このほかに,これらを組み合わせた複合型(構造体やクラス)もある.複合型は,ユーザが定義することもできる.

Type has the following base type. In addition, there is compound type (structure and class) that put these together. Also, user can define compound type.

基本型(一部)
Base type (partly)
保存するデータメモリ長
文字char8bit
整数short16bit
整数int32bit
整数long32bit
浮動小数float32bit
倍精度浮動小数double64bit
もっと高精度の浮動小数long double96bit
真理値 (true/false)bool8bit
Saving dataTypeMemory length
Characterchar8bit
Integershort16bit
Integerint32bit
Integerlong32bit
Floating decimal fractionfloat32bit
Double precision floating decimal fractiondouble64bit
More highly precise floating decimal fractionlong double96bit
Truth value (true/false)bool8bit

なお,ここで示したメモリ長はg++における参考値である.基本的には処理系(コンパイラ)依存なので,この限りではないことに注意されたい.ちなみに,メモリ長(ビット数)は次のようにして調べられる.

In addition, Memory length indicated here is reference values in g++. You should note that it is not limit, as it is implementation (compiler)-dependent basically, By the way, memory length (bit number) can be examined as follows.

アドレス演算子:

Address operator:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>
  using namespace std;
  int main(int argc, char**argv)
  {
    cout << "sizeof(char)        = " << sizeof(char)       *8 << "bit" << endl;
    cout << "sizeof(short)       = " << sizeof(short)      *8 << "bit" << endl;
    cout << "sizeof(int)         = " << sizeof(int)        *8 << "bit" << endl;
    cout << "sizeof(long)        = " << sizeof(long)       *8 << "bit" << endl;
    cout << "sizeof(float)       = " << sizeof(float)      *8 << "bit" << endl;
    cout << "sizeof(double)      = " << sizeof(double)     *8 << "bit" << endl;
    cout << "sizeof(long double) = " << sizeof(long double)*8 << "bit" << endl;
    cout << "sizeof(bool)        = " << sizeof(bool)       *8 << "bit" << endl;
    return 0;
  }

結果::

 sizeof(char)        = 8bit
 sizeof(short)       = 16bit
 sizeof(int)         = 32bit
 sizeof(long)        = 32bit
 sizeof(float)       = 32bit
 sizeof(double)      = 64bit
 sizeof(long double) = 96bit
 sizeof(bool)        = 8bit

宣言/定義と代入 Declaration/definitions and assignment

宣言/定義 とは,コンパイラに変数を使う指示をするためのもので,宣言されずに変数を使うとエラーになる.例えば,変数 x を整数型として使いたかったら,整数型として x を宣言しておかなければならない.

Declaration/definitions is intended to perform instructions to use variable for compiler, and error occurs when using variable without declaration. For example, if you want to use variable x as integer type, declare x as integer type.

宣言と定義の違いは,少し難しい.とりあえず,その文によってメモリが割り当てられるなら定義,
ただコンパイラに通知するのみなら宣言,ぐらいの理解でいい.

変数の定義は,

As for definitions of variable,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  型 識別子;

と書く.例えば整数 x を定義するなら,

Write as this. For example, if define integer x,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  int x;

整数 x と整数 y を定義するなら,

If define integer x, integer y,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  int x, y;

なお, C++では変数の宣言/定義はどこに書いてもよい .例えば,

In addition, you may write declaration / definitions of variable wherever in C++. For example,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  for (int i(0);i<10;++i)
  {
    cout << i << endl;
  }

のような書き方が許される.この場合,変数 i の有効範囲は for ループの中だけであることに注意しよう.

Writing style as this is permitted. In this case, note that wffective range of variable i is within only for loop.

代入 とは, x が記憶されているメモリ領域にデータを書き込むことである. Substitution is to write data in memory area where x is memorized. [#a3b14c47]

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  x = 15;

とすれば, 15 が書き込まれる.数学における「等号」ではなく,代入である点に注意.

If you do as this, 15 is written in. Be careful that is not "equation operator" in mathematics but substitution.

変数に,最初から値を与えておくことを 初期化 と言う.初期化は,

Initialization is to give value to variable from beginning. For Initialization,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  int x=12, y=12;
  int z(12);

のように書く. x, y, z のいずれも 12 に初期化される.

write as this. Both of x, y, z are initialized to 12.

変数を使うには,ただ名前(識別子)を式中で書くだけでよい.例えば, x を 10 倍したものを y に代入するには,

To use variable, only write the name (identifier) in formula. For example, to assign thing which performed 10 times to x to y,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  y = x * 10;

と書く.

Write as this.

標準出力と標準入力 Standard output and standard input

標準出力 Standard output

標準出力とは,ターミナルにデータを出力することである.C++では「出力ストリーム」というものが定義されていて,

Standard output is to output data to terminal. In C++, "output stream" is defined, LISH

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  int x(10);
  cout << "x = " << x << endl;

と書けば,

If you write as this,

 x = 10

とターミナルに出力される. endl は改行である(正確には,改行し,画面に出力する(flush)). cout を使うためには, iostream を include しなければならない. cout はすべての基本型に対して定義されているから,整数とか浮動小数の表示は,上の例と同じようにすればよい.文字幅を調整するには,

Output as this. endl is newline character (Precisely, start a new line and output it to screen (flush)). To use cout, you must include iostream. Because cout is defined for all base type, You should perform it in the same way as upper example for display of integer or floating decimal fraction. To coordinate character width,

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  int x(10);
  cout << "x = " << setw(4) << x << endl;

などとする. setw(文字幅) の後に書いた内容の文字幅が設定される.

do as this. Character width of content that you wrote after setw( character width) is set.

iostream の例:

Example of iostream:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>
  #include <iomanip>
  using namespace std;
  int main(int argc, char**argv)
  {
    int x(3);
    double y(3.14), z(3.1415);
    cout << "x は " << setw(5) << x << "です." << endl;
    cout << "y は " << setw(5) << y << "です." << endl;
    cout << "z は " << setw(5) << z << "です." << endl;
    return 0;
  }

結果::

Result::

 x は     3です.
 y は  3.14です.
 z は 3.1415です.

標準入力 Standard inputISH

プログラムの実行中に,ユーザにデータの入力を求めるときは標準入力を使う.例えば,

When demand data input from user during program execution, use standard input.

cin の例:

Example of cin:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>
  using namespace std;
  int main(int argc, char**argv)
  {
    int x;
    cout << "input an integer:  ";
    cin >> x;
    double y;
    cout << "input a decimail num:  ";
    cin >> y;
    cout << endl << "inputs are..." << endl;
    cout << x << "t" << y << endl;
    return 0;
  }

結果::

Result::

 input an integer:  10
 input a decimail num:  1.2
 inputs are...
 10      1.2

のように使う.結果のコロンの後の 10 と 1.2 はユーザが入力した値である.

Use as this. 10 and 1.2 after result colon is values that user entered.

演算子 Operator

演算子とは,演算(足し算やかけ算など)を表す記号である.C/C++では,式中のすべての記号(変数識別子以外)は演算子である.前述の = も演算子(代入演算子)である. 注意すべきなのは,いくつかの演算子は複数の意味を持つことである.例えば括弧演算子 () は式中において,優先順位操作(数学と同じ括弧の意味で,「括弧内を先に評価せよ」)以外にも,関数呼び出しとキャスト(明示的型変換)の意味を持つ. 演算子の一覧は

Operator is symbols, representing operation (including addition and multiplication). In C/C++, all symbols (except variable identifier) during formula are operators. Above-mentioned = is operator(assignment operator), too. You should be careful about that several operators have plural meanings. For example, in formula, parenthesis operator () has meaning of function call and the cast (explicit type conversion) other than precedence operation (It means parenthesis as same as mathematics, "Evaluate parenthesis first"). For operators list,

あたりを参照して頂くとして,ここでは頻繁に使うもの(しかし若干注意を要する/わかりにくい)を概説する.

refer to around this. Here, we give an outline for frequently used thing (However, need attention slightly/hard to understand).

諸規則 Rules

まず一般的な約束として,演算子は 優先順位(Precedence)結合規則(Associativity) という属性を持つ.数学ではかけ算と割算は足し算と割算より優先順位が高い.C/C++でも同じである.例えば, x+y*z は x+(y*z) に等しい. *結合規則は, x+y+z と書いた場合に, (x+y)+z なのか x+(y+z) なのかを定義するためのルール* である. + 演算子は left to right (左結合)だから, (x+y)+z である. すべての演算子は何らかの結果を返す .代入演算子 = も例外ではなく,代入結果を返す.例えば, 3*(x=8) の結果は 24 である(もちろん x には 8 が代入される). C/C++プログラマはしばしばこれらの規則を乱用する.一例として, x=y=z=1 は, = 演算子が right to left (右結合)だから, x=(y=(z=1)) と同じ意味(右から左)であり,ついでに z=1 の結果が z の代入結果(つまり 1 )であるから,結果としてすべて 1 が代入されることになる.こういう書き方は頻繁に使わない方がよい.可読性を失い,後からみると意味がわからなくなることもある.なるべく括弧を付けよう. 演算子には 単項演算子(Unary Operator)2項演算子(Binary Operator)3項演算子(Ternary Operator) という分類が存在する.これはひとつの演算子に対して,演算対象の値(被演算子)がいくつ存在するかで分類したものだ.例えば x+y の加算演算子 + は二項演算子, -a のマイナス - は単項演算子だ.3項演算子はひとつしかなく,条件演算子 ?: のみである.だから,この演算子は俗に3項演算子と呼ばれる.

At first as general engagement, Operator has attribute of precedence, associativity. In mathematics, multiplication and division have higher priority than addition and division. It is the same in C/C++. For example, x+y*z is equal to x+(y*z). * associativity is rule to define (x+y)+z or x+(y+z) in the case of x+y+z. As + operator is left to right (left association), it is (x+y)+z. All operators return some kind of results. Also, assignment operator = is not exceptional and returns substitution result. For example, result of 3*(x=8) is 24 (Of course 8 is substituted to x). C/C++ programmer often abuses these rules. As an example, for x=y=z=1, because = operator is right to left (right association), it is same as x=(y=(z=1)) (right-to-left), and incidentally, because result of z=1 is substitution result of z (in other words 1), as a result, 1 will be substituted for all. You should not use such a writing style frequently. It lose readability, and may be hard to understand. Let's attach parenthesis if possible. For operator, classification exists such as Unary Operator, Binary Operator, Ternary Operator. This is classified by that how many operation value (operand) exist for one operator. For example, addition operator + of x+y is binary operator, and negative - of -a is unary operators. There is only one ternary operator, and that is Conditional operator ?:. Therefore this operator is called ternary operator commonly.

剰余演算子 Modulo operator

剰余演算子 % は割算の余りである.整数型にしか使えない.例えば 10%3 の結果は 1 である.

Modulo operator % is rest of division. It is usable only in integer type. For example, results of 10%3 is 1.LISH

インクリメント・デクリメント Increment decrement

後置インクリメント演算子(Post-increment) ++ と後置デクリメント演算子(Post-decrement) -- は, x++ とか y-- のように対象変数(または式)の後に置いて使う.前者は x を1増やして, 増やす前の結果 を返し,後者は y を1減らして, 減らす前の結果 を返す. 前置インクリメント演算子(Pre-increment) ++ と前置デクリメント演算子(Pre-decrement) -- は, ++x とか --y のように対象変数(または式)の後に置いて使う.前者は x を1増やして, 増やした後の結果 を返し,後者は y を1減らして, 減らした後の結果 を返す.

Trailing increment operator (Post-increment) ++ and Trailing decrement operator (Post-decrement) As for --, put it after object variable (or formula) to use it like x++ or y--. The former increases x by 1 and returns result before increasing it, and the latter reduces y by 1 and returns result before reducing it. Leading increment operator (Pre-increment) ++ and Leading decrement operator (Pre-decrement) As for --, put it after object variable (or formula) to use it like ++x or --y. The former increases x by 1 and returns result after having increased it, and the latter reduces y by 1 and returns result after reducing it.

このように, ++ と -- は2種類の意味を持つ.通常は, 前置 を使った方がよい.なぜなら,後置は増やしたり減らしたりする前の値を保持するために, 一時変数を使う からだ. int とかのサイズが小さい変数なら影響は小さいが,構造体やクラスなどの大きな型になると,コストが大きい. ++x とか --n を使おう

In this way, ++ and - - have two kinds of meaning. You should usually use leading. Because trailing uses temporary variable to hold previous value to increase/reduce. Impact of small size variable like int is small, but big type such as structure or class. Let's use ++x or --n.

代入演算子 Assignment operator

代入演算子には, = 以外にも, += とか -= などがある. x+=2 は, x=x+2 と等価である.

As well as =, there are += or - in assignment operator. x+=2 and x=x+2 are equivalence.

副作用 Side effect

式中で (x++)+1 などと書いたとしても, x の値が増えるタイミングがいつかは規格は定めていない( コンパイラの最適化のため ).規格が定めているのは,その式が完了するまでに x を1増やすこと,及び x++ の結果が増やす前の結果であることのみである.したがって, x=1 として, x=(x++)+5 のようなコードを書いたときに,最終的に x に代入されるのが 6 なのか 2 なのか,規定されていない.規格が定めているのは, 同じ式で複数回副作用がある計算をするな ということのみである.

Even if you write as (x++)+1 in the expression, timing that value of x increases is not determined in standard (for optimization of compiler). What standard determines is only that it increase x by 1 before the formula is completed, and that result of x++ is results before increasing it. Therefore, when you write code such as x=(x++)+5 as x=1, it is not provided that finally substituted for x is 6 or 2. What standard determines is only that you must not perform calculation with multiple side effect by the same formula.

条件演算子 Conditional operator

i=(a>b)?a:b と書くと, i には a>b が真なら a が,偽なら b が代入される.この演算子は優先順位が低いので,各演算対象には括弧を付けるようにした方がよい.例えば, i=(a>b)?(a+1):(b+1) など.

When you write as i=(a>b)?a:b, if a>b is true then a is substituted, if false b is substituted in i. Because this operator is low priority, you should attach parenthesis to each operand. For example, i=(a>b)? (a+1): (b+1).

sizeof 演算子 sizeof operator

sizeof(x) と書くと, x の型のサイズをバイトで返す.また, sizeof(double) と書くと, double 型のサイズをバイトで返す.構造体などのサイズを調べるために使われる.

When you write as sizeof(x), it return byte for size of type of x. In addition, when you write it as sizeof(double), it return byte for size of double type. It is used to examine size of such as structures.

コンマ演算子 Comma operator

C/C++では,コンマ[ , ]は演算子のひとつである.コンマ演算子は二項演算子で,結合規則は left to right (左結合)だ. a,b と書くと,コンマの右側の値,つまり b を返して a は棄却する .だから例えば, a,b,c,d と書くとこれは結合規則から ((a,b),c),d と等価で,最終的に d を返す.式中でこれを使うことはまずないが, for 制御文の初期設定式や再設定式でたまに用いられる.

In C/C++, Comma [ , ] is one of the operators. Comma operator is binary operator, and its associativity is left to right (the left association). When you write as a,b, it returns value on the right side of comma, in other words, returns b, and dismisses a. Therefore, for example, when you write as a,b,c,d, it is equivalent to ((a,b),c),d as in associativity, and finally returns d. It is rare that you use this In the expression, but it is sometimes used in formula of initial setup of for control statement and reset formula.

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  for (i=0,j=0; i<10; i++,j++)

これと同じことをコンマ演算子を使わずに書くと,数行長くなる.

When you write thing same as this without using comma operator, it becomes long for several lines.

名前空間 Namespace

高度なプログラムを作るようになると,さまざまなライブラリ(他人や自分が作った関数群,クラス群など)を使うようになる.例えば,行列ライブラリなどだ.こういったライブラリを利用するとき,そのライブラリで定義されている関数やグローバル変数と同じ識別子を自分のプログラムで定義すると,エラーとなる.自分が作っているプログラムでこの問題が起きているだけなら名前を変えればいいが,使いたいライブラリの間でこの問題が起きていたら,つまり同じ識別子を使ってしまっていたら,打つ手がない.このような問題を解決するために考えられたのが, 名前空間 である.

When you come to create advanced program, you come to use various libraries (Set of functions, class group that another person and yourself created). For example, matrix libraries. When using such a library, when you define function defined in the library and identifier same as global variable etc. in your program, error occurs. If this problem is taking place in only your program, you should change the name, but if this problem is taking place between libraries which you want to use, in other words, if the same identifier is used, there is not something to be done. Namespace is invented to solve such a problem.

名前空間は,識別子に階層を設けるためのものだ.ライブラリAが

Namespace is intended to make hierarchy for identifier. If library A declares function

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
int show status(void);
bool execute(void);

という関数を宣言し,ライブラリBが

as this, and library B declares function

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
int show status(void);

という関数を宣言していたら,show_status がライブラリAのものかBのものか区別できない.これを区別できるようにするために,次のようにして名前空間を定義する.

as this, You cannot distinguish whether show_status is thing of library A or thing of B. To distinguish this, define namespace as follows.

ライブラリAでは :

In library A:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  namespace libA  // 名前空間 libA を定義(名前空間の名前はなんでもよい)
  {
 int show status(void);
    bool execute(void);
  };

ライブラリBでは

In library B

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  namespace libB  // 名前空間 libB を定義
  {
 int show status(void);
  };

こうすると,libA::show_status, libB::show_status のようにして,それぞれの show_status を区別できるようになる.

If doing this way, you come to distinguish each show_status like libA::show_status, libB::show_status.

ちなみに,これまでのプログラム例で :

By the way, in past example program:

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  using namespace std;

というコードを何度か書いたが,この宣言によって std:: をつけずに名前空間 std の識別子を利用することができるようになる.

you wrote code as this for several times, and By this declaration, you come to be able to use identifier of namespace std without using std::.

コメント Comment

コメントとは,コンパイルされないメモのことである.関数や変数に説明を付けたり,アルゴリズムの意味などを書く.

Comment is memos which are not compiled. Add description to function and variable, write algorithmic meanings.ISH

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  int x;  // ユーザからの入力を格納
  cout << "input an integer:  ";
  cin >> x;
  /* double y;
  cout << "input a decimail num:  ";
  cin >> y;*/

ダブルスラッシュ // は一行コメント(その行のそれ以降は無視), /**/ はブロックコメント(はさまれているコードは無視)である.

Double slash // is line comment (ignore after it in the line), and /**/ is block comment (ignore code between /* and */).


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-30 (木) 07:17:04 (75d)