C語言中的單元運算子

你好啊,未來的編程超級巨星!今天,我們將踏上一段令人興奮的旅程,探索C語言中的單元運算子。如果你是編程新手,不必擔心——我將成為你的友好指南,我們將一步一步地探討這個主題。所以,抓起你的虛擬背包,我們開始吧!

C - Unary Operators

C語言中的增量運算子

讓我們從增量運算子開始,它就像是我們變量的神奇“+1”按鈕。在C語言中,我們使用“++”來增加一個值的數量。當我們想要計數或遍歷序列時,這非常方便。

使用增量運算子有兩種方式:

  1. 前增量:++變量
  2. 後增量:變量++

讓我們看看一些例子:

#include <stdio.h>

int main() {
int cookies = 5;

printf("我有%d個餅乾。\n", cookies);

// 前增量
printf("吃了一個之後:%d\n", ++cookies);

// 後增量
printf("當前數量:%d\n", cookies++);
printf("計數後:%d\n", cookies);

return 0;
}

輸出:

我有5個餅乾。
吃了一個之後:6
當前數量:6
計數後:7

在這個例子中,我們從5個餅乾開始。當我們使用前增量(++cookies)時,它會在使用之前立即增加數值。而後增量(cookies++)則首先使用當前值,然後再增加。

C語言中的減量運算子

現在,讓我們來認識一下減量運算子,它是增量的狡猾雙胞胎。它做相反的事情——從我們的變量中減去1。我們使用“--”來進行這個操作。

就像它的兄弟一樣,它也有兩種風格:

  1. 前減量:--變量
  2. 後減量:變量--

讓我們看看它是如何工作的:

#include <stdio.h>

int main() {
int lives = 3;

printf("你有%d條生命。\n", lives);

// 前減量
printf("糟糕!你失去了一條:%d\n", --lives);

// 後減量
printf("當前生命:%d\n", lives--);
printf("遊戲結束:%d\n", lives);

return 0;
}

輸出:

你有3條生命。
糟糕!你失去了一條: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

在這個例子中,我們的'map'(指針)引導我們找到了寶藏,我們甚至可以使用解引用運算子更改寶藏的值。這就像魔法一樣!

C語言中的邏輯非運算子(!)

邏輯非運算子就像一個叛逆者——它將真變為假,將假變為真。在C語言中,任何非零值都被視為真,零則為假。

#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

看我們的邏輯非運算子是如何翻轉天氣條件的?這就像有一個“相反日”按鈕!

C語言中的1的補碼運算子(~)

最後但並非最不重要,讓我們來談談1的補碼運算子。這個運算子會翻轉數字中的所有位元,將0變為1,將1變為0。這就像給你的二進制數字一個完整的改造!

#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的補碼運算子是如何翻轉每一個位元的。這就像把你的二進制數字翻過來一樣!

以上就是C語言中的所有單元運算子。請記住,熟練掌握需要練習,所以不要害怕在自己的代碼中嘗試這些運算子。編程愉快,願單元運算子與你同在!

運算子 名稱 描述
++ 增量 將值增加1
-- 減量 將值減少1
+ 單元加 指示正值(很少使用)
- 單元減 對表達式取負
& 地址運算子 返回變量的內存地址
* 解引用運算子 存取指針地址中的值
! 邏輯非 反轉運算元的邏輯狀態
~ 位元非(1的補碼) 反轉所有位元

Credits: Image by storyset