iT邦幫忙

2

【從零開始的 C 語言筆記】第四篇-基本的運算子介紹 & 應用

  • 分享至 

  • xImage
  •  

不怎麼重要的前言

上一篇我們大概的介紹程式的結構,也出了一個小作業,不曉得大家有沒有試試看呢?

其實寫程式真的沒有想像中那麼困難的,就像學英文一樣好好的學習、理解文法,就可以很好上手了,希望大家不要害怕來跟著一步一步學習吧!


上次的小作業--列印三角形

方法一、

#include <stdio.h>

int main(){
    printf("*\n");
    printf("**\n");
    printf("***\n");
    printf("****\n");
    printf("*****\n");

    return 0;
}

方法二、

#include <stdio.h>

int main(){
    printf("*\n**\n***\n****\n*****\n");

    return 0;
}

方法一定不只這兩種,也不是只有這兩種方法才是對的,多去嘗試吧!


運算子是什麼?

可能大家對運算子這個名詞有點陌生,所以我們來舉個一定使用過的「+ - * /」,這個加減乘除大家一定是很熟悉的,這些符號在資訊領域我們會稱它為運算子;那說到加減乘除的話不可不提的,就是被運算子運算運算元了,運算元舉簡單的例子「3+2」來說,其中的「3」、「2」就是運算元,是會被運算子處理的資料。

可能大家現在有點頭暈了,簡單來說運算子負責運算、處理運算元(資料),而「3+2」這整個式子我們會稱為運算式

我們來用圖解結論一下:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565L0uLDuOsHp.png

然後除了這些當然還有很多很多,就不再一一介紹了,接下來我們來測試看看吧!(其他詳細資訊可以到wiki這裡參考)


常用運算子測試與運用

以下只是簡單的介紹與測試,歡迎自己改數字等等的嘗試看看。

  1. 基本的算術運算子
    (1) + - * / % (加、減、乘、除、取餘)
    我們以下面的程式碼來進行測試:
#include <stdio.h>

