C言語における単項演算子

こんにちは、未来のコーディングスーパースターの皆さん!今日は、C言語における単項演算子の素晴らしい世界に旅立ちます。プログラミングが初めての方でも心配しないでください。あなたの友好的なガイドとして、私がついているからです。ステップバイステップにこのトピックを探求していきましょう。だから、仮想のバックパックを手に取り、出発しましょう!

C - Unary Operators

C言語におけるインクリメント演算子

まず、インクリメント演算子から始めます。これは、私たちの変数に対する魔法の「+1」ボタンのようなものです。C言語では、値をインクリメントするために「++」を使用します。これは、ものを数えたり、シーケンスを移動する際に非常に便利です。

インクリメント演算子の使用方法は2つあります:

  1. 事前インクリメント:++変数
  2. 事後インクリメント:変数++

いくつかの例を見てみましょう:

#include <stdio.h>

int main() {
int cookies = 5;

printf("私は%d個のクッキーをお持ちしています。\n", cookies);

// 事前インクリメント
printf("1個食べた後:%d\n", ++cookies);

// 事後インクリメント
printf("現在の数:%d\n", cookies++);
printf("数えた後:%d\n", cookies);

return 0;
}

出力:

私は5個のクッキーをお持ちしています。
1個食べた後:6
現在の数:6
数えた後:7

この例では、まず5個のクッキーから始めます。事前インクリメント(++cookies)を使用すると、値を即座にインクリメントしてから使用します。事後インクリメント(cookies++)では、まず現在の値を使用し、その後インクリメントします。

C言語におけるデクリメント演算子

次に、デクリメント演算子を紹介します。これはインクリメントのようなスニークな双子の兄弟です。インクリメントとは逆に、変数から1を引きます。この操作には「--」を使用します。

兄弟のように、これも2つの形を持っています:

  1. 事前デクリメント:--変数
  2. 事後デクリメント:変数--

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

#include <stdio.h>

int main() {
int lives = 3;

printf("あなたの残りライフ:%d\n", lives);

// 事前デクリメント
printf("あっ、1つ失った:%d\n", --lives);

// 事後デクリメント
printf("現在のライフ:%d\n", lives--);
printf("ゲームオーバー:%d\n", lives);

return 0;
}

出力:

あなたの残りライフ:3
あっ、1つ失った:2
現在のライフ:2
ゲームオーバー:1

ここでは、想定のゲームで3つのライフから始めます。事前デクリメント(--lives)は即座にカウントを減らし、事後デクリメント(lives--)はまず現在の値を使用し、その後減らします。

C言語における単項「+」演算子

単項「+」演算子は、最初は少し余計に聞こえるかもしれません。そうですか、ポジティブな数はすでにポジティブですよね?そうですが、この演算子には、特に異なるデータ型を使用する際に便利な使い方があります。

#include <stdio.h>

int main() {
int num = 42;
float pi = 3.14;

printf("ポジティブな整数:%d\n", +num);
printf("ポジティブな浮動小数点数:%f\n", +pi);

return 0;
}

出力:

ポジティブな整数:42
ポジティブな浮動小数点数:3.140000

この例では、単項「+」は値を変更しませんが、それらがポジティブな数として扱われることを保証します。変数に「ポジティブでいてね、仲間!」という小さな励ましをするようなものです。

C言語における単項「-」演算子

単項「-」演算子は、ポジティブな数をネガティブな数に(そしてその逆に)変える魔法の杖のようなものです。値の符号を反転させる必要がある場合に非常に便利です。

#include <stdio.h>

int main() {
int temperature = 25;
float balance = -100.50;

printf("元の温度:%d\n", temperature);
printf("ゼロ度以下:%d\n", -temperature);

printf("元の残高:%.2f\n", balance);
printf("負債クリア:%.2f\n", -balance);

return 0;
}

出力:

元の温度:25
ゼロ度以下:-25
元の残高:-100.50
負債クリア:100.50

暖かい日を寒い日に、そしてただの「-」記号で負債をクリアするパワーを見ましたか?それが単項マイナス演算子の力です!

C言語におけるアドレス演算子(&)

