菜鳥教程之C語言基礎(上)
一、前言:
前幾天,在看另一個教程視頻,總感覺太啰嗦,講的東西不符合我想要的。
這里,通過菜鳥教程,看一遍文檔,打一遍筆記,想通過這樣學一下C語言的基礎。
感謝菜鳥教程。
二、筆記:
1、C程序結構:
1 #include <stdio.h>
2
3 int main()
4 {
5 printf("hello world!\n");
6 return 0
7 }
C程序主要包括幾部分
預處理指令
函數
變量
語句或表達式
注釋
2、C基本語法
C程序由各種令牌組成(關鍵字、標識符、常量、字符串值、符號)
(1)分號
(2)注釋
(3)標識符
(4)關鍵字
關鍵字 | 說明 |
---|---|
auto | 聲明自動變量 |
break | 跳出當前循環 |
case | 開關語句分支 |
char | 聲明字符型變量或函數返回值類型 |
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 | 循環語句的循環條件 |
3、數據類型:
在C語言中,數據類型指的是用於聲明不同類型的變量或函數的一個廣泛的系統。
變量的類型決定了變量存儲占用的空間,以及如何解釋存儲的位模式。
C語言有4種數據類型:
(1)基本類型:
算術類型(整數類型、浮點類型)
(2)枚舉類型:
算術類型(被用來定義在程序中只能賦予其一定的離散整數值的變量)
(3)void類型:
(4)派生類型:
指針類型、數組類型、結構類型、共用體類型和函數類型
PS:數組類型和結構類型統稱聚合類型,函數類型指的是函數返回值的類型。
(5)整數類型+浮點類型:
關於標准整數類型的存儲大小和值范圍的細節:
類型 | 存儲大小 | 值范圍 |
---|---|---|
char | 1 字節 | -128 到 127 或 0 到 255 |
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 |
關於浮點類型的存儲大小和值范圍的細節:
類型 | 存儲大小 | 值范圍 | 精度 |
---|---|---|---|
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 位小數 |
void 類型指定沒有可用的值。它通常用於以下三種情況下:
序號 | 類型與描述 |
---|---|
1 | 函數返回為空 C 中有各種函數都不返回值,或者您可以說它們返回空。不返回值的函數的返回類型為空。例如 void exit (int status); |
2 | 函數參數為空 C 中有各種函數不接受任何參數。不帶參數的函數可以接受一個 void。例如 int rand(void); |
3 | 指針指向 void 類型為 void * 的指針代表對象的地址,而不是類型。例如,內存分配函數 void *malloc( size_t size ); 返回指向 void 的指針,可以轉換為任何數據類型。 |
4、變量:
(1)概念:
變量是程序可操作的存儲空間的名稱。
C中每個變量都有其特定類型,類決定了變量存儲的大小和布局(指定范圍內的值都可以存儲到內存中,運算符作用變量上)
變量的名稱可以由字母、數字和下划線字符組成。
它必須以字母或下划線開頭。
大寫字母和小寫字母是不同的,
C 是大小寫敏感的。
(2)變量類型:
char(一個字節,整數類型)、int、float(單精度浮點值)、double(雙精度浮點值)、void(類型缺失)
C語言中也允許定義各種其他類型的變量,如枚舉、指針、數組、結構、共用體等。
(3)聲明-->初始化
1)聲明:
變量聲明向編譯器保證變量以指定類型和名稱存在。
變量聲明有兩種情況:
A:需要建立存儲空間。如int a
B:不需要建立存儲空間,通過使用extern關鍵字聲明變量名。extern int a
2)初始化:
5、常量:
1)常量可以是任何基本數據類型:整數常量、浮點常量、字符常量、字符串字面值,枚舉常量。
2)字符常量:
轉義序列 | 含義 |
---|---|
\\ | \ 字符 |
\' | ' 字符 |
\" | " 字符 |
\? | ? 字符 |
\a | 警報鈴聲 |
\b | 退格鍵 |
\f | 換頁符 |
\n | 換行符 |
\r | 回車 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ooo | 一到三位的八進制數 |
\xhh . . . | 一個或多個數字的十六進制數 |
3)定義常量:
在C中,有兩種簡單的定義常量的方式:
#define
const
1 #include <stdio.h>
2
3 #define A 10
4
5 int main()
6 {
7 const int a = 10;
8 printf("%d\n",A);
9 print("a\n",a);
10 return 0;
11
12 }
6、存儲類:
(1)概念
存儲類定義C程序中變量或函數的范圍和生命周期。
這些說明符放置在它們所修飾的類型之前。
C程序中可用的存儲類:
auto\register\static\extern
(2)介紹:
1)auto:是所有局部變量默認的存儲類
1 {
2 int mount;
3 auto int month;//auto只能用在函數內,即只能修飾局部變量
4 }
2)register:用於定義存儲在寄存器中而不是RAM中的局部變量。該變量的最大值等於寄存器的大小。不能對其進行一元&運算(沒有內存位置)
1 {
2 register int miles;//寄存器只用有於需要快速訪問的變量
3 }
3)static:
A:stati存儲類指示編譯器在程序的聲明周期內保持局部變量的存在,
而不需要在每次它進入和離開作用域時進行創建和銷毀,
故使用static修飾局部變量時可以在函數調用之間保持局部變量的值。
B:static也可應用在全局變量。當修飾全部變量時,會使變量的作用域限制在聲明它的文件內。
全局聲明一個static變量或方法可以被任何函數或方法調用,只要這些方法出現跟static變量或方法同一個文件。
C:
1 #include <stdio.h>
2
3 void func1(void);
4 static int count=10;
5 int main()
6 {
7 while(count)
8 {
9 func1();
10 }
11 return 0;
12 }
13 void func1(void)
14 {
15 static int thingy=5;
16 thingy++;
17 printf("thingy is %d,count is %d\n",thingy,count);
18 }
19 ~
4)extern:
extern 存儲類用於提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。
當使用extern時,對於無法初始化的變量,會把變量名指向以惡搞之前定義過的存儲位置。
當有多個文件且定義了一個可以在其他文件中使用的全局變量或函數時,可以在其他文件中使用extern來得到已定義的變量或函數的引用。
即extern是用來在另一個文件中聲明一個全局變量或函數。
extern修飾符通常用於當有兩個或多個文件共享相同的全局變量或函數時候。
7、運算符:算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符、雜項運算符
(1)算術運算符:
運算符 | 描述 | 實例 |
---|---|---|
+ | 把兩個操作數相加 | A + B 將得到 30 |
- | 從第一個操作數中減去第二個操作數 | A - B 將得到 -10 |
* | 把兩個操作數相乘 | A * B 將得到 200 |
/ | 分子除以分母 | B / A 將得到 2 |
% | 取模運算符,整除后的余數 | B % A 將得到 0 |
++ | 自增運算符,整數值增加 1 | A++ 將得到 11 |
-- | 自減運算符,整數值減少 1 | A-- 將得到 9 |
(2)關系運算符:
運算符 | 描述 | 實例 |
---|---|---|
== | 檢查兩個操作數的值是否相等,如果相等則條件為真。 | (A == B) 不為真。 |
!= | 檢查兩個操作數的值是否相等,如果不相等則條件為真。 | (A != B) 為真。 |
> | 檢查左操作數的值是否大於右操作數的值,如果是則條件為真。 | (A > B) 不為真。 |
< | 檢查左操作數的值是否小於右操作數的值,如果是則條件為真。 | (A < B) 為真。 |
>= | 檢查左操作數的值是否大於或等於右操作數的值,如果是則條件為真。 | (A >= B) 不為真。 |
<= | 檢查左操作數的值是否小於或等於右操作數的值,如果是則條件為真。 | (A <= B) 為真。 |
(3)邏輯運算符:
運算符 | 描述 | 實例 |
---|---|---|
&& | 稱為邏輯與運算符。如果兩個操作數都非零,則條件為真。 | (A && B) 為假。 |
|| | 稱為邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為真。 | (A || B) 為真。 |
! | 稱為邏輯非運算符。用來逆轉操作數的邏輯狀態。如果條件為真則邏輯非運算符將使其為假。 | !(A && B) 為真。 |
(4)位運算符:
(5)位運算符:
運算符 | 描述 | 實例 |
---|---|---|
& | 按位與操作,按二進制位進行"與"運算。運算規則: 0&0=0;
0&1=0;
1&0=0;
1&1=1; |
(A & B) 將得到 12,即為 0000 1100 |
| | 按位或運算符,按二進制位進行"或"運算。運算規則: 0|0=0;
0|1=1;
1|0=1;
1|1=1; |
(A | B) 將得到 61,即為 0011 1101 |
^ | 異或運算符,按二進制位進行"異或"運算。運算規則: 0^0=0;
0^1=1;
1^0=1;
1^1=0; |
(A ^ B) 將得到 49,即為 0011 0001 |
~ | 取反運算符,按二進制位進行"取反"運算。運算規則: ~1=0;
~0=1; |
(~A ) 將得到 -61,即為 1100 0011,一個有符號二進制數的補碼形式。 |
<< | 二進制左移運算符。將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。 | A << 2 將得到 240,即為 1111 0000 |
>> | 二進制右移運算符。將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。 |
(6)賦值運算符:
運算符 | 描述 | 實例 |
---|---|---|
= | 簡單的賦值運算符,把右邊操作數的值賦給左邊操作數 | 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 |
(7)雜項運算符:
運算符 | 描述 | 實例 |
---|---|---|
sizeof() | 返回變量的大小。 | sizeof(a) 將返回 4,其中 a 是整數。 |
& | 返回變量的地址。 | &a; 將給出變量的實際地址。 |
* | 指向一個變量。 | *a; 將指向一個變量。 |
? : | 條件表達式 | 如果條件為真 ? 則值為 X : 否則值為 Y |
(8)運算符的優先級:
下表將按運算符優先級從高到低列出各個運算符,具有較高優先級的運算符出現在表格的上面,
具有較低優先級的運算符出現在表格的下面。在表達式中,較高優先級的運算符會優先被計算。
類別 | 運算符 | 結合性 |
---|---|---|
后綴 | () [] -> . ++ - - | 從左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof | 從右到左 |
乘除 | * / % | 從左到右 |
加減 | + - | 從左到右 |
移位 | << >> | 從左到右 |
關系 | < <= > >= | 從左到右 |
相等 | == != | 從左到右 |
位與 AND | & | 從左到右 |
位異或 XOR | ^ | 從左到右 |
位或 OR | | | 從左到右 |
邏輯與 AND | && | 從左到右 |
邏輯或 OR | || | 從左到右 |
條件 | ?: | 從右到左 |
賦值 | = += -= *= /= %=>>= <<= &= ^= |= | 從右到左 |
逗號 | , | 從左到右 |
8、判斷:C語言把任何非零和非空的值定為true,把零和null定為false
(1)if:
1 #include <stdio.h>
2 int main()
3 {
4 int a = 10;
5 if(a < 20)
6 {
7 printf("a < 20\n");
8 }
9 printf("a is %d\n\n",a);
10 return 0;
11 }
(2)if else:
1 #include <stdio.h>
2 int main()
3 {
4 int a = 10;
5 if(a < 20)
6 {
7 printf("a < 20\n");
8 }
9 else{
10 printf("a > 20\n",a);
11 }
12 printf("a is %d\n",a);
13 return 0;
14 }
15 ~
(3)嵌套if:
1 #include <stdio.h>
2 int main()
3 {
4 int a = 100;
5 int b = 200;
6
7 if(a == 100)
8 {
9 if(b ==200 )
10 {
11 printf("a from 100 to 200\n");
12 }
13 }
14 printf("a is %d\n",a);
15 printf("b is %d\n",b);
16 return 0;
17 }
(4)switch:
1 #include <stdio.h>
2 int main()
3 {
4 char grade = 'B';
5
6 switch (grade)
7 {
8 case 'A':
9 printf("nice\n");
10 break;
11 case 'B':
12 printf("not bad\n");
13 break;
14 default:
15 printf("well\n");
16 }
17 printf("your grade is %c\n",grade);
18 return 0;
19 }
(5)嵌套switch:
1 #include <stdio.h>
2 int main()
3 {
4 int a =100;
5 int b ==200;
6 switch(a)
7 {
8 case 100:
9 printf("this is one\n");
10 switch(b)
11 {
12 case 200:
13 printf("this is two\n");
14 }
15 }
16 printf("a is %d\n",a);
17 printf("b is %d\n",b);
18 return 0;
19
20 }
(6)三元運算符(?:)
exp1 ? exp2 : exp3;
如果exp1為真則運行exp2,否則運行exp3
1 #include <stdio.h>
2 int main()
3 {
4 int num;
5 printf("input a number:\n");
6 scanf("%d",&num);
7 (num%2==0)?print("T"):print("J");
8 }
1 ubuntu@ubuntu:~/c_demo$ ./1
2 input a number:3
3 J
4 ubuntu@ubuntu:~/c_demo$ cat 1.c
5 #include <stdio.h>
6 int main()
7 {
8 int num;
9 printf("input a number:");
10 scanf("%d",&num);
11 (num%2==0)?printf("T\n"):printf("J\n");
12 }
13 ubuntu@ubuntu:~/c_demo$
9、循環:
循環:
(1)while
1 #include <stdio.h>
2 int main()
3 {
4 int a = 10;
5 while (a < 20)
6 {
7 printf("a is %d\n",a);
8 a++;
9 }
10 return 0;
11 }
(2)for
1 #include <stdio.h>
2 int main()
3 {
4 for (int a=10;a< 20;a = a+1)
5 {
6 printf("a is %d\n",a);
7 }
8 return 0;
9 }
(3)do while
1 #include <stdio.h>
2 int main()
3 {
4 int a = 10;
5 do
6 {
7 printf("a is %d\n",a);
8 a = a+1;
9 }
10 while(a < 20);
11 return 0;
12 }
(4)嵌套循環:
1 #include <stdio.h>
2 int main()
3 {
4 int i ,j;
5 for (1 = 2;i <100;i ++)
6 {
7 for (j=2;j <=(i/j);j ++)
8 {
9 if (!(i/j))
10 break;
11 if (j > (i/j))
12 printf("%d is well\n",i) ;
13 }
14 }
15 return 0;
16 }
循環控制語句:
(1)break
1 #include <stdio.h>
2 int main()
3 {
4 int a = 10;
5 while (a < 20)
6 {
7 printf("a is %d\n",a);
8 a++;
9 if (a >15)
10 {
11 break;
12 }
13 }
14 return 0;
15 }
(2)continue
1 #include <stdio.h>
2 int main()
3 {
4 int a = 10;
5 do
6 {
7 if (a == 15)
8 {
9 a = a +1;
10 continue;
11 }
12 printf("a is %d\n",a);
13 a++;
14 }
15 while(a < 20);
16 return 0;
17 }
(3)goto:C語言中的goto語句允許把控制無條件轉移到同一個函數內被標記的語句。
1 #include <stdio.h>
2 int main()
3 {
4 int a = 10;
5 LOOP:do
6 {
7 if (a ==15)
8 {
9 a = a+1;
10 goto LOOP;
11 }
12 printf("a is %d\n",a);
13 a ++;
14 }
15 while (a <20);
16 return 0;
17 }
無限循環:
1 #include <stdio.h>
2 int main()
3 {
4 for (;;)
5 {
6 printf("well");
7 }
8 return 0;
9 }
10
11 int main2()
12 {
13 while (true) //1
14 {
15 printf("well");
16 }
17 return 0;
18 }