int main(){
    printf("%d\n", 5 + 2);
    printf("%d\n", 5 - 2);
    printf("%d\n", 5 * 2);
    printf("%d\n", 5 / 2);
    printf("%d\n", 5 % 2);

    printf("---我是分隔線---\n");

    printf("%f\n", 5.0 + 2);
    printf("%f\n", 5.0 - 2);
    printf("%f\n", 5.0 * 2);
    printf("%f\n", 5.0 / 2);

    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565T3cg9zDhM8.png

其中如果不看printf語法(之後會再提),比較特別的大概是「%」了,它是用於取餘數的運算子,所以「5%2」時會列印出無法被整除的餘數「1」;而「/」則是因為在程式碼中,若其運算的兩個運算元都是整數,會預設輸出可以被整除的商「2」。

而如果運算的兩個運算元有一方或雙方為浮點數(小數),輸出就會為浮點數了,但輸出為浮點數的情況下就不能使用「%」。

(2) + - (正負號)
我們以下面的程式碼來進行測試:

#include <stdio.h>

int main(){
    printf("%d\n", + 2);
    printf("%d\n", - 2);

    printf("---我是分隔線---\n");

    printf("%f\n", + 2.0);
    printf("%f\n", - 2.0);

    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565lPBwkbTvar.png

(3) ++ -- (遞增、遞減)
這裡我們就不多介紹了怕太混亂,有興趣的朋友可以自行爬文,查查看它的使用方式。
(或是可以查看這個網頁的介紹,寫的很清晰也有解釋前綴後綴時的差異)

  1. 基本的比較運算子

以下範例若列印出1為ture、0則為false。
(1) > < >= <= (大於、小於、大於等於、小於等於)
我們以下面的程式碼來進行測試:

#include <stdio.h>

int main(){
    printf("> 之結果:\n");
    printf("%d\n", 5 > 2);
    printf("%d\n", 2 > 5);
    printf("%d\n", 5 > 5);
    printf("------\n");

    printf("< 之結果:\n");
    printf("%d\n", 5 < 2);
    printf("%d\n", 2 < 5);
    printf("%d\n", 5 < 5);
    printf("------\n");

    printf(">= 之結果:\n");
    printf("%d\n", 5 >= 2);
    printf("%d\n", 2 >= 5);
    printf("%d\n", 5 >= 5);
    printf("------\n");

    printf("<= 之結果:\n");
    printf("%d\n", 5 <= 2);
    printf("%d\n", 2 <= 5);
    printf("%d\n", 5 <= 5);
    printf("------\n");

    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565zsuU9Eass3.png

(2) != == (不等於、等於)
我們以下面的程式碼來進行測試:

#include <stdio.h>

int main(){
    printf("== 之結果:\n");
    printf("%d\n", 5 == 2);
    printf("%d\n", 5 == 5);
    printf("------\n");

    printf("!= 之結果:\n");
    printf("%d\n", 5 != 2);
    printf("%d\n", 5 != 5);
    printf("------\n");

    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565xAoSSzfgVe.png

(3) && || (條件and比較、條件or比較)
我們以下面的程式碼來進行測試:

#include <stdio.h>

int main(){
    printf("&& 之結果:\n");
    printf("%d\n", (5 == 5) && (2 == 2));
    printf("%d\n", (5 != 5) && (2 == 2));
    printf("%d\n", (5 != 5) && (2 != 2));
    printf("------\n");

    printf("|| 之結果:\n");
    printf("%d\n", (5 == 5) || (2 == 2));
    printf("%d\n", (5 != 5) || (2 == 2));
    printf("%d\n", (5 != 5) || (2 != 2));
    printf("------\n");

    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565YCGPZ4hW7r.png

「&&」在左右條件皆為ture的情況,輸出為ture,反之則為false;「||」在左右條件任一方為ture或兩方都為ture時,輸出為ture,反之雙方皆為false時則輸出false。

(4) ! (取反邏輯)
我們以下面的程式碼來進行測試:

#include <stdio.h>

int main(){
    printf("! 之結果:\n");
    printf("%d\n", (5 == 5));
    printf("%d\n", !(5 == 5));
    printf("%d\n", (5 != 5));
    printf("%d\n", !(5 != 5));
    printf("------\n");


    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565pdWIA9fS6k.png

  1. 位元運算子
    (1) << >> (位元左移、位元右移)
    這個運算子大家應該陌生許多,在資訊領域中計算機(機器、電腦等等)通常是以二進制(0、1)的方式儲存資料、運算、傳輸,詳細的原因我們就不多講,若有興趣可以在自行查詢,我們稍微圖解一下這個運算子的使用方式。
    https://ithelp.ithome.com.tw/upload/images/20211007/20142565l2Cxiyzleu.png

我們以下面的程式碼來進行測試:

int main(){
    printf("<< 之結果:\n");
    printf("%d\n", 4 << 1);
    printf("%d\n", 4 << 2);
    printf("------\n");

    printf(">> 之結果:\n");
    printf("%d\n", 4 >> 1);
    printf("%d\n", 4 >> 2);
    printf("------\n");

    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565caXDxKFYeG.png

雖然大概知道怎麼使用,但大家可能還對位元運算有點模糊,下面我用小畫家圖解一下原因:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565u8gTFsbnye.png
(對二進制有疑惑的朋友可以另外查看這個頁面,這個是介紹數字系統的)

(2) & | (位元and運算、位元or運算)
我們以下面的程式碼來進行測試:

#include <stdio.h>

int main(){
    printf("& 之結果:\n");
    printf("%d\n", 0 & 5);
    printf("%d\n", 0 & 10);
    printf("%d\n", 15 & 5);
    printf("%d\n", 15 & 10);
    printf("------\n");

    printf("| 之結果:\n");
    printf("%d\n", 0 | 5);
    printf("%d\n", 0 | 10);
    printf("%d\n", 15 | 5);
    printf("%d\n", 15 | 10);
    printf("------\n");

    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565wFMnUpxecH.png

運算子跟上一個一樣都是位元上的運算,而且是每個位元間的運算,都把數字轉成二進制會比較好理解,前面可能沒有把and、or說清楚,我們稍微圖解一下。
第一步驟:我們先來了解and跟or的規則
a. and

值1 值2 輸出
0 0 0
0 1 0
1 0 0
1 1 1
b. or
值1 值2 輸出
-- -- --
0 0 0
0 1 1
1 0 1
1 1 1

第二步驟:知道了and、or的規則我們再來把進制轉換一下。

十進制 二進制
0 0
5 101
10 1010
15 1111

第三步驟:轉換完二進制後再進行「&」跟「|」的運算
舉四個例子:
a. 0 & 5

項目 二進制 十進制
值1 0000 0
值2 0101 5
and 運算 ---- ----
結果 0000 0

b. 15 & 10

項目 二進制 十進制
值1 1111 15
值2 1010 10
and 運算 ---- ----
結果 1010 10

c. 0 | 5

項目 二進制 十進制
值1 0000 0
值2 0101 5
or 運算 ---- ----
結果 0101 5

d. 15 | 10

項目 二進制 十進制
值1 1111 15
值2 1010 10
or 運算 ---- ----
結果 1111 15
  1. 賦值運算子
    (1) = (設為某值、賦值)
    這個運算子會在往後頻繁的使用到,所以一定要知道這個用法,在資訊領域中「=」的用法跟數學定義是不一樣的,會用來賦予某資料一個值,雖然我們還沒有教到變數,不過在下一篇會提到,這裡我們先將就著看圖解。
    https://ithelp.ithome.com.tw/upload/images/20211007/20142565y9FUc1mifZ.png

我們以下面的程式碼來進行測試:

#include <stdio.h>

int main(){
    int data;
    data = 777;
    printf("%d\n", data);
    
    data = 8787;
    printf("%d\n", data);

    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565JkwhXSSzzz.png
可以看到當「data = 777;」時,data變數就存進了777,列印data時顯示的結果就是777;而當我們第二次賦值時,「data = 8787;」會覆蓋掉上次的值,在列印data時顯示的就變成8787了。

(2) += -= *= /= %= (運算後賦值)
我們以下面的程式碼來進行測試:

#include <stdio.h>

int main(){
    int data;
    data = 2;
    printf("%d\n", data);

    data += 3;
    printf("%d\n", data);

    return 0;
}

而上段程式碼輸出的結果會為:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565qL7mcYs6Iz.png

其實這類的運算子是由兩個步驟組成,先進行算術運算、最後再賦值,就不多做其他的例子了,有興趣可以自行嘗試看看這些運算子,而+=時如下圖解。
https://ithelp.ithome.com.tw/upload/images/20211007/20142565DKAWa5fMRY.png


辛苦看到這裡的你,可能已經開始有點小混亂了吧,你已經很棒啦,基本上比較會使用到的就是這些了,可以多多嘗試幫助自己記憶,也能更理解這些用法。

下一篇我們來學習什麼是資料型態!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言