次に、もう少し高度なトピックに飛び込みましょう——アドレス演算子。この小さなアンパサンド(&)は、私たちの変数がコンピュータのメモリのどこにあるかを正確に教えてくれるGPSのようなものです。

#include <stdio.h>

int main() {
int age = 25;
float height = 1.75;

printf("年齢の値:%d\n", age);
printf("年齢のアドレス:%p\n", (void*)&age);

printf("身長の値:%.2f\n", height);
printf("身長のアドレス:%p\n", (void*)&height);

return 0;
}

出力(注:実際のアドレスは異なります):

年齢の値:25
年齢のアドレス:0x7ffd5e8e3994
身長の値:1.75
身長のアドレス:0x7ffd5e8e3998

ここでは、変数の値だけでなく、メモリの中の秘密の隠れ家も覗いています。クールでしょう?

C言語におけるデリファレンス演算子(*)

デリファレンス演算子は、特定のメモリアドレスにある値を見つけるための宝島地図のようなものです。これは、アドレス演算子の対応物です。

#include <stdio.h>

int main() {
int treasure = 1000;
int *map = &treasure;

printf("宝の値:%d\n", treasure);
printf("地図が指す先:%p\n", (void*)map);
printf("見つけた宝:%d\n", *map);

*map = 2000;  // 宝を変更!
printf("新しい宝の値:%d\n", treasure);

return 0;
}

出力:

宝の値:1000
地図が指す先:0x7ffd5e8e3994
見つけた宝:1000
新しい宝の値:2000

この例では、私たちの「地図」(ポインタ)が宝を見つける手助けをして、デリファレンス演算子を使用して宝の値を変更することもできます。まるで魔法のようです!

C言語における論理NOT演算子(!)

論理NOT演算子は、レベルを反転させる反逆者のようなものです。真を偽に、偽を真に変えます。C言語では、0以外の値は真で、0は偽と見なされます。

#include <stdio.h>

int main() {
int sunny = 1;  // 1は真
int rainy = 0;  // 0は偽

printf("晴れていますか? %d\n", sunny);
printf("晴れていないですか? %d\n", !sunny);

printf("雨ですか? %d\n", rainy);
printf("雨でないですか? %d\n", !rainy);

return 0;
}

出力:

晴れていますか? 1
晴れていないですか? 0
雨ですか? 0
雨でないですか? 1

論理NOT演算子が天候の状況を反転させているのを見ましたか?まるで「反対日」ボタンをお持ちしているようです!

C言語における1's補数演算子(~)

最後に、1's補数演算子について話しましょう。この演算子は、数のすべてのビットを反転させ、0を1に、そしてその逆にします。まるでバイナリ数に完全なメイクオーバーを施しているようなものです!

#include <stdio.h>

int main() {
unsigned char a = 5;  // バイナリ:00000101
unsigned char b = ~a; // バイナリ:11111010

printf("元の値:%d\n", a);
printf("補数値:%d\n", b);

printf("バイナリ表現:\n");
printf("a: ");
for (int i = 7; i >= 0; i--) {
printf("%d", (a >> i) & 1);
}
printf("\nb: ");
for (int i = 7; i >= 0; i--) {
printf("%d", (b >> i) & 1);
}
printf("\n");

return 0;
}

出力:

元の値:5
補数値:250
バイナリ表現:
a: 00000101
b: 11111010

この例では、1's補数演算子がすべてのビットを反転させていることがわかります。バイナリ数を表裏反転させるようなものです!

そしてそうです、皆さん!私たちはC言語におけるすべての単項演算子を探求しました。覚えるためには練習が必要ですので、これらの演算子を自分のコードで色々と試してみてください。幸せなコーディングを、そして単項演算子があなたと共にあることを!

演算子 名前 説明
++ インクリメント 値を1増やす
-- デクリメント 値を1減らす
+ 単項プラス ポジティブな値を示す(あまり使用されない)
- 単項マイナス 値を否定する
& アドレス演算子 変数のメモリアドレスを返す
* デリファレンス演算子 ポインタが指すメモリの値にアクセスする
! 論理NOT 论理状態を反転する
~ ビット単位NOT(1's補数) すべてのビットを反転する

Credits: Image by storyset