C++のオペレータ:プログラミング魔法の扉

こんにちは、未来のコード魔術師たち!今日は、C++のオペレータの世界に一緒に足を踏み入れる興奮的な旅を楽しむことになります。これまで一度もコードを書いたことがない方也不用担心——私はこれまでに多くの生徒を指導してきましたので、每一步を丁寧に案内します。では、virtual wand(キーボード)を握りしめ、プログラミングの魔法をかけてみましょう!

C++ Operators

オペレータとは?

まず、オペレータとは何かを理解しましょう。C++では、オペレータはコンピュータに特定の数学的または論理的な操作を行うよう指示する特別な記号です。これらはあなたの魔法の本の魔法の言葉と考えてください——それぞれが独特のことをします!

算術オペレータ

まずは基本から——算術オペレータです。これらは数学の授業で familiarなものですが、今度はコンピュータに計算を行わせるために使います!

以下はC++の算術オペレータの表です:

オペレータ 説明
+ 加算 a + b
- 減算 a - b
* 掛け算 a * b
/ 除算 a / b
% 剰余 a % b
++ 増加 a++ or ++a
-- 減少 a-- or --a

これらを実際に見てみましょう:

#include <iostream>
using namespace std;

int main() {
int a = 10, b = 3;

cout << "a + b = " << a + b << endl;  // 出力: 13
cout << "a - b = " << a - b << endl;  // 出力: 7
cout << "a * b = " << a * b << endl;  // 出力: 30
cout << "a / b = " << a / b << endl;  // 出力: 3
cout << "a % b = " << a % b << endl;  // 出力: 1

cout << "a++ = " << a++ << endl;  // 出力: 10
cout << "Now a = " << a << endl;  // 出力: 11

cout << "++b = " << ++b << endl;  // 出力: 4
cout << "Now b = " << b << endl;  // 出力: 4

return 0;
}

この例では、さまざまな算術操作を行っています。a++が10を出力した後、aが11になることに注意してください。これはa++がポストフィックスインクリメントであり、値を使った後でインクリメントされるからです。一方、++bはプリフィックスインクリメントであり、値をインクリメントした後で使われます。

関係オペレータ

次に、関係オペレータです。これらは値を比較し、true(1)またはfalse(0)を返します。これらは魔法の決闘の裁きの者と考えてください!

以下は関係オペレータの表です:

オペレータ 説明
== 等しい a == b
!= 等しくない a != b
> 大きい a > b
< 小さい a < b
>= 大きいまたは等しい a >= b
<= 小さいまたは等しい a <= b

これらを実行してみましょう:

#include <iostream>
using namespace std;

int main() {
int a = 10, b = 5;

cout << "a == b is " << (a == b) << endl;  // 出力: 0 (false)
cout << "a != b is " << (a != b) << endl;  // 出力: 1 (true)
cout << "a > b is " << (a > b) << endl;    // 出力: 1 (true)
cout << "a < b is " << (a < b) << endl;    // 出力: 0 (false)
cout << "a >= b is " << (a >= b) << endl;  // 出力: 1 (true)
cout << "a <= b is " << (a <= b) << endl;  // 出力: 0 (false)

return 0;
}

この魔法のプログラムでは、abをさまざまな関係オペレータで比較しています。C++では、trueは1、falseは0で表されます。

論理オペレータ

次に、論理を加えましょう!論理オペレータは条件文を結合します。

以下は論理オペレータの表です:

オペレータ 説明
&& 論理AND a && b
|| 論理OR a || b
! 論理NOT !a

これらで魔法をかけましょう:

#include <iostream>
using namespace std;

int main() {
bool a = true, b = false;

cout << "a && b is " << (a && b) << endl;   // 出力: 0 (false)
cout << "a || b is " << (a || b) << endl;   // 出力: 1 (true)
cout << "!a is " << (!a) << endl;           // 出力: 0 (false)
cout << "!b is " << (!b) << endl;           // 出力: 1 (true)

return 0;
}

この魔法の呪文では、論理オペレータを使ってブール値を結合または否定しています。&&は両方のオペランドがtrueの場合にのみtrueを返し、||は少なくとも一方のオペランドがtrueの場合にtrueを返します。

ビットwiseオペレータ

次は、高度な魔法——ビットwiseオペレータです。これらは整数値の個々のビットに対して操作を行います。これらはプログラミングの世界のマイクロスペルと考えてください!

以下はビットwiseオペレータの表です:

オペレータ 説明
& ビットwise AND a & b
| ビットwise OR a | b
^ ビットwise XOR a ^ b
~ ビットwise NOT ~a
<< 左シフト a << n
>> 右シフト a >> n

ビットマジックを見てみましょう:

