學習網站:C 語言教程 | 菜鳥教程 (runoob.com)C 語言教程 | 菜鳥教程 (runoob.com)C 語言教程 | 菜鳥教程 (runoob.com)
這個網站知識完整,講解清晰。
在線C語言編程工具:菜鳥教程在線編輯器 (runoob.com)
國外學習網站:C語言介紹 - GeeksforGeeks
?算法知識網站:算法通關手冊(LeetCode) | 算法通關手冊(LeetCode) (itcharge.cn)
0.前言
靜態語言和動態語言
動態語言:是運行時才確定數據類型的語言,變量在使用之前無需申明類型,通常變量的值是被賦值的那個值的類型。比如Php、Asp、JavaScript、Python、Per等等。
靜態語言:是編譯時變量的數據類型就可以確定的語言,大多數靜態語言要求在使用變量之前必須聲明數據類型。比如Java、C、C++、C#等。
圖片來源:動態語言和靜態語言的區別(如python與c++)-CSDN博客
1.C語言的簡介
C 語言是一種通用的高級語言,最初是由丹尼斯·里奇在貝爾實驗室為開發 UNIX 操作系統而設計的。
1.1特點
- 易學習
- 結構化語言
- 高效率
- 底層處理
- 使用多種計算機
- 通用和便攜(General Purpose and Portable)
1.2? C與C++的區別
- C++ 支持 OOP 范式,而 C 只有編程的過程概念。
- C++ 具有異常處理功能。在 C 語言中,我們必須手動解析。
- C 中沒有引用。
2 環境配置
教程:從零開始的vscode安裝及環境配置教程(C/C++)(Windows系統)_vscode搭建編譯器環境-CSDN博客
?C 代碼的編輯器 :VSCode(全稱:Visual Studio Code)是一款由微軟開發且跨平臺的免費源代碼編輯器,VSCode 開發環境非常簡單易用。
?C 代碼的編譯器 :最常用的免費可用的編譯器是 GNU 的 C/C++ 編譯器。
windows安裝編譯器:為了在 Windows 上安裝 GCC,您需要安裝 MinGW。
AI助手:
- GitHub Copilot
- Fitten Code
3、C 程序結構
C程序主要包括以下部分:
- 預處理器指令:#include <stdio.h>?
- 函數:int main()?是主函數
- 變量:int a
- 語句&表達式:{里面的}
- 注釋:/*...*/?
4? C基本語法
4.1 C的令牌
C 程序由各種令牌組成,令牌可以是關鍵字、標識符、常量、字符串值,或者是一個符號。
4.2 分號
在 C 程序中,分號是語句結束符。也就是說,每個語句必須以分號結束。它表明一個邏輯實體的結束。
4.3 注釋
兩種注釋方式
1、單行注釋: //
2、/* */?這種格式的注釋可以單行或多行。
4.4 標識符
C 標識符是用來標識變量、函數,或任何其他用戶自定義項目的名稱。一個標識符以字母 A-Z 或 a-z 或下劃線 _ 開始,后跟零個或多個字母、下劃線和數字(0-9)。C 標識符內不允許出現標點字符,比如 @、$ 和 %。C 是區分大小寫的編程語言。
4.5 常見的關鍵字
關鍵字 | 說明 |
---|---|
auto | 聲明自動變量 |
break | 跳出當前循環 |
case | 開關語句分支 |
char | 聲明字符型變量或函數返回值類型 |
const | 定義常量,如果一個變量被 const 修飾,那么它的值就不能再被改變 |
continue | 結束當前循環,開始下一輪循環 |
default | 開關語句中的"其它"分支 |
do | 循環語句的循環體 |
double | 聲明雙精度浮點型變量或函數返回值類型 |
else | 條件語句否定分支(與 if 連用) |
enum | 聲明枚舉類型 |
extern | 聲明變量或函數是在其它文件或本文件的其他位置定義 |
float | 聲明浮點型變量或函數返回值類型 |
for | 一種循環語句 |
goto | 無條件跳轉語句 |
if | 條件語句 |
int | 聲明整型變量或函數 |
long | 聲明長整型變量或函數返回值類型 |
register | 聲明寄存器變量 |
return | 子程序返回語句(可以帶參數,也可不帶參數) |
short | 聲明短整型變量或函數 |
signed | 聲明有符號類型變量或函數 |
sizeof | 計算數據類型或變量長度(即所占字節數) |
static | 聲明靜態變量 |
struct | 聲明結構體類型 |
switch | 用于開關語句 |
typedef | 用以給數據類型取別名 |
unsigned | 聲明無符號類型變量或函數 |
union | 聲明共用體類型 |
void | 聲明函數無返回值或無參數,聲明無類型指針 |
volatile | 說明變量在程序執行中可被隱含地改變 |
while | 循環語句的循環條件 |
4.6、 C語言的數據類型
4.6.1 字、字節(Byte)、比特(bit)
比特bit是二進制位(Binary digit)的簡稱,一個二進制包含的信息量成為一比特bit。比特bit是計算機內部數據存儲的最小單位。二進制在效率和成本方面的優勢為全世界所接受,現在電腦所有的信息都是二進制的,就是0和1組成的。
字節Byte是計算機數據處理的最小單位,習慣上用大寫的B表示,每個字節有8個二進制位,其中最右邊的一位為最低位,最左邊的一位為最高位,每個二進制位的值不是0就是1。一個字節由8個二進制位組成。也就是1字節Byte等于8比特Bit。
字和字節都是計算機的存儲單元。字由若干個字節組成,一個字節是8個比特bit。字的位數叫做字長,即cpu一次處理二進制代碼的位數。字的長度與計算架構有關,比如32位機,一個字就是32位,換算成字節就是4字節;同樣的64位機,一個字就是64位,也就是8字節。字也是計算機一次處理數據的最大單位。
序號 | 類型與描述 |
---|---|
1 | 基本數據類型 它們是算術類型,包括整型(int)、字符型(char)、浮點型(float)和雙精度浮點型(double)。 |
2 | 枚舉類型: 它們也是算術類型,被用來定義在程序中只能賦予其一定的離散整數值的變量。 |
3 | void 類型: 類型說明符?void?表示沒有值的數據類型,通常用于函數返回值。 |
4 | 派生類型: :包括數組類型、指針類型和結構體類型。 |
數組類型和結構類型統稱為聚合類型。函數的類型指的是函數返回值的類型。
4.6.2 整數類型
類型 | 存儲大小 | 值范圍 |
---|---|---|
char | 1 字節 | -128 到 127 或 0 到 255(ASIICA) |
unsigned char | 1 字節 | 0 到 255 |
signed char | 1 字節 | -128 到 127 |
int | 2 或 4 字節 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
unsigned int | 2 或 4 字節 | 0 到 65,535 或 0 到 4,294,967,295 |
short | 2 字節 | -32,768 到 32,767 |
unsigned short | 2 字節 | 0 到 65,535 |
long | 4 字節 | -2,147,483,648 到 2,147,483,647 |
unsigned long | 4 字節 | 0 到 4,294,967,295 |
注意,各種類型的存儲大小與系統位數有關,但目前通用的以64位系統為主。
為了得到某個類型或某個變量在特定平臺上的準確大小,您可以使用?sizeof?運算符。表達式?sizeof(type)?得到對象或類型的存儲字節大小。
4.6.3 浮點類型
下表列出了關于標準浮點類型的存儲大小、值范圍和精度的細節:
類型 | 存儲大小 | 值范圍 | 精度 |
---|---|---|---|
float | 4 字節 | 1.2E-38 到 3.4E+38 | 6 位有效位 |
double | 8 字節 | 2.3E-308 到 1.7E+308 | 15 位有效位 |
long double | 16 字節 | 3.4E-4932 到 1.1E+4932 | 19 位有效位 |
頭文件 float.h 定義了宏,在程序中可以使用這些值和其他有關實數二進制表示的細節。
4.6.4 void 類型
序號 | 類型與描述 |
---|---|
1 | 函數返回為空 C 中有各種函數都不返回值,或者您可以說它們返回空。不返回值的函數的返回類型為空。例如?void exit (int status); |
2 | 函數參數為空 C 中有各種函數不接受任何參數。不帶參數的函數可以接受一個 void。例如?int rand(void); |
3 | 指針指向 void 類型為 void * 的指針代表對象的地址,而不是類型。例如,內存分配函數?void *malloc( size_t size );?返回指向 void 的指針,可以轉換為任何數據類型。 |
4.6.5 類型轉換
類型轉換是將一個數據類型的值轉換為另一種數據類型的值。
C 語言中有兩種類型轉換:
-
隱式類型轉換:隱式類型轉換是在表達式中自動發生的,無需進行任何明確的指令或函數調用。它通常是將一種較小的類型自動轉換為較大的類型,例如,將int類型轉換為long類型或float類型轉換為double類型。隱式類型轉換也可能會導致數據精度丟失或數據截斷。
-
顯式類型轉換:顯式類型轉換需要使用強制類型轉換運算符(type casting operator),它可以將一個數據類型的值強制轉換為另一種數據類型的值。強制類型轉換可以使程序員在必要時對數據類型進行更精確的控制,但也可能會導致數據丟失或截斷。
4.7 C變量基本變量
變量的名稱可以由字母、數字和下劃線字符組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為 C 是大小寫敏感的
類型 | 描述 |
---|---|
char | 通常是一個字節(八位), 這是一個整數類型。 |
int | 整型,4 個字節,取值范圍 -2147483648 到 2147483647。 |
float | 單精度浮點值。單精度是這樣的格式,1位符號,8位指數,23位小數。 |
double | 雙精度浮點值。雙精度是1位符號,11位指數,52位小數。 |
void | 表示類型的缺失。 |
4.7.1 變量定義
type value
type?表示變量的數據類型,可以是整型、浮點型、字符型、指針等,也可以是用戶自定義的對象。
variable_list?可以由一個或多個變量的名稱組成,多個變量之間用逗號,分隔,變量由字母、數字和下劃線組成,且以字母或下劃線開頭。
比如:
- int age;
- char grade;?
- int i,j,k;
- >>>
4.7.2 變量初始化
type variable_name = value;
其中,type?表示變量的數據類型,variable_name?是變量的名稱,value?是變量的初始值。
4.7.3 后續初始化變量
type variable_name; ? ?// 變量定義
variable_name = new_value; ? ?// 變量初始化
注意:為了避免不確定的行為和錯誤,建議在使用變量之前進行初始化。
4.7.4 變量不初始化
對于全局變量和靜態變量(在函數內部定義的靜態變量和在函數外部定義的全局變量),它們的默認初始值為零。
以下是不同類型的變量在沒有顯式初始化時的默認值:
- 整型變量(int、short、long等):默認值為0。
- 浮點型變量(float、double等):默認值為0.0。
- 字符型變量(char):默認值為'\0',即空字符。
- 指針變量:默認值為NULL,表示指針不指向任何有效的內存地址。
- 數組、結構體、聯合等復合類型的變量:它們的元素或成員將按照相應的規則進行默認初始化,這可能包括對元素遞歸應用默認規則。
需要注意的是,局部變量(在函數內部定義的非靜態變量)不會自動初始化為默認值,它們的初始值是未定義的(包含垃圾值)。因此,在使用局部變量之前,應該顯式地為其賦予一個初始值。
4.7.5? 變量聲明
變量的聲明有兩種情況:
- 1、一種是需要建立存儲空間的。例如:int a 在聲明的時候就已經建立了存儲空間。
- 2、另一種是不需要建立存儲空間的,通過使用extern關鍵字聲明變量名而不定義它。 例如:extern int a 其中變量 a 可以在別的文件中定義的。
- 除非有extern關鍵字,否則都是變量的定義。
4.8 C 常量
常量是固定值,在程序執行期間不會改變。這些固定的值,又叫做字面量。
常量可以是任何的基本數據類型,比如整數常量、浮點常量、字符常量,或字符串字面值,也有枚舉常量。
4.8.1 整數常量
整數常量可以是十進制、八進制或十六進制的常量。前綴指定基數:0x 或 0X 表示十六進制,0 表示八進制,不帶前綴則默認表示十進制。
整數常量也可以帶一個后綴,后綴是 U 和 L 的組合,U 表示無符號整數(unsigned),L 表示長整數(long)。后綴可以是大寫,也可以是小寫,U 和 L 的順序任意。
4.8.2 字符常量
字符常量是括在單引號中,例如,'x' 可以存儲在?char?類型的簡單變量中。
轉義序列 | 含義 |
---|---|
\\ | \ 字符 |
\' | ' 字符 |
\" | " 字符 |
\? | ? 字符 |
\a | 警報鈴聲 |
\b | 退格鍵 |
\f | 換頁符 |
\n | 換行符 |
\r | 回車 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ooo | 一到三位的八進制數 |
\xhh . . . | 一個或多個數字的十六進制數 |
?4.8.3 字符串常量
字符串字面值或常量是括在雙引號?" "?中的。一個字符串包含類似于字符常量的字符:普通的字符、轉義序列和通用的字符。
4.8.4 定義常量
在 C 中,有兩種簡單的定義常量的方式:
- 使用?#define?預處理器: #define 可以在程序中定義一個常量,它在編譯時會被替換為其對應的值。
- 使用?const?關鍵字:const 關鍵字用于聲明一個只讀變量,即該變量的值不能在程序運行時修改。
#define 預處理器:#define 常量名 常量值 ->?#define PI 3.14159
const 關鍵字:const 數據類型 常量名 = 常量值; ->?const int MAX_VALUE = 100;
注意:建議使用 const 關鍵字來定義常量,因為它具有類型檢查和作用域的優勢,而 #define 僅進行簡單的文本替換,可能會導致一些意外的問題。
4.9 存儲類
存儲類定義 C 程序中變量/函數的存儲位置、生命周期和作用域。
這些說明符放置在它們所修飾的類型之前。
下面列出 C 程序中可用的存儲類:
- auto
- register
- static
- extern
4.9.1 auto類
auto?存儲類是所有局部變量默認的存儲類。
定義在函數中的變量默認為 auto 存儲類,這意味著它們在函數開始時被創建,在函數結束時被銷毀。
4.9.2? register 存儲類
register?存儲類用于定義存儲在寄存器中而不是 RAM 中的局部變量。register 存儲類定義存儲在寄存器,所以變量的訪問速度更快,但是它不能直接取地址,因為它不是存儲在 RAM 中的。在需要頻繁訪問的變量上使用 register 存儲類可以提高程序的運行速度。
register int miles;
4.9.3??static 存儲類
static int count=10; /* 全局變量 - static 是默認的 */
static?存儲類指示編譯器在程序的生命周期內保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創建和銷毀。因此,使用 static 修飾局部變量可以在函數調用之間保持局部變量的值。
static 修飾符也可以應用于全局變量。當 static 修飾全局變量時,會使變量的作用域限制在聲明它的文件內。
全局聲明的一個 static 變量或方法可以被任何函數或方法調用,只要這些方法出現在跟 static 變量或方法同一個文件中。
靜態變量在程序中只被初始化一次,即使函數被調用多次,該變量的值也不會重置。
4.9.4??extern 存儲類
extern void write_extern();
extern?存儲類用于定義在其他文件中聲明的全局變量或函數。當使用 extern 關鍵字時,不會為變量分配任何存儲空間,而只是指示編譯器該變量在其他文件中定義。
4.10 運算符
在 C 語言中,運算符是表示要對一個或多個操作數執行的操作的符號。它們是 C 編程的基本組件
運算符是一種告訴編譯器執行特定的數學或邏輯操作的符號。C 語言內置了豐富的運算符,并提供了以下類型的運算符:
C 語言提供了廣泛的運算符,根據其功能可以分為 6 種類型:
- 算術運算符
- 關系運算符
- 邏輯運算符
- 位運算符
- 賦值運算符
- 雜項運算符
4.10.1 算術運算符
The arithmetic operators are used to perform arithmetic/mathematical operations on operands. There are 9 arithmetic operators in C language(算術運算符用于對操作數執行算術/數學運算。C語言中有9個算術運算符:
S.No. | Symbol | Operator | Description | Syntax |
---|---|---|---|---|
1 | + | Plus | Adds two numeric values. 把兩個操作數相加 | a + b |
2 | – | Minus | Subtracts right operand from left operand.第一個操作數減第二個操作數 | a – b |
3 | * | Multiply | Multiply two numeric values.兩個操作數相乘 | a * b |
4 | / | Divide | Divide two numeric values. 第一個操作數除以第二個操作數 | a / b |
5 | % | Modulus | Returns the remainder after diving the left operand with the right operand.? 返回左操作數除以右操作數后的余數。 | a % b |
6 | + | Unary Plus | Used to specify the positive values.用于指定正值。 | +a |
7 | – | Unary Minus | Flips the sign of the value. 翻轉值的符號。 | -a |
8 | ++ | Increment | Increases the value of the operand by 1.?將操作數的值增加1 | a++ |
9 | — | Decrement | Decreases the value of the operand by 1.?將操作數的值減少1。 | a– |
4.10.2?關系運算符(Logical Operator)
C 中的關系運算符用于比較兩個操作數。所有這些運算符都是二進制運算符,它們作為比較的結果返回真值或假值。(The relational operators in C are used for the comparison of the two operands. All these operators are binary operators that return true or false values as the result of comparison.)
運算符 | 描述 | 實例 |
---|---|---|
== | 檢查兩個操作數的值是否相等,如果相等則條件為真。 | (A == B) 為假。 |
!= | 檢查兩個操作數的值是否相等,如果不相等則條件為真。 | (A != B) 為真。 |
> | 檢查左操作數的值是否大于右操作數的值,如果是則條件為真。 | (A > B) 為假。 |
< | 檢查左操作數的值是否小于右操作數的值,如果是則條件為真。 | (A < B) 為真。 |
>= | 檢查左操作數的值是否大于或等于右操作數的值,如果是則條件為真。 | (A >= B) 為假。 |
<= | 檢查左操作數的值是否小于或等于右操作數的值,如果是則條件為真。 | (A <= B) 為真。 |
// C program to illustrate the relational operators
#include <stdio.h>int main()
{int a = 25, b = 5;// using operators and printing resultsprintf("a < b : %d\n", a < b);printf("a > b : %d\n", a > b);printf("a <= b: %d\n", a <= b);printf("a >= b: %d\n", a >= b);printf("a == b: %d\n", a == b);printf("a != b : %d\n", a != b);return 0;
}
4.10.3?C 語言中的邏輯運算符
邏輯運算符用于組合兩個或多個條件/約束,或補充所考慮的原始條件的評估。邏輯運算符操作的結果是一個布爾值,可以是?true?或?false。
運算符 | 描述 | 實例 |
---|---|---|
&& | 稱為邏輯與運算符。如果兩個操作數都非零,則條件為真。 | (A && B) 為假。 |
|| | 稱為邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為真。 | (A || B) 為真。 |
! | 稱為邏輯非運算符。用來逆轉操作數的邏輯狀態。如果條件為真則邏輯非運算符將使其為假。 | !(A && B) 為真。 |
// C program to illustrate the logical operators
#include <stdio.h>int main()
{int a = 25, b = 5;// using operators and printing resultsprintf("a && b : %d\n", a && b);printf("a || b : %d\n", a || b);printf("!a: %d\n", !a);return 0;
}
4.10.4??位運算符(Bitwise Operators)
按位運算符用于對操作數執行位級操作。首先將運算符轉換為位級,然后對操作數執行計算。加法、減法、乘法等數學運算可以在位級別執行,以加快處理速度。
S.No. | Symbol | Operator | Description | Syntax |
---|---|---|---|---|
1 | & | Bitwise AND/按位與 | Performs bit-by-bit AND operation and returns the result./對兩個操作數的每一位執行邏輯與操作。 解釋:如果兩個相應的位都為 1,則結果為 1,否則為 0。
| a & b |
2 | | | Bitwise OR/按位或 | Performs bit-by-bit OR operation and returns the result./對兩個操作數的每一位執行邏輯或操作。 解釋:如果兩個相應的位都為 0,則結果為 0,否則為 1。
| a | b |
3 | ^ | Bitwise XOR/按位異或 | Performs bit-by-bit XOR operation and returns the result./對兩個操作數的每一位執行邏輯異或操作。 解釋:如果兩個相應的位值相同,則結果為 0,否則為 1。
| a ^ b |
4 | ~ | Bitwise First Complement/逐位第一補碼 | Flips all the set and unset bits on the number./ 對操作數的每一位執行邏輯取反操作。 解釋:即將每一位的 0 變為 1,1 變為 0。
| ~a |
5 | << | Bitwise Leftshift/逐位左移 | Shifts the number in binary form by one place in the operation and returns the result./將操作數的所有位向左移動指定的位數。左移 n 位相當于乘以 2 的 n 次方。 | a << b |
6 | >> | Bitwise Rightshilft/逐位右移 | Shifts the number in binary form by one place in the operation and returns the result./ 將操作數的所有位向右移動指定的位數。右移n位相當于除以 2 的 n 次方。 | a >> b |
?4.10.5 賦值運算符(Assignment Operators)
賦值運算符用于為變量賦值。賦值運算符左側的操作數是變量,右側的操作數是值。右側的值必須與左側的變量屬于相同的數據類型,否則編譯器會報錯。
賦值運算符可以與 C 中的其他運算符組合使用,從而使用單個運算符提供多項運算。這些運算符稱為復合運算符。
運算符 | 描述 | 實例 |
---|---|---|
= | 簡單的賦值運算符,把右邊操作數的值賦給左邊操作數 | C = A + B 將把 A + B 的值賦給 C |
+= | 加且賦值運算符,把右邊操作數加上左邊操作數的結果賦值給左邊操作數 | C += A 相當于 C = C + A |
-= | 減且賦值運算符,把左邊操作數減去右邊操作數的結果賦值給左邊操作數 | C -= A 相當于 C = C - A |
*= | 乘且賦值運算符,把右邊操作數乘以左邊操作數的結果賦值給左邊操作數 | C *= A 相當于 C = C * A |
/= | 除且賦值運算符,把左邊操作數除以右邊操作數的結果賦值給左邊操作數 | C /= A 相當于 C = C / A |
%= | 求模且賦值運算符,求兩個操作數的模賦值給左邊操作數 | C %= A 相當于 C = C % A |
<<= | 左移且賦值運算符 | C <<= 2 等同于 C = C << 2 |
>>= | 右移且賦值運算符 | C >>= 2 等同于 C = C >> 2 |
&= | 按位與且賦值運算符 | C &= 2 等同于 C = C & 2 |
^= | 按位異或且賦值運算符 | C ^= 2 等同于 C = C ^ 2 |
|= | 按位或且賦值運算符 | C |= 2 等同于 C = C | 2 |
// C program to illustrate the arithmatic operators
#include <stdio.h>int main()
{int a = 25, b = 5;// using operators and printing resultsprintf("a = b: %d\n", a = b);printf("a += b: %d\n", a += b);printf("a -= b: %d\n", a -= b);printf("a *= b: %d\n", a *= b);printf("a /= b: %d\n", a /= b);printf("a %= b: %d\n", a %= b);printf("a &= b: %d\n", a &= b);printf("a |= b: %d\n)", a |= b);printf("a >>= b: %d\n", a >> b);printf("a <<= b: %d\n", a << b);return 0;
}
4.10.6? 其它運算符(other Operators)
C 語言中還有一些其他運算符可用于執行某些特定任務。
運算符 | 描述 | 實例 |
---|---|---|
sizeof() | 返回變量的大小。 | sizeof(a) 將返回 4,其中 a 是整數。 |
& | 返回變量的地址。 | &a; 將給出變量的實際地址。 |
* | 指向一個變量。 | *a; 將指向一個變量。 |
? : | 條件表達式 | 如果條件為真 ? 則值為 X : 否則值為 Y |
點 (.) 和箭頭 (->) 運算符:
- 成員運算符用于引用類、結構和聯合的單個成員。
- 點運算符應用于實際對象。
- 箭頭運算符與指向對象的指針一起使用。
4.10.7 C 中的一元、二元和三元運算符
運算符還可以根據其處理的操作數數量分為三種類型:
- 一元運算符:處理單個操作數的運算符。
- 二進制運算符:處理兩個操作數的運算符。
- 三元運算符:處理三個操作數的運算符。
4.10.8??C 中的運算符優先級和關聯性
運算符的優先級確定表達式中項的組合。這會影響到一個表達式如何計算。某些運算符比其他運算符有更高的優先級,例如,乘除運算符具有比加減運算符更高的優先級。
將按運算符優先級從高到低列出各個運算符,具有較高優先級的運算符出現在表格的上面,具有較低優先級的運算符出現在表格的下面。在表達式中,較高優先級的運算符會優先被計算。
C 中的運算符優先級
運算符優先級確定當表達式具有多個運算符時,首先計算哪個運算符。例如,100-2 * 30
將產生 40,因為它被求值為100 - (2 * 30)
而不是(100-2)* 30
。原因是乘法*
的優先級高于減法(-
)。
C 中的關聯性
是指當表達式中有兩個或多個具有相同優先級的運算符時,這些運算符的執行順序。例如,乘法和除法算術運算符具有相同的優先級,假設我們有一個表達式5 * 2/10
,這個表達式將被計算為(5 * 2)/ 10
,因為這些運算符的關聯性是從左到右。類似地,20/2 * 5
將被計算為(20/2)*5
。
類別? | 運算符? | 結合性? |
---|---|---|
后綴? | () [] -> . ++ - - ? | 從左到右? |
一元? | + - ! ~ ++ - - (type)* & sizeof? | 從右到左? |
乘除? | * / %? | 從左到右? |
加減? | + -? | 從左到右? |
移位? | << >>? | 從左到右? |
關系? | < <= > >=? | 從左到右? |
相等? | == !=? | 從左到右? |
位與 AND? | &? | 從左到右? |
位異或 XOR? | ^? | 從左到右? |
位或 OR? | |? | 從左到右? |
邏輯與 AND? | &&? | 從左到右? |
邏輯或 OR? | ||? | 從左到右? |
條件? | ?:? | 從右到左? |
賦值? | = += -= *= /= %=>>= <<= &= ^= |=? | 從右到左? |
逗號? | ,? | 從左到右? |
4.11? 判斷
C 語言中條件語句的類型(Types of Conditional Statements in C)
- if 語句(Statement)
- if-else 語句
- 嵌套(Nested) if 語句
- if-else-if 梯子
- switch 語句
- 條件運算符——?? : 運算符(三元運算符)
- 跳轉語句:
- break
- continue
- goto
- return
if-else-if 梯子流程圖
?switch 語句流程圖
?條件運算符
(condition) ? [true_statements] : [false_statements];
?break
?continue
4.12? C語言中的循環(C – Loops)
Loops in programming are used to repeat a block of code until the specified condition is met. A loop statement allows programmers to execute a statement or group of statements multiple times without repetition of code.--編程中的循環用于重復代碼塊,直到滿足指定的條件。循環語句允許程序員多次執行一個語句或一組語句,而無需重復代碼
There are mainly two types of loops(循環) in C:
- 入口(Entry)控制回路:在入口控制回路中,在進入回路主體之前檢查測試條件。For 循環和 While 循環是 Entry 控制的循環。
- 退出受控循環:?在出口控制回路中,測試條件在回路主體的末尾進行評估。循環體將至少執行一次,無論條件是真還是假。do-while 循環是 Exit。
循環類型 | 描述 |
---|---|
while 循環 | 當給定條件為真時,重復語句或語句組。它會在執行循環主體之前測試條件。 |
for 循環 | 多次執行一個語句序列,簡化管理循環變量的代碼。 |
do...while 循環 | 除了它是在循環主體結尾測試條件外,其他與 while 語句類似。 |
嵌套循環 | 您可以在 while、for 或 do..while 循環內使用一個或多個循環。 |
for 循環(Loop)
Syntax(語法):
for (initialize expression(初始化表達式); test expression(測試表達式); update expression(更新表達式)) {//// body of for loop// }
example:
for(int i = 0; i < n; ++i)
{printf("Body of for loop which will execute till n");
}
While 循環(Loop)
?語法(Syntax):
initialization_expression;while (test_expression) {// body of the while loopupdate_expression; }
?Example:
// C program to illustrate
// while loop
#include <stdio.h>// Driver code
int main()
{
// Initialization expression
int i = 2; // Test expression
while(i < 10)
{// loop bodyprintf( "Hello World\n"); // update expressioni++;
} return 0;
}
?do-while 循環
循環主體都將至少執行一次。
?Syntax:
?
initialization_expression; do {// body of do-while loopupdate_expression;} while (test_expression);
?Example:
// C program to illustrate
// do-while loop
#include <stdio.h>// Driver code
int main()
{
// Initialization expression
int i = 2; do
{// loop bodyprintf( "Hello World\n"); // Update expressioni++;// Test expression
} while (i < 1); return 0;
}
循環控制語句
循環控制語句改變你代碼的執行順序。通過它你可以實現代碼的跳轉。
C 提供了下列的循環控制語句。點擊鏈接查看每個語句的細節。
控制語句 |
|
---|---|
break 語句 | 終止循環或?switch?語句,程序流將繼續執行緊接著循環或 switch 的下一條語句。 |
continue 語句 | 告訴一個循環體立刻停止本次循環迭代,重新開始下次循環迭代。 |
goto 語句 | 將控制轉移到被標記的語句。但是不建議在程序中使用 goto 語句。 |
?4.13? 函數(Function)
????????C 中的函數是一組語句,調用時執行某些特定任務。它是 C 程序的基本構建塊,提供模塊化和代碼可重用性。函數的編程語句括在{ } 括號內,具有特定含義并執行特定操作。在其他語言中,它們也稱為子例程或過程。
????????接下來將學習函數、函數定義、聲明、參數和形參、返回值等等。
????????函數的組成包括:
- 返回類型:一個函數可以返回一個值。return_type?是函數返回的值的數據類型。有些函數執行所需的操作而不返回值,在這種情況下,return_type 是關鍵字?void。
- 函數名稱:這是函數的實際名稱。函數名和參數列表一起構成了函數簽名。
- 參數:參數就像是占位符。當函數被調用時,您向參數傳遞一個值,這個值被稱為實際參數。參數列表包括函數參數的類型、順序、數量。參數是可選的,也就是說,函數可能不包含參數。
- 函數主體:函數主體包含一組定義函數執行任務的語句。
4.13.1 函數的聲明(Declarations)
語法(Syntax)
return_type name_of_the_function (parameter_1, parameter_2);
?注意:聲明函數時,參數名稱不是強制性的。我們也可以不使用數據變量的名稱來聲明函數。
4.13.2??函數的定義
?4.13.3 函數的調用
?
?注意:函數調用是將程序控制帶到函數定義處的必要操作。如果沒有調用,函數語句將不會被執行。
代碼示例:
?
// C program to show function
// call and definition
#include <stdio.h>// Function that takes two parameters
// a and b as inputs and returns
// their sum
int sum(int a, int b)
{ return a + b;
}// Driver code
int main()
{// Calling sum function and // storing its value in add variableint add = sum(10, 30);printf("Sum is: %d", add);return 0;
}
4.13.4 函數類型
1、庫函數
庫函數也稱為“內置函數”。編譯器包中已經包含這些函數,每個函數都有特定含義,并包含在包中。內置函數的優點是無需定義即可直接使用,而用戶定義函數必須在使用前聲明和定義。
比如:
pow()、sqrt()、strcmp()、strcpy() 等。
?C 庫函數的優點
- C 庫函數易于使用且經過優化,性能更佳。
- C 庫函數節省了大量時間,即函數開發時間。
- C 庫函數很方便,因為它們總是有效。
2、用戶定義的函數?
????????程序員創建的函數稱為用戶定義函數或“定制函數”。用戶定義函數可以根據程序員的需求進行改進和修改。
用戶定義函數的優點
- 可變功能可以根據需要進行修改。
- 這些函數的代碼可以在其他程序中重復使用。
- 這些功能易于理解、調試和維護。
4.13.5 函數參數類型
調用函數時傳遞的數據稱為實際參數。
形式參數是函數聲明中提到的變量和數據類型。
?兩種方式向 C 函數傳遞參數:
- ?按值傳遞
????????此方法中的參數傳遞將值從實際參數復制到形式函數參數中。因此,函數內部所做的任何更改都不會反映在調用者的參數中。?
- 通過引用傳遞(指針)
????????調用者的實際參數和函數的實際參數指向相同的位置,因此函數內部所做的任何更改都會反映在調用者的實際參數中。
C語言函數的不足:
- 無法返回多個值。
- 由于堆棧幀分配和程序控制傳輸而導致的內存和時間開銷。
?
?