情報学部 | 菅沼ホーム | C/C++ 言語目次 |
データ型 バイト数と値の範囲 void * * char 1 -128 ~ 127(文字型,1 バイトの整数型) unsigned char 1 0 ~ 255(文字型,1 バイトの符号無し整数型) short 2 -32,768 ~ 32,767( 2 バイトの整数型) unsigned short 2 0 ~ 65,535( 2 バイトの符号無し整数型) int * システム依存(整数型) unsigned int * システム依存(符号無し整数型) long 4 -2,147,483,648 ~ 2,147,483,647( 4 バイトの整数型) unsigned long 4 0 ~ 4,294,967,295( 4 バイトの符号無し整数型) long long 8 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807( 8 バイトの整数型) unsigned long long 8 0 ~ 18,446,744,073,709,551,615( 8 バイトの符号無し整数型) float 4 3.4E±38(浮動小数点型,有効桁は約 7 桁) double 8 1.7E±308(浮動小数点型,有効桁は約 15 桁) long double * 拡張精度,システム依存(浮動小数点型) bool(C++) 1 true( 0 以外) or false( 0 )(論理型),数値の 0 は false に,その他は true に変換される auto(C++11) * 代入された値によって型を推論する
+ : 加算 - : 減算 * : 乗算 / : 除算(整数どうしの除算は,結果の小数点以下を切り捨て) % : 余り(整数演算に対してだけ使用可能) = : 代入 ++ : インクリメント演算子( 1 だけ増加) -- : デクリメント演算子( 1 だけ減少)
> より大きい a > b 式 a の値が式 b の値より大きいとき真 < より小さい a < b 式 a の値が式 b の値より小さいとき真 >= 以上 a >= b 式 a の値が式 b の値以上のとき真 <= 以下 a <= b 式 a の値が式 b の値以下のとき真 == 等しい a == b 式 a の値と式 b の値が等しいとき真 != 等しくない a != b 式 a の値と式 b の値が等しくないとき真 || 論理和 x || y 式 x が真か,または,式 y が真のとき真 && 論理積 x && y 式 x が真で,かつ,式 y が真のとき真 ! 否定 ! x 式 x が偽のとき真
| 論理和 x | y 対応するビットのいずれかが 1 のとき真. & 論理積 x & y 対応するビットの双方が 1 のとき真 ^ 排他的論理和 x ^ y 対応するビットが異なるのとき真 ~ 1 の補数 ~ x ビット毎に 1 と 0 を反転する << 左にシフト x << 3 3 ビット左にシフト.x を 23 倍することに相当. >> 右にシフト x >> 3 3 ビット右にシフト.x を 23 で割ることに相当.
&value
int *point;
point = &value;
data = *point;
if (論理式) { 文1(複数の文も可) (論理式が真の場合に実行) } else { 文2(複数の文も可) (論理式が偽の場合に実行) }
if (論理式1) { 文1(複数の文も可) (論理式1が真の場合に実行) } else if (論理式2) { 文2(複数の文も可) (論理式2が真の場合に実行) } ・・・ else { 文n(複数の文も可) (いずれの論理式も偽である場合に実行) }
switch (式) { [case 定数式1 :] [文1] [case 定数式2 :] [文2] ・・・・・ [default :] [文n] }
for (初期設定; 論理式; 後処理) { 文(複数の文も可) (論理式が真である限り繰り返し実行) }
for (変数宣言 : 範囲) { // 範囲 for 文 文(複数の文も可) }
while (論理式) { 文(複数の文も可) (論理式が真である限り繰り返し実行) }
do { 文(複数の文も可) (論理式が真である限り繰り返し実行, ただし,最初は必ず実行) } while (論理式) ;
int x[4]; int y[2][3];
int x[4] = {1, 2, 3, 4}; // int x[] = {1, 2, 3, 4}; int y[2][3] = {{10, 20, 30}, {40, 50, 60}}; // int y[][3] = {{10, 20, 30}, {40, 50, 60}};
01 #include <stdio.h> 02 03 int main() 04 { 05 int x[4] = {100, 200, 300, 400}; 06 int *y = &x[0]; // int *y = x; でも良い 07 int *z = &x[2]; 08 09 printf("%d %d\n", x[2], *(x+2)); 10 printf("%d %d\n", y[2], *(y+2)); 11 printf("%d %d\n", z[0], *z); 12 13 return 0; 14 }
int y[4]; y = x;
01 int *x = new int [4]; // int x[4] とほとんど同じ 02 //int *x = new int [4] {1, 2, 3, 4}; // 初期設定も可能 03 //int *x = new int [4] = {1, 2, 3, 4}; // error 04 //int *x = new int [] {1, 2, 3, 4}; // error 05 // 以下,int y[2][3] とほぼ同じ,ただし,連続領域とは限らない 06 int **y = new int *[2]; 07 for (int i1 = 0; i1 < 2; i1++) 08 y[i1] = new int [3]; 09 // 以下のような方法で初期設定も可能 10 int **y = new int *[2]; 11 y[0] = new int [3] {1, 2, 3}; 12 y[1] = new int [3] {4, 5, 6};
delete [] x; for (int i1 = 0; i1 < 3; i1++) delete [] y[i1]; delete [] y;
戻り値の型 関数名 ( 引数リスト ) { 処理の中身 }
#include <stdio.h> int add(int a, int b = 0) { return a + b; } int main() { int x = 10, y = 20; printf("和 = %d\n", add(x, y)); printf("和 = %d\n", add(x)); return 0; }
#include <stdio.h> void add(int a, int b, int *c) { *c = a + b; } int main() { int x = 10, y = 20, z; add(x, y, &z); printf("和 = %d\n", z); return 0; }
データ型 &別名 = 式;
int &y = x;
x = 10; y = 10;
#include <stdio.h> void add(int a, int b, int &c) { c = a + b; } int main() { int x = 10, y = 20, z; add(x, y, z); printf("和 = %d\n", z); return 0; }
#include <stdio.h> void add(int a, int b, int c[]) // void add(int a, int b, int *c) でも可能 { c[0] = a + b; c[1] = a - b; } int main() { int x = 10, y = 20; int z[2]; // int *z = new int [2]; でも可能 add(x, y, z); printf("和 = %d, 差 = %d\n", z[0], z[1]); return 0; }
#include <stdio.h> int *add(int a, int b) { int *c = new int [2]; c[0] = a + b; c[1] = a - b; return c; } int main() { int x = 10, y = 20, *z; z = add(x, y); printf("和 = %d, 差 = %d\n", z[0], z[1]); delete [] z; return 0; }
int (*sub)(double, char *)
01 #include <stdio.h> 02 03 int add(int a, int b) 04 { 05 return a + b; 06 } 07 08 int mult(int a, int b) 09 { 10 return a * b; 11 } 12 13 int cal(int x, int y, int (*sub)(int, int)) 14 { 15 return sub(x, y); 16 } 17 18 int main() 19 { 20 printf("和 %d\n", cal(2, 3, add)); 21 printf("積 %d\n", cal(2, 3, mult)); 22 int (*fun)(int, int) = &add; 23 printf("和 %d\n", fun(2, 3)); 24 25 return 0; 26 }
add 2 3
int main ( int argc, char *argv[], char *envp[] )
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[], char *envp[]) { int i1, k, sum = 0; /* 引数の内容の出力 */ printf(" 引数の数 %d\n",argc); printf(" プログラム名 %s\n",argv[0]); for (i1 = 1; i1 < argc; i1++) { k = atoi(argv[i1]); /* 文字を整数に変換 */ printf(" %d 番目の引数 %d\n", i1+1, k); sum += k; } /* 結果の表示 */ printf("結果=%d\n", sum); return 0; }
class Example1 { int x; // プライベートメンバー変数 ・・・ // メンバー関数だけから参照可能なメンバー変数 protected: int y; // 派生クラスだけから参照可能なメンバー変数 ・・・ public: int z; // パブリックメンバー変数 ・・・ // いずれの関数からも参照可能なメンバー変数 private: double fun1(int); // プライベートメンバー関数 ・・・ // メンバー関数だけから参照可能なメンバー関数 protected: double fun2(int); // 派生クラスだけから参照可能なメンバー関数 ・・・ public: double fun3(int); // パブリックメンバー関数 ・・・ // いずれの関数からも参照可能なメンバー関数 friend double fun4(int); // フレンド関数(通常の関数であるが,メンバー関数と同じ参照権限を持つ) ・・・ friend class Example2; // フレンドクラス(クラス Example1 と同じ参照権限を持つ) ・・・ };
#include <stdio.h> class Complex { private: double real; double imaginary; public: // 引数のないコンストラクタ Complex() {}; // 引数のあるコンストラクタ Complex(double a, double b = 0.0) { real = a; imaginary = b; } // 値の設定するためのメンバー関数 void set(double a, double b = 0.0); // 出力するためのメンバー関数 void print(); }; void Complex::set(double a, double b) { real = a; imaginary = b; } void Complex::print() { printf("実数部 = %f, 虚数部 = %f\n", real, imaginary); } int main() { // 初期設定を行う場合 Complex x(1.0); x.print(); // 初期設定を行わない場合 Complex y; y.set(5.1, 1.5); // real は private であるため,y.real = 5.1; などは不可能 y.print(); // 初期設定を行う場合(ポインター) Complex *z = new Complex (1.0, 2.0); z->print(); return 0; }
z = x + y;
operator+
z = x + y;
z = x.(operator+)(y);
#include <stdio.h> class Complex { private: double real; double imaginary; public: // 引数のないコンストラクタ Complex() {}; // 引数のあるコンストラクタ Complex(double a, double b = 0.0) { real = a; imaginary = b; } // 値の設定するためのメンバー関数 void set(double a, double b = 0.0); // 出力するためのメンバー関数 void print(); // + 演算子のオーバーロード friend Complex operator +(const Complex &, const Complex &); }; void Complex::set(double a, double b) { real = a; imaginary = b; } void Complex::print() { printf("実数部 = %f, 虚数部 = %f\n", real, imaginary); } Complex operator +(const Complex &a, const Complex &b) { Complex c; c.real = a.real + b.real; c.imaginary = a.imaginary + b.imaginary; return c; } int main() { Complex x(1.0); // 初期設定を行う場合 Complex y, z; // 初期設定を行わない場合 x.print(); y.set(5.1, 1.5); y.print(); z = x + y; z.print(); return 0; }
01 #include <stdio.h> 02 03 class Complex { 04 public: 05 double real; 06 double imaginary; 07 // 引数のないコンストラクタ 08 Complex() {}; 09 // 引数のあるコンストラクタ 10 Complex(double a, double b = 0.0) 11 { 12 real = a; 13 imaginary = b; 14 } 15 }; 16 17 int main() 18 { 19 Complex x1(1.0, 2.0), x2; 20 Complex *y1 = new Complex(3.0, 4.0), *y2; 21 22 x2 = x1; 23 x2.real = 5.0; 24 printf("x1 実数部 = %f, 虚数部 = %f\n", x1.real, x1.imaginary); 25 printf("x2 実数部 = %f, 虚数部 = %f\n", x2.real, x2.imaginary); 26 y2 = y1; 27 y2->real = 5.0; 28 printf("y1 実数部 = %f, 虚数部 = %f\n", y1->real, y1->imaginary); 29 printf("y2 実数部 = %f, 虚数部 = %f\n", y2->real, y2->imaginary); 30 31 return 0; 32 }
#include <stdio.h> #include <string.h> class String { public: int n; char *s; // 引数のないコンストラクタ String () { n = 0; } // 引数のあるコンストラクタ String (char *a) { n = strlen(a); s = new char [n+1]; strcpy(s, a); } // デストラクタ ~String() { if (n > 0) { printf(" delete start %d\n", strlen(s)); delete [] s; printf(" delete end\n"); } } // 指定した位置の文字を変更するためのメンバー関数 void mod(int k, char a) { s[k] = a; } // 出力するためのメンバー関数 void print() { printf("文字列 %s\n", s); } }; int main() { String x("abcdefg"), y; y = x; y.mod(1, 'B'); x.print(); y.print(); return 0; }
#include <stdio.h> #include <string.h> class String { public: int n; char *s; // 引数のないコンストラクタ String () { n = 0; } // 引数のあるコンストラクタ String (char *a) { n = strlen(a); s = new char [n+1]; strcpy(s, a); } // デストラクタ ~String() { if (n > 0) { printf(" delete start %d\n", strlen(s)); delete [] s; printf(" delete end\n"); } } // 指定した位置の文字を変更するためのメンバー関数 void mod(int k, char a) { s[k] = a; } // 出力するためのメンバー関数 void print() { printf("文字列 %s\n", s); } // = 演算子のオーバーロード String & operator= (const String &); }; String & String::operator= (const String &b) { if (&b == this) // 自分自身への代入を防ぐ return *this; else { if (n > 0) delete [] s; // 代入する前のメモリを解放 s = new char [b.n+1]; // メモリの確保 n = b.n; // 値の代入 strcpy(s, b.s); return *this; } } int main() { String x("abcdefg"), y; y = x; y.mod(1, 'B'); x.print(); y.print(); return 0; }
#include <stdio.h> #include <string.h> class String { public: int n; char *s; // 引数のないコンストラクタ String () { n = 0; } // 引数のあるコンストラクタ String (char *a) { n = strlen(a); s = new char [n+1]; strcpy(s, a); } // デストラクタ ~String () { if (n > 0) { printf(" delete start %d\n", strlen(s)); delete [] s; printf(" delete end\n"); } } // 出力するためのメンバー関数 void print() { printf("文字列 %s\n", s); } // = 演算子のオーバーロード String & operator= (const String &); // + 演算子のオーバーロード friend String & operator +(const String &, const String &); }; String & String::operator= (const String &b) { if (&b == this) // 自分自身への代入を防ぐ return *this; else { if (n > 0) { printf(" delete for =\n"); delete [] s; // 代入する前のメモリを解放 } s = new char [b.n+1]; // メモリの確保 n = b.n; // 値の代入 strcpy(s, b.s); return *this; } } String & operator +(const String &a, const String &b) { String *str = new String(); str->n = a.n + b.n; str->s = new char [str->n+1]; strcpy(str->s, a.s); strcat(str->s, b.s); return *str; } int main() { String x("abc"), y("defg"), z("ABCDE"); z = x + y; z.print(); return 0; }
class クラス名 : [アクセス権] 基底クラス名 [,[アクセス権] 基底クラス・・・] { 変更部分 }
#include <stdio.h> class Base { protected: int n; int step; // コンストラクタ Base (int sp) { step = sp; } public: // 出力するためのメンバー関数 void print() { printf("value = %d\n", n); } // 加算 void add() { n += step; } // 減算 void sub() { n -= step; } }; class Number : public Base // Base の継承 { public: // コンストラクタ Number (int n1, int sp = 2) : Base(sp) { n = n1; } }; int main() { Number x(10), y(5, 4); x.add(); x.print(); y.sub(); y.print(); return 0; }
template <テンプレート引数宣言> 関数宣言または定義
/****************************/ /* 関数テンプレート */ /* coded by Y.Suganuma */ /****************************/ #include <iostream> #include <string.h> using namespace std; /**************************/ /* クラスTestに関する定義 */ /**************************/ class Test { public: char *str; int n; Test () {} Test (char *str1, int n1) { str = new char [strlen(str1)+1]; strcpy(str, str1); n = n1; } bool operator< (Test &t) // < に対するオーバーロード { return strcmp(str, t.str) < 0 ? true : false; } }; /****************************************/ /* 最小値を返す関数(関数テンプレート) */ /* a,b : 比較するデータ */ /****************************************/ template <class cl> cl min_t(cl a, cl b) { return a < b ? a : b; } /**********************************************/ /* 最小値を返す関数(関数名のオーバーロード) */ /* a,b : 比較するデータ */ /**********************************************/ int min_o(int a, int b) { return a < b ? a : b; } double min_o(double a, double b) { return a < b ? a : b; } Test min_o(Test a, Test b) { return strcmp(a.str, b.str) < 0 ? a : b; } /******************/ /* mainプログラム */ /******************/ int main() { // 関数テンプレート int i = 0, j = 1; double x = 10.0, y = 5.5; Test a("xyz",1), b("abc", 2), c = min_t(a, b); cout << "テンプレート:int " << min_t(i, j) << " double " << min_t(x, y) << " クラス Test (" << c.str << "," << c.n << ")\n"; // 関数名のオーバーロード c = min_o(a, b); cout << "オーバーロード:int " << min_o(i, j) << " double " << min_o(x, y) << " クラス Test (" << c.str << "," << c.n << ")\n"; return 0; }
テンプレート:int 0 double 5.5 クラス Test (abc,2) オーバーロード:int 0 double 5.5 クラス Test (abc,2)
template <テンプレート引数宣言> class name { ・・・・・ };
// コンストラクタ(デストラクタも同様) template <テンプレート引数宣言> クラス名 <テンプレート引数> :: クラス名 (引数) { ・・・・・ }; // メンバー関数 template <テンプレート引数宣言> クラス名 <テンプレート引数> :: メンバー関数名 (引数) { ・・・・・ };
#include <iostream> using namespace std; template <class Tp, int size> class Vector { Tp *p; public: Vector(); // コンストラクタ void print(int); // 出力 void input() // 入力 { int i1; for (i1 = 0; i1 < size; i1++) { cout << " " << i1+1 << " 番目の要素は? "; cin >> p[i1]; } } }; template <class Tp, int size> Vector <Tp, size>::Vector() { p = new Tp [size]; } template <class Tp, int size> void Vector <Tp, size>::print(int k) { if (k < 0 || k > size-1) cout << " 要素番号が不適当です\n"; else cout << " " << (k+2) << " 番目の要素は " << p[k] << endl; } int main() { int k = 0, sw; cout << "整数(0) or 実数(1) ? "; cin >> sw; // 整数 if (sw == 0) { Vector < int, 3 > iv; cout << "整数ベクトル\n"; iv.input(); while (k >= 0) { cout << "要素番号は "; cin >> k; iv.print(k); } } // 実数 else { Vector < double, 3 > dv; cout << "実数ベクトル\n"; dv.input(); while (k >= 0) { cout << "要素番号は "; cin >> k; dv.print(k); } } return 0; }
01 /****************************/ 02 /* 変数の有効範囲(スコープ) */ 03 /* coded by Y.Suganuma */ 04 /****************************/ 05 #include <stdio.h> 06 07 /*******************/ 08 /* クラス Example1 */ 09 /*******************/ 10 class Example1 { 11 int pri; 12 protected : 13 int pro; 14 public : 15 int pub; 16 17 Example1() { 18 pub = 1000; 19 pri = 2000; 20 pro = 3000; 21 } 22 23 void sub1() { 24 printf("sub1 pub %d pri %d pro %d\n", pub, pri, pro); 25 } 26 }; 27 28 /*******************/ 29 /* クラス Example2 */ 30 /*******************/ 31 class Example2 : public Example1 { 32 33 public : 34 35 Example2() {} 36 37 void sub2() { 38 printf("sub2 pub %d pro %d\n", pub, pro); 39 // printf("sub2 pri %d\n", pri); // 許されない 40 } 41 }; 42 43 void sub(); 44 45 /****************/ 46 /* main program */ 47 /****************/ 48 int main() 49 { 50 // ブロック 51 int x = 10; 52 if (x > 5) { 53 printf("block x %d\n", x); 54 int x = 15; 55 int y = 20; 56 printf("block x %d\n", x); 57 printf("block y %d\n", y); 58 } 59 sub(); 60 printf("x %d\n", x); 61 // printf("y %d\n", y); // y が未定義 62 extern int z; 63 printf("z %d\n", z); 64 // クラス 65 Example2 ex = Example2(); 66 ex.sub1(); 67 ex.sub2(); 68 printf("public member( pub ) %d\n", ex.pub); 69 70 return 0; 71 } 72 73 int z = 30; 74 75 /************/ 76 /* 関数 sub */ 77 /************/ 78 void sub() 79 { 80 int x = 40; 81 printf(" sub x %d\n", x); 82 printf(" sub z %d\n", z); 83 }
block x 10 block x 15 block y 20 sub x 40 sub z 30 x 10 z 30
sub1 pub 1000 pri 2000 pro 3000 sub2 pub 1000 pro 3000 public member( pub ) 1000
情報学部 | 菅沼ホーム | C/C++ 言語目次 |