#include <iostream>
using namespace std;

int main() {
unsigned int a = 60;  // 60 = 0011 1100 in binary
unsigned int b = 13;  // 13 = 0000 1101 in binary

cout << "a & b = " << (a & b) << endl;   // 出力: 12 (0000 1100 in binary)
cout << "a | b = " << (a | b) << endl;   // 出力: 61 (0011 1101 in binary)
cout << "a ^ b = " << (a ^ b) << endl;   // 出力: 49 (0011 0001 in binary)
cout << "~a = " << (~a) << endl;         // 出力: -61 (1100 0011 in binary)
cout << "a << 2 = " << (a << 2) << endl; // 出力: 240 (1111 0000 in binary)
cout << "a >> 2 = " << (a >> 2) << endl; // 出力: 15 (0000 1111 in binary)

return 0;
}

この呪文は、私たちの数の個々のビットに対して操作を行っています。例えば、&は対応するビットペアに対してAND操作を行い、|はORを行います。

代入オペレータ

代入オペレータは変数に値を代入するために使用されます。これらはあなたの魔法の本に書かれるクィルと考えてください!

以下は代入オペレータの表です:

オペレータ 説明
= 単純代入 a = b
+= 加算代入 a += b
-= 減算代入 a -= b
*= 掛け算代入 a *= b
/= 除算代入 a /= b
%= 剰余代入 a %= b
<<= 左シフト代入 a <<= b
>>= 右シフト代入 a >>= b
&= ビットwise AND代入 a &= b
^= ビットwise XOR代入 a ^= b
|= ビットwise OR代入 a |= b

代わりに値を書き込むプログラムを見てみましょう:

#include <iostream>
using namespace cout;

int main() {
int a = 10;

cout << "Initial value of a: " << a << endl;

a += 5;  // 同じこと: a = a + 5
cout << "After a += 5: " << a << endl;

a -= 3;  // 同じこと: a = a - 3
cout << "After a -= 3: " << a << endl;

a *= 2;  // 同じこと: a = a * 2
cout << "After a *= 2: " << a << endl;

a /= 4;  // 同じこと: a = a / 4
cout << "After a /= 4: " << a << endl;

a %= 3;  // 同じこと: a = a % 3
cout << "After a %= 3: " << a << endl;

return 0;
}

この魔法のスクリプトでは、さまざまな代入オペレータを使ってaの値を変更しています。これらのオペレータは、代入と別の操作を結合して、コードをより簡潔にします。

その他のオペレータ

C++には、他のカテゴリに当てはまらないいくつかのオペレータもあります。これらはあなたの魔法のデッキのワイルドカードと考えてください!

以下はその他のオペレータの表です:

オペレータ 説明
sizeof 変数のサイズを返す sizeof(a)
?: 三項オペレータ condition ? expr1 : expr2
& 変数のアドレスを返す &a
* ポインタ変数 *ptr
. 構造体変数のメンバにアクセス object.member
-> ポインタを通じて構造体のメンバにアクセス ptr->member

これらを見てみましょう:

#include <iostream>
using namespace cout;

int main() {
int a = 10;
int* ptr = &a;

cout << "Size of int: " << sizeof(int) << " bytes" << endl;
cout << "Value of a: " << a << endl;
cout << "Address of a: " << &a << endl;
cout << "Value pointed by ptr: " << *ptr << endl;

int b = (a > 5) ? 1 : 0;
cout << "b = " << b << endl;

return 0;
}

この魔法の呪文では、sizeofを使ってintのサイズを取得し、&を使ってaのアドレスを取得し、*を使ってポインタをデリファレンスしています。三項オペレータ?:はif-else文の短形式です。

オペレータの優先順位

C++のオペレータには優先順位があり、これは数学と同様に、式内の操作がどの順序で行われるかを決定します。これは魔法の戦いの規則のように、あるスペルが他のスペルより優先されることを考えてください!

以下はオペレータの優先順位の簡易表です(最も高い優先順位から):

優先順位 オペレータ
1 ::
2 () [] -> . ++ --
3 ! ~ ++ -- + - * & (type) sizeof
4 * / %
5 + -
6 << >>
7 < <= > >=
8 == !=
9 &
10 ^
11 |
12 &&
13 ||
14 ?:
15 = += -= *= /= %= >>= <<= &= ^= |=
16 ,

忘れても構いません。括弧を使ってデフォルトの優先順位をオーバーライドし、明示的な操作の順序を指定することができます。

そして、ここまでで、C++のオペレータの魔法の初めてのレッスンが終了しました。練習すれば完璧になりますので、これらのコードの魔法を続けて練習してください。编译エラーが少なくて済むことを祈っています!

Credits: Image by storyset