C 全域變數

介紹 C 全域變數 在C 變數和類型文章中,我介紹了如何使用變數。 在這篇文章中,我想提到全域變數和區域變數之間的差異。 區域變數是在函式內部定義的,它僅在該函式內部可用。 像這樣: #include <stdio.h> int main(void) { char j = 0; j += 10; printf("%u", j); //10 } j 在 main 函式之外是不可用的。 全域變數是在任何函式之外定義的,如下所示: #include <stdio.h> char i = 0; int main(void) { i += 10; printf("%u", i); //10 } 全域變數可以被程式中的任何函式存取。存取不僅限於讀取變數的值:該變數可以被任何函式更新。 因此,全域變數是我們在函式之間共享相同資料的一種方式。 與區域變數不同的是,變數分配的記憶體在函式結束時被釋放,而全域變數只有在程式結束時才被釋放。

C 列舉型別

由 typedef 和 enum 關鍵字我們可以定義一個只能有某些值的型別。 這是 typedef 列舉型別的語法: typedef enum { //...values } TYPENAME; 所創建的列舉型別通常是大寫。 以下是一個簡單的例子: typedef enum { true, false } BOOLEAN; C 語言已經內建了 bool 型別,所以這個例子並不實用,但是你可以了解到這個概念。 另一個例子是定義星期幾: typedef enum { monday, tuesday, wednesday, thursday, friday, saturday, sunday } WEEKDAY; 這是一個使用這個列舉型別的簡單程式: #include <stdio.h> typedef enum { monday, tuesday, wednesday, thursday, friday, saturday, sunday } WEEKDAY; int main(void) { WEEKDAY day = monday; if (day == monday) { printf("It's monday!"); } else { printf("It's not monday"); } } 列舉型別中的每個項目都會被對應到一個整數。所以在這個例子中,monday 對應到 0,tuesday 對應到 1,以此類推。...

C 字串介紹

在 C 語言中,字串是一種特殊的 陣列: 字串是一個由 char 值組成的陣列: char name[7]; 當我們介紹資料型別時,我們已經提到 char 型別,簡單來說,它常用於儲存 ASCII 字元。 我們可以像初始化一般陣列一樣來初始化字串: char name[7] = { 'F', 'l', 'a', 'v', 'i', 'o' }; 或者更方便地使用字串字面值(也稱為字串常量),即用雙引號括起來的一系列字元: char name[7] = "Flavio"; 我們可以使用 printf() 函數並使用 %s 來輸出字串: printf("%s", name); 你有注意到「Flavio」有6個字元,但我們定義了長度為7的陣列嗎?為什麼呢?這是因為字串的最後一個字元必須是 0,即字串終止符號,在宣告陣列時我們必須為它留出空間。 這一點尤其在處理字串時需要注意。 談到字串處理,C 語言提供了一個重要的標準庫:string.h。 這個庫非常重要,因為它抽象了許多關於字串操作的低階細節,並為我們提供了一組實用的函數。 你可以在程式中加入以下指令來載入這個庫: #include <string.h> 一旦你這麼做了,你就可以使用以下函數: strcpy() 將一個字串複製到另一個字串中 strcat() 將一個字串附加到另一個字串的後面 strcmp() 對比兩個字串是否相等 strncmp() 對比兩個字串的前 n 個字元是否相等 strlen() 計算字串的長度 還有許多其他函數,等等。 我將在不同的博客文章中介紹這些字串函數,但你只需要知道它們存在即可。

C 標頭檔案

如何使用 C 標頭檔案將程式分割成多個檔案 簡單的程式可以放在單一個檔案中,但當程式變得越來越龐大時,將它們全部放在一個檔案中將變得不可能。 您可以將程式的一部分放在一個獨立的檔案中,然後建立一個標頭檔案。 標頭檔案看起來像一個普通的 C 檔案,只是以 .h 結尾而不是 .c,且不同於函式的實作和程式的其他部分,它僅包含聲明。 當您第一次使用 printf() 函式或其他輸入/輸出函式時,您已經使用過標頭檔案,並且您必須輸入: #include <stdio.h> 來使用它。 #include 是一個預處理器指示。 預處理器會在標準庫中查找 stdio.h 檔案,因為您在它周圍使用了尖括號。要包含自己的標頭檔案,您將使用引號,就像這樣: #include "myfile.h" 上述將會在當前資料夾中查找 myfile.h。 您還可以使用資料夾結構來管理庫: #include "myfolder/myfile.h" 讓我們舉個例子。這個程式計算從給定年份至今的年數: #include <stdio.h> int calculateAge(int year) { const int CURRENT\_YEAR = 2020; return CURRENT\_YEAR - year; } int main(void) { printf("%u", calculateAge(1983)); } 假設我們想將 calculateAge 函式移到一個獨立的檔案中。 我們建立一個 calculate_age.c 檔案: int calculateAge(int year) { const int CURRENT\_YEAR = 2020; return CURRENT\_YEAR - year; } 還有一個 calculate_age....

c-constants

# C常量 介紹在C中處理常量的方式 在上一篇文章中,我介紹了[C中的變量](/ c-variables-types/)。 在這篇文章中,我想告訴您關於C中所有的常量。 常量的聲明方式與變量類似,只是在之前加上了const關鍵字,並且您總是需要指定一個值。 像這樣: const int age = 37; 這在C語言中是完全有效的,儘管通常常量的聲明是大寫的,就像這樣: const int AGE = 37; 這只是一個約定,但它在閱讀或撰寫C語言程序時非常有幫助,因為它提高了可讀性。大寫名稱表示常量,小寫名稱表示變量。 常量名遵循相同的命名規則,可以包含任何大寫或小寫字母,可以包含數字和下劃線字符,但不能以數字開頭。AGE和Age10都是有效的變量名,1AGE不是。 另一種定義常量的方式是使用以下語法: #define AGE 37 在這種情況下,您不需要添加類型,也不需要=等號,並且省略最後的分號。 C編譯器將在編譯時從指定的值推斷出類型。

c-quotes

#在C中的雙引號與單引號 如何在C中使用引號 在C中,您可能會在某些情況下使用雙引號,在其他情況下使用單引號。 在某些語言中,這兩者之間沒有區別。但是在C中,它們之間是有區別的,您將根據需要使用其中之一。 何時可以使用單引號,何時可以使用雙引號? 單引號用於識別單個字符(char值): char letter = 'a'; 雙引號用於創建字符串文字: char \*name = "Flavio"; 請注意,您可以創建單字母字符串文字: char \*letter = "a"; 但請記住,字符串由字符串的字符加上末尾的0字符組成,這使得單字母字符串文字占用單個字符的兩倍空間。

C中的靜態變數

如何在C中使用靜態變數 在函數內部,您可以使用static關鍵字來初始化靜態變數。 “在函數內部”關鍵字是因為全局變數默認為靜態變數,所以不需要添加關鍵字。 那什麼是靜態變數呢?靜態變數如果沒有指定初始值,則初始化為0,並且在函數調用之間保留其值。 考慮以下函數: int incrementAge() { int age = 0; age++; return age; } 如果我們只調用incrementAge()一次,則返回值將為1。如果我們多次調用它,我們將始終得到1,因為age是一個局部變量,並且在每次函數調用時重新初始化為0。 如果我們將函數更改為: int incrementAge() { static int age = 0; age++; return age; } 現在每次調用此函數時,我們都會得到一個遞增的值: printf("%d\n", incrementAge()); printf("%d\n", incrementAge()); printf("%d\n", incrementAge()); 將會得到: 1 2 3 我們還可以省略在static int age = 0;中將age初始化為0,只需寫成static int age,因為靜態變數在創建時自動設置為0。 我們還可以擁有靜態數組。在這種情況下,數組中的每個單個項都初始化為0: int incrementAge() { static int ages[3]; ages[0]++; return ages[0]; }

C變數和類型

初次接觸C變數和基本類型的介紹 C是一種靜態類型語言。 這意味著任何變數都有一個關聯的類型,而且此類型在編譯時已知。 這與在Python、JavaScript、PHP和其他解釋語言中操作變量的方式非常不同。 在C中創建變量時,您必須在聲明時指定變量的類型。 在此示例中,我們使用類型int對變量age進行初始化: int age; 變量名可以包含任何大小寫字母,可以包含數字和下劃線字符,但不能以數字開頭。AGE和Age10都是有效的變量名,1age則無效。 您也可以在聲明時初始化變量,並指定初始值: int age = 37; 定義變量後,您可以在程序代碼中使用它,並隨時更改其值,例如使用=運算符,就像在age = 100;中一樣,前提是新值具有相同的類型。 在這種情況下: #include <stdio.h> int main(void) { int age = 0; age = 37.2; printf("%u", age); } 編譯器將在編譯時拋出警告,並將十進制數字轉換為整數值。 C的內置數據類型包括int、char、short、long、float、double和long double。讓我們更深入了解這些類型。 整數數字 C為我們提供以下類型來定義整數值: char int short long 大多數情況下,您可能會使用int來存儲整數。但在某些情況下,您可能希望選擇另外3個選項之一。 char類型通常用於存儲ASCII表中的字母,但也可以用來容納從-128到127的小整數。它至少占1個字節。 int至少占2個字節。 short至少占2個字節。 long至少占4個字節。 正如您所看到的,對於不同環境,我們無法保證相同的值。我們只有一個指示。問題在於每種數據類型中可以存儲的確切數字取決於實現和體系結構。 我們保證short不會比int長,并且保證long不會比int短。 美國國家標準協會(ANSI)的C規範標準確定了每種類型的最小值,幸運的是,由於此規範,我們至少可以知道我們可以期望擁有的最小值。 如果您在Arduino上編程C,不同的開發板將具有不同的限制。 在Arduino Uno板上,int存儲2字節值,範圍從-32,768到32,767。在Arduino MKR 1010上,int存儲4字節值,範圍從-2,147,483,648到2,147,483,647。相差很大。 在所有Arduino板上,short存儲2字節值,範圍從-32,768到32,767。long占用4字節,范围从-2,147,483,648到2,147,483,647。 無符號整數 對於上述所有數據類型,我們可以在前面加上unsigned以將範圍從0開始,而不是負數。在許多情況下,這可能是有意義的。 unsigned char的範圍從0到至少255 unsigned int的範圍從0到至少65,535 unsigned short的範圍從0到至少65,535 unsigned long的範圍從0到至少4,294,967,295 溢出問題 鑒於所有這些限制,可能會出現一個問題:我們如何確保我們的數字不超過限制?如果超過限制我們會得到什麼結果? 如果您具有unsigned int數字為255,並將其增加,您將得到256作為結果。這是可以預料的。 如果您的unsigned char數字為255,並將其增加,您將得到0作為結果。它會從初始可能值重新開始計算。...

C轉換格式符和修飾符

一個有用的 C 轉換格式符和修飾符的參考手冊。 在這篇文章中,我想為你列出所有可以在 printf()、scanf() 和類似的輸入輸出函數中使用的 轉換格式符。 格式符 含義 %d / %i 有符號十進制整數 %u 無符號十進制整數 %c 無符號 char %s 字符串 %p 指針的十六進制形式 %o 無符號八進制整數 %x / %X 無符號十六進制數 %e 科學記號表示的浮點數(使用小寫 e) %E 科學記號表示的浮點數(使用大寫 E) %f 十進制表示的 double 數字 %g / %G 根據值,在十進制或科學記號中表示的 double 數字 除了這些格式符,我們還有一組 修飾符。 首先是 數字。在 % 和格式符之間使用一個數字,你可以指定最小的字段寬度。例如:%3d 會佔用 3 個空間,不管打印的數字是什麼。 下面這段代碼: printf("%4d\n", 1); printf("%4d\n", 12); printf("%4d\n", 123); printf("%4d\n", 1234); 應該打印出: 1 12 123 1234 如果在數字之前加上一個點,則表示精度:即小數位數。這當然適用於十進制數字。例如: printf("%4.2f\n", 1.0); printf("%4....

C陣列介紹

一個C陣列的介紹 陣列是一個可以儲存多個值的變數。 在C語言中,陣列中的每個值必須有相同的類型。這意味著你可以有int值的陣列,也可以有double值的陣列,以此類推。 你可以像這樣定義一個int值的陣列: int prices[5]; 你必須總是指定陣列的大小。C本身並不提供動態陣列(你需要使用像是鏈表之類的資料結構來實現)。 你可以使用常數來定義陣列的大小: const int SIZE = 5; int prices[SIZE]; 你可以在定義時初始化陣列,像是這樣: int prices[5] = { 1, 2, 3, 4, 5 }; 但你也可以在定義之後賦予值,像這樣: int prices[5]; prices[0] = 1; prices[1] = 2; prices[2] = 3; prices[3] = 4; prices[4] = 5; 或者,更實際的做法是使用迴圈: int prices[5]; for (int i = 0; i < 5; i++) { prices[i] = i + 1; } 你可以使用方括號在陣列變數名稱後面指定索引值,來參考陣列中的某個項目。像這樣: prices[0]; /* 陣列項目值:1 */ prices[1]; /* 陣列項目值:2 */ 陣列的索引從0開始,所以一個有5個項目的陣列,像上面的prices陣列,其項目範圍從prices[0]到prices[4]。...