| 情報学部 | 菅沼ホーム | 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++ 言語目次 |