C 中的布林值

介紹如何在C中使用布林值 C 最初並不原生支援布林值。 C99 是在 1999/2000 年發布的版本,引入了布林型別。 不過,要使用它,你需要匯入一個標頭檔,所以我不確定我們是否可以技術上稱之為 “原生”。無論如何,我們確實有一個 bool 型別。 你可以像這樣使用它: #include <stdio.h> #include <stdbool.h> int main(void) { bool isDone = true; if (isDone) { printf("完成\n"); } isDone = false; if (!isDone) { printf("未完成\n"); } } 如果你在編寫 Arduino 程式,你可以使用 bool 而不需要包含 stdbool,因為 bool 是一個有效且內建的 C++ 資料型別,而Arduino 語言則是基於 C++。 在純 C 中,記得要 #include <stdbool.h>,否則你在宣告和使用 bool 變數時會遇到一堆錯誤訊息: ➜ ~ gcc hello.c -o hello; ./hello hello.c:4:3: error: use of undeclared identifier 'bool' bool isDone = true; ^ hello....

C 語言中變數的作用範圍

了解作用範圍在 C 語言中的定義與運作方式。 在 C 語言程式中,當你宣告一個變數時,其作用範圍會根據你宣告的位置而有所不同。 這表示該變數在某些地方可用,但在其他地方則無法存取。 根據位置,變數可分為兩種類型: 全域變數 區域變數 以下是宣告於函式內部的區域變數範例: int main(void) { int age = 37; } 區域變數只能在函式內部存取,當函式結束時,它們將停止存在。它們會被從記憶體中釋放(但有些例外情況)。 而若在函式外部宣告的變數則為全域變數,像是以下範例: int age = 37; int main(void) { /* ... */ } 全域變數可在程式的任何函式中存取,並且在程式執行期間一直可用,直到結束。 我提到區域變數在函式結束後將不再可用。 這是因為預設情況下,區域變數是在堆疊(stack)上宣告的,除非你使用指標將其顯式配置於堆積中,但這樣你就得自行管理記憶體。

C中的基本I/O概念

在C中如何使用printf和scanf进行输入/输出 C是一种简单的语言,而C的“核心”不包含任何输入/输出(I/O)功能。 当然,这不是C的特有情况。语言的核心通常对I/O不做任何假设。 在C的情况下,通过C标准库的stdio.h头文件中定义的一组函数向我们提供输入/输出功能。 您可以使用以下命令导入此库: #include <stdio.h> 在您的C文件顶部。 该库提供给我们许多其他函数之一: printf() scanf() sscanf() fgets() fprintf() 在描述这些函数的功能之前,我想花一分钟谈谈I/O流的概念。 在C中有3种类型的I/O流: stdin(标准输入) stdout(标准输出) stderr(标准错误) 使用I/O函数时,我们始终使用流。流是一个可以表示设备或文件的高级接口。从C的角度来看,无论是从文件还是从命令行中读取,它都是一个I/O流。 这是需要记住的一点。 有些函数设计为使用特定的流,例如printf(),它用于将字符打印到stdout。使用更通用的fprintf(),我们可以指定要写入的流。 既然我开始谈论printf(),现在让我们介绍一下它。 printf() 当学习C编程时,printf()是你将使用的第一个函数之一。 在最简单的用法中,您将其作为一个字符串字面量传递: printf("hey!"); 程序将把字符串的内容打印到屏幕上。 您可以打印变量的值,这有些棘手,因为您需要添加一个特殊的字符,一个占位符,它根据变量的类型而改变。例如,对于有符号的十进制整数,我们使用%d: int age = 37; printf("我的年龄是 %d", age); 我们可以使用逗号打印多个变量: int age_yesterday = 36; int age_today = 37; printf("昨天我是 %d 岁,而今天是 %d 岁", age_yesterday, age_today); 还有其他的格式说明符比如 %d: %c代表一个字符 %s代表一个字符串 %f代表浮点数 %p代表指针 等等。 在printf()中我们可以使用转义字符,如\n,它可以在输出中创建新的一行。 scanf() printf()用作输出函数。现在我想介绍一个输入函数,以便我们可以说我们可以做好所有的I/O事情:scanf()。 此函数用于从运行程序的用户那里获得一个值,从命令行输入。 我们首先必须定义一个变量,用于保存从输入中获得的值: int age; 然后我们以两个参数调用scanf():变量的格式(类型)和变量的地址: scanf("%d", &age); 如果我们想要获得一个字符串作为输入,请记住字符串名称是指向第一个字符的指针,因此您不需要在它之前加上&字符:...

