《C语言基础学习笔记》—— 黑马程序员 <Part1-4>
《C語言基礎學習筆記 Part1-4》
- Part 1 基礎介紹
- 1. 第一個C語言程序:HelloWorld
- 1.1 編寫C語言代碼:hello.c
- 1.2代碼分析
- 1)include 頭文件
- 2)main函數
- 3){ } 括號、程序塊和代碼塊
- 4)注釋
- 5)printf函數
- 6)return函數
- 1.3編譯過程
- 1.3.1 C語言編譯步驟
- 1.4 CPU內部結構與寄存器
- 1.5 集成開發環境IDE
- 1.5.1 Microsoft Visual Studio
- Part 2 數據類型
- 2.1 常量與變量
- 2.1.1 關鍵字
- 2.1.2 數據類型
- 2.1.3 常量
- 2.1.4 變量
- 1)變量
- 2)聲明和定義區別
- 2.2整型 :int
- 2.2.1整型變量的定義和輸出
- 2.2.2整型變量的輸入
- 2.2.3 short、int、long、long long
- 2.2.4 有符號數和無符號數區別
- 1)有符號數
- 2)無符號數
- 3)有符號和無符號整型取值范圍
- 2.3 sizeof關鍵字
- 2.4字符型
- 2.4.1 字符變量的定義和輸出
- 2.4.2字符變量的輸入
- 2.4.3 ASCII對照表
- 2.4.4 轉義字符
- 2.5實型(浮點型):float、double
- 2.6進制
- 2.6.1 二進制
- 2.6.2 八進制
- 2.6.3 十六進制
- 2.6.4 C語言如何表示相應進制數
- 2.7 計算機內存數值存儲方式
- 2.8類型限定符
- 2.9字符串格式化輸出和輸入
- 2.9.1 字符串常量
- 2.9.2 printf函數和putchar函數
- 2.9.3 scanf函數與getchar函數
- Part 3 運算符與表達式
- 3.1常用運算符分類
- 3.2 算術運算符
- 3.3 賦值運算符
- 3.4比較運算符
- 3.5 邏輯運算符
- 3.6 運算符優先級
- 3.7類型轉換
- 3.7.1 隱式轉換
- 3.7.2 強制轉換
- Part 4 程序流程結構
- 4.1概述
- 4.2選擇結構
- 4.2.1 if 語句
- 4.2.2 if else
- 4.2.3 三目運算符
- 4.2.4 switch語句
- 4.3循環結構
- 4.3.1 while 語句
- 4.3.2 do while語句
- 4.3.3 for 語句
- 4.3.4 嵌套結構
- 4.4 跳轉語句 break、continue、goto
- 4.3.1 break 語句
- 4.3.2 continue語句
- 4.3.3 goto語句(無條件跳轉,盡量少用)
- 參考
Part 1 基礎介紹
1. 第一個C語言程序:HelloWorld
1.1 編寫C語言代碼:hello.c
#include <stdio.h>int main() {//這是第一個C語言代碼 printf("hello world\n");return 0; }C語言的源代碼文件是一個普通的文本文件,但擴展名必須是.c。
1.2代碼分析
1)include 頭文件
- #include的意思是頭文件包含,#include <stdio.h>代表包含stdio.h這個頭文件
- 使用C語言庫函數需要提前包含庫函數對應的頭文件,如這里使用了printf()函數,需要包含stdio.h頭文件
- 可以通過man 3 printf查看printf所需的頭文件
#include< > 與 #include ""的區別:
-
< > 表示系統直接按系統指定的目錄檢索
-
“” 表示系統先在 “” 指定的路徑(沒寫路徑代表當前路徑)查找頭文件,如果找不到,再按系統指定的目錄檢索
2)main函數
- 一個完整的C語言程序,是由一個、且只能有一個main()函數(又稱主函數,必須有)和若干個其他函數結合而成(可選)。
- main函數是C語言程序的入口,程序是從main函數開始執行。
3){ } 括號、程序塊和代碼塊
- { }叫代碼塊,一個代碼塊內部可以有一條或者多條語句
- C語言每句可執行代碼都是";"分號結尾
- 所有的#開頭的行,都代表預編譯指令,預編譯指令行結尾是沒有分號的
- 所有的可執行語句必須是在代碼塊里面
4)注釋
- //叫行注釋,注釋的內容編譯器是忽略的,注釋主要的作用是在代碼中加一些說明和解釋,這樣有利于代碼的閱讀
- /**/叫塊注釋
- 塊注釋是C語言標準的注釋方法
- 行注釋是從C++語言借鑒過來的
5)printf函數
- printf是C語言庫函數,功能是向標準輸出設備輸出一個字符串
- printf(“hello world\n”); // \n的意思是回車換行
6)return函數
- return代表函數執行完畢,返回return代表函數的終止
- 如果main定義的時候前面是int,那么return后面就需要寫一個整數;如果main定義的時候前面是void,那么return后面什么也不需要寫
- 在main函數中return 0代表程序執行成功,return -1代表程序執行失敗
- int main()和void main()在C語言中是一樣的,但C++只接受int main這種定義方式
1.3編譯過程
1.3.1 C語言編譯步驟
C代碼編譯成可執行程序經過4步:
1.4 CPU內部結構與寄存器
1.5 集成開發環境IDE
集成開發環境(IDE,Integrated Development Environment )是用于提供程序開發環境的應用程序,一般包括代碼編輯器、編譯器、調試器和圖形用戶界面工具。集成了代碼編寫功能、分析功能、編譯功能、調試功能等一體化的開發軟件服務套。所有具備這一特性的軟件或者軟件套(組)都可以叫集成開發環境。
1.5.1 Microsoft Visual Studio
Microsoft Visual Studio(簡稱VS)是美國微軟公司的開發工具包系列產品。VS是一個基本完整的開發工具集,它包括了整個軟件生命周期中所需要的大部分工具,如UML工具、代碼管控工具、集成開發環境(IDE)等等,所寫的目標代碼適用于微軟支持的所有平臺。Visual Studio是目前最流行的Windows平臺應用程序的集成開發環境。
**VS常用快捷鍵 **
| Ctrl + k,Ctrl + f | 自動格式化代碼 |
| Ctrl + k,Ctrl + c | 注釋代碼 |
| Ctrl + k,Ctrl + u | 取消注釋代碼 |
| F9 | 設置斷點 |
| F5 | 調試運行 |
| Ctrl + F5 | 不調試運行 |
| Ctrl + Shift + b | 編譯,不運行 |
| F10 | next調試 |
| F11 | step調試 |
Part 2 數據類型
2.1 常量與變量
2.1.1 關鍵字
C語言共有32個關鍵字。
- 數據類型關鍵字(12個)
char ,short, int, long, float, double, unsigned, signed, struct, union,enum, void,
- 控制語句關鍵字(12個)
if, else, swith,case, default,for, do, while, break, continue, goto, return,
- 存儲類關鍵字(5個)
auto, extern, register,static,const
- 其他關鍵字(3個)
sizeof,typedef,volatile
2.1.2 數據類型
數據類型的作用:編譯器預算對象(變量)分配的內存空間大小。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dNRzydVB-1627308486734)(file:///C:/Users/t480s/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]
2.1.3 常量
- 在程序運行過程中,其值不能被改變的量
- 常量一般出現在表達式或賦值語句中
| 整型常量 | 100,200,-100,0 |
| 實型常量 | 3.14 , 0.125,-3.123 |
| 字符型常量 | ‘a’,‘b’,‘1’,‘\n’ |
| 字符串常量 | “a”,“ab”,“12356” |
2.1.4 變量
1)變量
- 在程序運行過程中,其值可以改變
- 變量在使用前必須先定義,定義變量前必須有相應的數據類型
標識符命名規則:
- 標識符不能是關鍵字
- 標識符只能由字母、數字、下劃線組成
- 第一個字符必須為字母或下劃線
- 標識符中字母區分大小寫
變量特點:
- 變量在編譯時為其分配相應的內存空間
- 可以通過其名字和地址訪問相應內存
2)聲明和定義區別
- 聲明變量不需要建立存儲空間,如:extern int a;
- 定義變量需要建立存儲空間,如:int b;
從廣義的角度來講聲明中包含著定義,即定義是聲明的一個特例,所以并非所有的聲明都是定義:
- int b 它既是聲明,同時又是定義
- 對于 extern b來講它只是聲明不是定義
一般的情況下,把建立存儲空間的聲明稱之為“定義”,而把不需要建立存儲空間的聲明稱之為“聲明”。
#include <stdio.h> #define MAX 10 //聲明了一個常量,名字叫MAX,值是10,常量的值一旦初始化不可改int main() {int a; //定義了一個變量,其類型為int,名字叫aconst int b = 10; //定義一個const常量,名為叫b,值為10//b = 11; //err,常量的值不能改變//MAX = 100; //err,常量的值不能改變a = MAX;//將abc的值設置為MAX的值a = 123;printf("%d\n", a); //打印變量a的值return 0; }2.2整型 :int
2.2.1整型變量的定義和輸出
| %d | 輸出一個有符號的10進制int類型 |
| %o(字母o) | 輸出8進制的int類型 |
| %x | 輸出16進制的int類型,字母以小寫輸出 |
| %X | 輸出16進制的int類型,字母以大寫輸出 |
| %u | 輸出一個10進制的無符號數 |
2.2.2整型變量的輸入
#include <stdio.h>int main() {int a;printf("請輸入a的值:");//不要加“\n”scanf("%d", &a);printf("a = %d\n", a); //打印a的值return 0; }2.2.3 short、int、long、long long
| short(短整型) | 2字節 |
| int(整型) | 4字節 |
| long(長整形) | Windows為4字節,Linux為4字節(32位),8字節(64位) |
| long long(長長整形) | 8字節 |
- 需要注意的是,整型數據在內存中占的字節數與所選擇的操作系統有關。雖然 C 語言標準中沒有明確規定整型數據的長度,但 long 類型整數的長度不能短于 int 類型, short 類型整數的長度不能長于 int 類型。
- 當一個小的數據類型賦值給一個大的數據類型,不會出錯,因為編譯器會自動轉化。但當一個大的類型賦值給一個小的數據類型,那么就可能丟失高位。
| 10 | 代表int類型 |
| 10l, 10L | 代表long類型 |
| 10ll, 10LL | 代表long long類型 |
| 10u, 10U | 代表unsigned int類型 |
| 10ul, 10UL | 代表unsigned long類型 |
| 10ull, 10ULL | 代表unsigned long long類型 |
| %hd | 輸出short類型 |
| %d | 輸出int類型 |
| %ld | 輸出long類型 |
| %lld | 輸出long long類型 |
| %hu | 輸出unsigned short類型 |
| %u | 輸出unsigned int類型 |
| %lu | 輸出unsigned long類型 |
| %llu | 輸出unsigned long long類型 |
2.2.4 有符號數和無符號數區別
1)有符號數
有符號數是最高位為符號位,0代表正數,1代表負數。
#include <stdio.h>int main() {signed int a = -1089474374; //定義有符號整型變量aprintf("%X\n", a); //結果為 BF0FF0BA//B F 0 F F 0 B A//1011 1111 0000 1111 1111 0000 1011 1010return 0; }2)無符號數
無符號數最高位不是符號位,而就是數的一部分,無符號數不可能是負數。
#include <stdio.h>int main() {unsigned int a = 3236958022; //定義無符號整型變量aprintf("%X\n", a); //結果為 C0F00F46return 0; }當我們寫程序要處理一個不可能出現負值的時候,一般用無符號數,這樣可以增大數的表達最大值。
3)有符號和無符號整型取值范圍
| short | 2字節 | -32768 到 32767 (-215 ~ 215-1) |
| int | 4字節 | -2147483648 到 2147483647 (-231 ~ 231-1) |
| long | 4字節 | -2147483648 到 2147483647 (-231 ~ 231-1) |
| unsigned short | 2字節 | 0 到 65535 (0 ~ 216-1) |
| unsigned int | 4字節 | 0 到 4294967295 (0 ~ 232-1) |
| unsigned long | 4字節 | 0 到 4294967295 (0 ~ 232-1) |
2.3 sizeof關鍵字
- sizeof不是函數,所以不需要包含任何頭文件,它的功能是計算一個數據類型的大小,單位為字節
- sizeof的返回值為size_t
- size_t類型在32位操作系統下是unsigned int,是一個無符號的整數
2.4字符型
2.4.1 字符變量的定義和輸出
字符型變量用于存儲一個單一字符,在 C 語言中用 char 表示,其中每個字符變量都會占用 1 個字節。在給字符型變量賦值時,需要用**一對英文半角格式的單引號(’ ')**把字符括起來。
字符變量實際上并不是把該字符本身放到變量的內存單元中去,而是將該字符對應的 ASCII 編碼放到變量的存儲單元中。char的本質就是一個1字節大小的整型。
#include <stdio.h>int main() {char ch = 'a';printf("sizeof(ch) = %u\n", sizeof(ch)); // sizeof() 輸出特定值占用內存的大小,單位:字節printf("ch[%%c] = %c\n", ch); //打印字符printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值char A = 'A';char a = 'a';printf("a = %d\n", a); //97printf("A = %d\n", A); //65printf("A = %c\n", 'a' - 32); //小寫a轉大寫Aprintf("a = %c\n", 'A' + 32); //大寫A轉小寫ach = ' ';printf("空字符:%d\n", ch); //空字符ASCII的值為32printf("A = %c\n", 'a' - ' '); //小寫a轉大寫Aprintf("a = %c\n", 'A' + ' '); //大寫A轉小寫areturn 0; }2.4.2字符變量的輸入
#include <stdio.h>int main() {char ch;printf("請輸入ch的值:");//不要加“\n”scanf("%c", &ch);printf("ch = %c\n", ch); //打印ch的字符return 0; }2.4.3 ASCII對照表
| 0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
| 1 | SOH | 33 | ! | 65 | A | 97 | a |
| 2 | STX | 34 | " | 66 | B | 98 | b |
| 3 | ETX | 35 | # | 67 | C | 99 | c |
| 4 | EOT | 36 | $ | 68 | D | 100 | d |
| 5 | ENQ | 37 | % | 69 | E | 101 | e |
| 6 | ACK | 38 | & | 70 | F | 102 | f |
| 7 | BEL | 39 | , | 71 | G | 103 | g |
| 8 | BS | 40 | ( | 72 | H | 104 | h |
| 9 | HT | 41 | ) | 73 | I | 105 | i |
| 10 | LF | 42 | * | 74 | J | 106 | j |
| 11 | VT | 43 | + | 75 | K | 107 | k |
| 12 | FF | 44 | , | 76 | L | 108 | l |
| 13 | CR | 45 | - | 77 | M | 109 | m |
| 14 | SO | 46 | . | 78 | N | 110 | n |
| 15 | SI | 47 | / | 79 | O | 111 | o |
| 16 | DLE | 48 | 0 | 80 | P | 112 | p |
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q |
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r |
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s |
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t |
| 21 | NAK | 53 | 5 | 85 | U | 117 | u |
| 22 | SYN | 54 | 6 | 86 | V | 118 | v |
| 23 | TB | 55 | 7 | 87 | W | 119 | w |
| 24 | CAN | 56 | 8 | 88 | X | 120 | x |
| 25 | EM | 57 | 9 | 89 | Y | 121 | y |
| 26 | SUB | 58 | : | 90 | Z | 122 | z |
| 27 | ESC | 59 | ; | 91 | [ | 123 | { |
| 28 | FS | 60 | < | 92 | / | 124 | | |
| 29 | GS | 61 | = | 93 | ] | 125 | } |
| 30 | RS | 62 | > | 94 | ^ | 126 | ` |
| 31 | US | 63 | ? | 95 | _ | 127 | DEL |
ASCII 碼大致由以下兩部分組成:
- ASCII 非打印控制字符: ASCII 表上的數字 0-31 分配給了控制字符,用于控制像打印機等一些外圍設備。
- ASCII 打印字符:數字 32-126 分配給了能在鍵盤上找到的字符,當查看或打印文檔時就會出現。數字 127 代表 Del 命令。
2.4.4 轉義字符
| \a | 警報 | 007 |
| \b | 退格(BS) ,將當前位置移到前一列 | 008 |
| \f | 換頁(FF),將當前位置移到下頁開頭 | 012 |
| \n | 換行(LF) ,將當前位置移到下一行開頭 | 010 |
| \r | 回車(CR) ,將當前位置移到本行開頭 | 013 |
| \t | 水平制表(HT) (跳到下一個TAB位置) | 009 |
| \v | 垂直制表(VT) | 011 |
| \ | 代表一個反斜線字符"" | 092 |
| ’ | 代表一個單引號(撇號)字符 | 039 |
| " | 代表一個雙引號字符 | 034 |
| ? | 代表一個問號 | 063 |
| \0 | 數字0 | 000 |
| \ddd | 8進制轉義字符,d范圍0~7 | 3位8進制 |
| \xhh | 16進制轉義字符,h范圍09,af,A~F | 3位16進制 |
2.5實型(浮點型):float、double
實型變量也可以稱為浮點型變量,浮點型變量是用來存儲小數數值的。在C語言中, 浮點型變量分為兩種: 單精度浮點數(float)、 雙精度浮點數(double), 但是double型變量所表示的浮點數比 float 型變量更精確。
由于浮點型變量是由有限的存儲單元組成的,因此只能提供有限的有效數字。在有效位以外的數字將被舍去,這樣可能會產生一些誤差。
不以f結尾的常量是double類型,以f結尾的常量(如3.14f)是float類型。
#include <stdio.h>int main() {//傳統方式賦值float a = 3.14f; //或3.14Fdouble b = 3.14;printf("a = %f\n", a);printf("b = %lf\n", b);//科學法賦值a = 3.2e3f; //3.2*1000 = 3200,e可以寫Eprintf("a1 = %f\n", a);a = 100e-3f; //100*0.001 = 0.1printf("a2 = %f\n", a);a = 3.1415926f;printf("a3 = %f\n", a); //結果為3.141593return 0; }2.6進制
進制也就是進位制,是人們規定的一種進位方法。 對于任何一種進制—X進制,就表示某一位置上的數運算時是逢X進一位。 十進制是逢十進一,十六進制是逢十六進一,二進制就是逢二進一,以此類推,x進制就是逢x進位。
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 2 | 10 | 2 | 2 |
| 3 | 11 | 3 | 3 |
| 4 | 100 | 4 | 4 |
| 5 | 101 | 5 | 5 |
| 6 | 110 | 6 | 6 |
| 7 | 111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |
2.6.1 二進制
二進制是計算技術中廣泛采用的一種數制。二進制數據是用0和1兩個數碼來表示的數。它的基數為2,進位規則是“逢二進一”,借位規則是“借一當二”。
當前的計算機系統使用的基本上是二進制系統,數據在計算機中主要是以補碼的形式存儲的。
| bit(比特) | 一個二進制代表一位,一個位只能表示0或1兩種狀態。數據傳輸是習慣以“位”(bit)為單位。 |
| Byte(字節) | 一個字節為8個二進制,稱為8位,計算機中存儲的最小單位是字節。數據存儲是習慣以“字節”(Byte)為單位。 |
| WORD(雙字節) | 2個字節,16位 |
| DWORD | 兩個WORD,4個字節,32位 |
| 1b | 1bit,1位 |
| 1B | 1Byte,1字節,8位 |
| 1k,1K | 1024 |
| 1M(1兆) | 1024k, 1024*1024 |
| 1G | 1024M |
| 1T | 1024G |
| 1Kb(千位) | 1024bit,1024位 |
| 1KB(千字節) | 1024Byte,1024字節 |
| 1Mb(兆位) | 1024Kb = 1024 * 1024bit |
| 1MB(兆字節) | 1024KB = 1024 * 1024Byte |
十進制轉化二進制的方法:用十進制數除以2,分別取余數和商數,商數為0的時候,將余數倒著數就是轉化后的結果。
十進制的小數轉換成二進制:小數部分和2相乘,取整數,不足1取0,每次相乘都是小數部分,順序看取整后的數就是轉化后的結果。
2.6.2 八進制
八進制,Octal,縮寫OCT或O,一種以8為基數的計數法,采用0,1,2,3,4,5,6,7八個數字,逢八進1。一些編程語言中常常以數字0開始表明該數字是八進制。
八進制的數和二進制數可以按位對應(八進制一位對應二進制三位),因此常應用在計算機語言中。
2.6.3 十六進制
十六進制(英文名稱:Hexadecimal),同我們日常生活中的表示法不一樣,它由0-9,A-F組成,字母不區分大小寫。與10進制的對應關系是:0-9對應0-9,A-F對應10-15。
十六進制的數和二進制數可以按位對應(十六進制一位對應二進制四位),因此常應用在計算機語言中。
2.6.4 C語言如何表示相應進制數
| 八進制 | 以數字0開頭,如0123 |
| 十六進制 | 以0x開頭,如0x123 |
| 二進制 | C語言不能直接書寫二進制數 |
2.7 計算機內存數值存儲方式
2.8類型限定符
| extern | 聲明一個變量,extern聲明的變量沒有建立存儲空間。 extern int a;//變量在定義的時候創建存儲空間 |
| const | 定義一個常量,常量的值不能修改。 const int a = 10; |
| Volatile | 防止編譯器優化代碼 |
| register | 定義寄存器變量,提高效率。register是建議型的指令,而不是命令型的指令,如果CPU有空閑寄存器,那么register就生效,如果沒有空閑寄存器,那么register無效。 |
2.9字符串格式化輸出和輸入
2.9.1 字符串常量
- 字符串是內存中一段連續的char空間,以’\0’(數字0)結尾。
- 字符串常量是由**雙引號**括起來的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
字符串常量與字符常量的不同:
每個字符串的結尾,編譯器會自動的添加一個結束標志位’\0’,即 “a” 包含兩個字符’a’和’\0’。
2.9.2 printf函數和putchar函數
printf是輸出一個字符串,putchar輸出一個char。
printf格式字符:
| %d | int | 接受整數值并將它表示為有符號的十進制整數 |
| %hd | short int | 短整數 |
| %hu | unsigned short | 無符號短整數 |
| %o | unsigned int | 無符號8進制整數 |
| %u | unsigned int | 無符號10進制整數 |
| %x,%X | unsigned int | 無符號16進制整數,x對應的是abcdef,X對應的是ABCDEF |
| %f | float | 單精度浮點數 |
| %lf | double | 雙精度浮點數 |
| %e,%E | double | 科學計數法表示的數,此處"e"的大小寫代表在輸出時用的"e"的大小寫 |
| %c | char | 字符型。可以把輸入的數字按照ASCII碼相應轉換為對應的字符 |
| %s | char * | 字符串。輸出字符串中的字符直至字符串中的空字符(字符串以’\0‘結尾,這個’\0’即空字符) |
| %p | void * | 以16進制形式輸出指針 |
| %% | % | 輸出一個百分號 |
printf附加格式:
| l(字母l) | 附加在d,u,x,o前面,表示長整數 |
| - | 左對齊 |
| m(代表一個整數) | 數據最小寬度 |
| 0(數字0) | 將輸出的前面補上0直到占滿指定列寬為止不可以搭配使用- |
| m.n(代表一個整數) | m指域寬,即對應的輸出項在輸出設備上所占的字符數。n指精度,用于說明輸出的實型數的小數位數。對數值型的來說,未指定n時,隱含的精度為n=6位。 |
2.9.3 scanf函數與getchar函數
- getchar是從標準輸入設備讀取一個char。
- scanf通過%轉義的方式可以得到用戶通過標準輸入設備輸入的數據。
Part 3 運算符與表達式
3.1常用運算符分類
| 算術運算符 | 用于處理四則運算 |
| 賦值運算符 | 用于將表達式的值賦給變量 |
| 比較運算符 | 用于表達式的比較,并返回一個真值或假值 |
| 邏輯運算符 | 用于根據表達式的值返回真值或假值 |
| 位運算符 | 用于處理數據的位運算 |
| sizeof運算符 | 用于求字節數長度 |
3.2 算術運算符
| + | 正號 | +3 | 3 |
| - | 負號 | -3 | -3 |
| + | 加 | 10 + 5 | 15 |
| - | 減 | 10 - 5 | 5 |
| * | 乘 | 10 * 5 | 50 |
| / | 除 | 10 / 5 | 2 |
| % | 取模(取余) | 10 % 3 | 1 |
| ++ | 前自增 | a=2; b=++a; | a=3; b=3; |
| ++ | 后自增 | a=2; b=a++; | a=3; b=2; |
| – | 前自減 | a=2; b=–a; | a=1; b=1; |
| – | 后自減 | a=2; b=a–; | a=1; b=2; |
3.3 賦值運算符
| = | 賦值 | a=2; b=3; | a=2; b=3; |
| += | 加等于 | a=0; a+=2; | a=2; |
| -= | 減等于 | a=5; a-=3; | a=2; |
| *= | 乘等于 | a=2; a*=2; | a=4; |
| /= | 除等于 | a=4; a/=2; | a=2; |
| %= | 模等于 | a=3; a%2; | a=1; |
3.4比較運算符
C 語言的比較運算中, “真”用數字“1”來表示, “假”用數字“0”來表示。
| == | 相等于 | 4 == 3 | 0 |
| != | 不等于 | 4 != 3 | 1 |
| < | 小于 | 4 < 3 | 0 |
| > | 大于 | 4 > 3 | 1 |
| <= | 小于等于 | 4 <= 3 | 0 |
| >= | 大于等于 | 4 >= 1 | 1 |
3.5 邏輯運算符
| ! | 非 | !a | 如果a為假,則!a為真; 如果a為真,則!a為假。 |
| && | 與 | a && b | 如果a和b都為真,則結果為真,否則為假。 |
| || | 或 | a || b | 如果a和b有一個為真,則結果為真,二者都為假時,結果為假。 |
3.6 運算符優先級
| 1 | [] | 數組下標 | 數組名[常量表達式] | 左到右 | – |
| () | 圓括號 | (表達式)/函數名(形參表) | – | ||
| 2 | - | 負號運算符 | -表達式 | 右到左 | 單目運算符 |
| ~ | 按位取反運算符 | ~表達式 | |||
| ++ | 自增運算符 | ++變量名/變量名++ | |||
| – | 自減運算符 | –變量名/變量名– | |||
| ***** | 取值運算符 | *指針變量 | |||
| & | 取地址運算符 | &變量名 | |||
| ! | 邏輯非運算符 | !表達式 | |||
| (類型) | 強制類型轉換 | (數據類型)表達式 | – | ||
| sizeof | 長度運算符 | sizeof(表達式) | – | ||
| 3 | / | 除 | 表達式/表達式 | 左到右 | 雙目運算符 |
| ***** | 乘 | 表達式*表達式 | |||
| % | 余數(取模) | 整型表達式%整型表達式 | |||
| 4 | + | 加 | 表達式+表達式 | 左到右 | 雙目運算符 |
| - | 減 | 表達式-表達式 | |||
| 5 | << | 左移 | 變量<<表達式 | 左到右 | 雙目運算符 |
| >> | 右移 | 變量>>表達式 | |||
| 6 | > | 大于 | 表達式>表達式 | 左到右 | 雙目運算符 |
| >= | 大于等于 | 表達式>=表達式 | |||
| < | 小于 | 表達式<表達式 | |||
| <= | 小于等于 | 表達式<=表達式 | |||
| 7 | == | 等于 | 表達式==表達式 | 左到右 | 雙目運算符 |
| != | 不等于 | 表達式!= 表達式 | |||
| 8 | & | 按位與 | 表達式&表達式 | 左到右 | 雙目運算符 |
| 9 | ^ | 按位異或 | 表達式^表達式 | 左到右 | 雙目運算符 |
| 10 | | | 按位或 | 表達式|表達式 | 左到右 | 雙目運算符 |
| 11 | && | 邏輯與 | 表達式&&表達式 | 左到右 | 雙目運算符 |
| 12 | || | 邏輯或 | 表達式||表達式 | 左到右 | 雙目運算符 |
| 13 | ?: | 條件運算符 | 表達式1? 表達式2: 表達式3 | 右到左 | 三目運算符 |
| 14 | = | 賦值運算符 | 變量=表達式 | 右到左 | – |
| /= | 除后賦值 | 變量/=表達式 | – | ||
| *= | 乘后賦值 | 變量*=表達式 | – | ||
| %= | 取模后賦值 | 變量%=表達式 | – | ||
| += | 加后賦值 | 變量+=表達式 | – | ||
| -= | 減后賦值 | 變量-=表達式 | – | ||
| <<= | 左移后賦值 | 變量<<=表達式 | – | ||
| >>= | 右移后賦值 | 變量>>=表達式 | – | ||
| &= | 按位與后賦值 | 變量&=表達式 | – | ||
| ^= | 按位異或后賦值 | 變量^=表達式 | – | ||
| |= | 按位或后賦值 | 變量|=表達式 | – | ||
| 15 | , | 逗號運算符 | 表達式,表達式,… | 左到右 | – |
3.7類型轉換
轉換的方法有兩種:
- 自動轉換(隱式轉換):遵循一定的規則,由編譯系統自動完成。
- 強制類型轉換:把表達式的運算結果強制轉換成所需的數據類型。
類型轉換的原則:占用內存字節數少(值域小)的類型,向占用內存字節數多(值域大)的類型轉換,以保證精度不降低。
3.7.1 隱式轉換
#include <stdio.h>int main() {int num = 5;printf("s1=%d\n", num / 2);printf("s2=%lf\n", num / 2.0);return 0; }3.7.2 強制轉換
強制類型轉換指的是使用強制類型轉換運算符,將一個變量或表達式轉化成所需的類型,其基本語法格式如下所示:
#include <stdio.h>int main() {float x = 0;int i = 0;x = 3.6f;i = x; //x為實型, i為整型,直接賦值會有警告i = (int)x; //使用強制類型轉換printf("x=%f, i=%d\n", x, i);return 0; }Part 4 程序流程結構
4.1概述
C語言支持最基本的三種程序運行結構:順序結構、選擇結構、循環結構。
- 順序結構:程序按順序執行,不發生跳轉。
- 選擇結構:依據是否滿足條件,有選擇的執行相應功能。
- 循環結構:依據條件是否滿足,循環多次執行某段代碼。
4.2選擇結構
4.2.1 if 語句
#include <stdio.h>int main() {int a = 1;int b = 2;if (a > b){printf("%d\n", a);}return 0; }4.2.2 if else
#include <stdio.h> int main() {int a = 1;int b = 2;if (a > b){printf("%d\n", a);}else{printf("%d\n", b);}return 0; }4.2.3 三目運算符
#include <stdio.h>int main() {int a = 10;int b = 20;int c;if (a > b){c = a;}else{c = b;}printf("c1 = %d\n", c);a = 1;b = 2;c = ( a > b ? a : b );printf("c2 = %d\n", c);return 0; }4.2.4 switch語句
#include <stdio.h>int main() {char c;c = getchar();switch (c) //參數只能是整型變量{case '1':printf("OK\n");break;//switch遇到break就中斷了case '2':printf("not OK\n");break;default://如果上面的條件都不滿足,那么執行defaultprintf("are u ok?\n");}return 0; }4.3循環結構
4.3.1 while 語句
#include <stdio.h>int main() {int a = 20;while (a > 10){scanf("%d", &a);printf("a = %d\n", a);}return 0; }4.3.2 do while語句
#include <stdio.h>int main() {int a = 1;do{a++;printf("a = %d\n", a);} while (a < 10);return 0; }4.3.3 for 語句
#include <stdio.h>int main() {int i;int sum = 0;for (i = 0; i <= 100; i++){sum += i;}printf("sum = %d\n", sum);return 0; }4.3.4 嵌套結構
循環語句之間可以相互嵌套:
#include <stdio.h>int main(){int num = 0;int i, j, k;for (i = 0; i < 10; i++){for (j = 0; j < 10; j++){for (k = 0; k < 10; k++){printf("hello world\n");num++;}}}printf("num = %d\n", num);return 0;}4.4 跳轉語句 break、continue、goto
4.3.1 break 語句
在switch條件語句和循環語句中都可以使用break語句:
-
當它出現在switch條件語句中時,作用是終止某個case并跳出switch結構。
-
當它出現在循環語句中,作用是跳出當前內循環語句,執行后面的代碼。
-
當它出現在嵌套循環語句中,跳出最近的內循環語句,執行后面的代碼。
#include <stdio.h>int main() {int i = 0;while (1){i++;printf("i = %d\n", i);if (i == 10){break; //跳出while循環}}int flag = 0;int m = 0;int n = 0;for (m = 0; m < 10; m++){for (n = 0; n < 10; n++){if (n == 5){flag = 1;break; //跳出for (n = 0; n < 10; n++)}}if (flag == 1){break; //跳出for (m = 0; m < 10; m++)}}return 0; }4.3.2 continue語句
在循環語句中,如果希望立即終止本次循環,并執行下一次循環,此時就需要使用continue語句。
#include<stdio.h>int main() {int sum = 0; //定義變量sumfor (int i = 1; i <= 100; i++){if (i % 2 == 0) //如果i是一個偶數,執行if語句中的代碼{continue; //結束本次循環}sum += i; //實現sum和i的累加}printf("sum = %d\n", sum);return 0; }4.3.3 goto語句(無條件跳轉,盡量少用)
#include <stdio.h>int main() {goto End; //無條件跳轉到End的標識printf("aaaaaaaaa\n");End:printf("bbbbbbbb\n");return 0; }
參考
https://space.bilibili.com/37974444?spm_id_from=333.788.b_765f7570696e666f.1
總結
以上是生活随笔為你收集整理的《C语言基础学习笔记》—— 黑马程序员 <Part1-4>的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: layout_gravity和gravi
- 下一篇: 如何批量删除Bilibili抽奖动态