C程式語言介紹

開始學習C,一種基礎的程式語言 C可能是最廣為人知的程式語言。它被全球各地的電腦科學課程作為參考語言,可能和Python和Java一起是人們在學校學得最多的語言。 我記得它是我學到的第二種程式語言,之後是Pascal。 C不僅僅是學生用來學習程式設計的語言,它不是一門學術語言。而且我會說它並不是最容易的語言,因為C是一種相對較低階的程式語言。 今天,在嵌入式設備中廣泛使用C,它也為大多數使用Linux的網絡服務器提供動力。Linux內核使用C編寫,這也意味著C動力了所有Android設備的核心。我們可以說C代碼運行了整個世界的很大一部分。真是令人驚訝。 在C誕生之時,它被認為是一種高階語言,因為它在各種機器上都可移植。今天我們基本上認為,可以在Mac上運行在Windows或Linux上的程序,也許可以使用Node.js或Python。但在過去,根本不是這種情況。C所帶來的是一種易於實現的語言,具有可以輕易移植到不同機器的編譯器。 我提到了編譯器:C是一種編譯語言,就像Go、Java、Swift或Rust一樣。其他流行的編程語言如Python、Ruby或JavaScript則是解釋語言。差異是顯著的:編譯語言會生成一個可以直接執行和分發的二進製文件。 C不會進行垃圾回收。這意味著我們必須自己管理內存。這是一個複雜的任務,需要非常小心地防止bug,但這也是C成為編寫Arduino等嵌入式設備程序的理想語言。 C不隱藏底層機器的複雜性和功能。一旦你知道你可以做什麼,你就擁有了很大的能力。 現在,我想介紹第一個C程序,我們將它稱為“Hello, World!” #include <stdio.h> int main(void) { printf("Hello, World!"); } 讓我們來描述一下程式原始碼:首先我們引入了stdio庫(這個名稱代表標準輸入輸出庫)。 這個庫讓我們可以使用輸入/輸出函數。 C本身非常小,除了核心部分,其他任何東西都是由庫提供的。這些庫有些是由普通程序員編寫的,並提供給其他人使用。還有一些庫是編譯器內建的,像stdio和其他庫一樣。 stdio是提供printf()函數的庫。 這個函數被包裝在main()函數中。main()函數是任何C程序的入口點。 那麼,什麼是函數? 函數是一個例程,它接受一個或多個參數並返回一個單一值。 在main()的情況下,該函數不接受任何參數,並返回一個整數。在參數中使用void關鍵字來識別,並使用int關鍵字來聲明返回值。 函數有一個函數體,它用大括號括起來,在函數體內我們放置了函數執行所需的所有代碼。 printf()函數的寫法不同,正如你所見。它沒有定義返回值,我們傳入一個用雙引號括起來的字符串。我們沒有指定參數的類型。 這是因為這是一個函數調用。在stdio庫的某個地方,printf被定義為 int printf(const char *format, ...); 你現在不需要理解這意味著什麼,但簡而言之,這就是函數的定義,當我們調用printf("Hello, World!");時,函數就執行了。 上面我們定義的main()函數: #include <stdio.h> int main(void) { printf("Hello, World!"); } 在執行程序時,將由操作系統來執行。 那麼,如何執行C程序? 如前所述,C是一種編譯語言。要運行程序,我們必須首先編譯它。任何Linux或macOS電腦都已內建了C編譯器。對於Windows,您可以使用Windows Subsystem for Linux(WSL)。 無論如何,當您打開終端窗口時,可以輸入gcc,這個命令應該會返回一個錯誤,說您沒有指定任何文件: 這很好。這意味著C編譯器存在,我們可以開始使用它。 現在輸入上面的程序到一個hello.c文件中。您可以使用任何編輯器,但出於簡單起見,我將使用終端中的nano編輯器: 輸入程序: 現在按下ctrl-X退出: 按下y鍵確認,然後按回車鍵確認文件名: 這樣,我們應該回到終端: 現在輸入 gcc hello.c -o hello 該程序不應該產生任何錯誤: 但它應該生成一個hello 可執行文件。現在輸入 ./hello 來運行它: 我在程序名前面加了./以告訴終端該指令位於當前文件夾...