001+limou+C语言入门知识——(0)大略了解
C語言的入門學
- C語言初步入門
- 2022/11/29
- 01. 看前需知
- 02. 內容構成
- 03. 學習時間
- 04. 預定計劃
- 05. 網站推薦
- 2022/12/01
- 01. 驅動程序是什么?和其他電腦配件的關系?和C語言的關系?
- 02. 計算機編程語言的發展與C語言
- 03. C語言的標準有什么?
- 04. 常見的編譯器有哪些?如何下載一個編譯器?
- 05. 初步認識頭文件與源文件
- 06. 在VS2022中運行程序以及可能出現的問題
- 07. 主函數mian()的介紹
- 08. 標準頭文件
- 09. 數據類型
- 10. sizeof()的使用
- 11. 計算數據大小的單位
- 12. 變量和常量的簡單介紹
- 13. scanf()的使用
- 14. printf()的使用
- 2022/12/03
- 01、修改VS外觀和字體
- 02、變量的作用域和生命
- 03、C語言的四種常量
- 04、字符、字符串和轉義字符
- 05、注釋的使用
- 2022/12/05
- 01、細談scanf()的返回值
- 02、浮點數的四舍五入
- 03、printf的返回值
- 04、配置文件
- 05、函數的概念
- 06、(一維)數組的概念(英文array)
- 07、操作符(運算符)
- 08、代碼風格
- 09、strlen的用法注意
- 10、學習C語言的網站
- 11、注意C語言的代碼和數學寫法的區別
- 12、VS的基礎調試
- 13、“真”與“假”的表達方式
- 2022/12/07
- 01、三目操作符的使用(C語言里只有一個操作符)
- 02、逗號表達式
- 03、一些常見的關鍵字(常用的)
- 04、“計算機存儲的方式”和“register的作用”
- 05、使用“typedef”重命名
- 06、從C語言視角的內存分類和static的作用
- 07、extern的作用
- 08、“#define定義常量”和“宏的使用”
- 09、指針
- 10、結構體
- 11、運算符的優先級和結合性
- 12、關鍵字auto(用的比較少)
- 13、移動VS功能模塊的小技巧
- 14、編譯器的自動修正的
- 15、打開win計算器的方法
- 2022/12/28 修改日志:
- 修改日期:2022/12/29
- 修改日期:2022/12/30
C語言初步入門
2022/11/29
01. 看前需知
-
本筆記將記錄本人第一次C語言的學習路徑。由于本人就在學習路上經常遇到一些“謎語”,深受苦害,所以本筆記內容偏向大白話。有不嚴謹的地方,還需辯證看待。如有缺漏,懇請指正。
-
另外簡單介紹本人在學習C語言的過程:先是參考了“bilibili大學”上的視頻,然后一直在閱讀《C Primer Plis(第六版)》《C和指針》《C陷阱與缺陷》(電子書其實挺好找的,不想找的可以直接“踢”我,我發給你……),在其間穿插??途W等網站上的題目(練題挺重要的),順便寫一些沒事找事的“整活”代碼。
-
本筆記只是為了在正式學習C語言之前,初步了解C語言的大致框架,僅僅只是點到為止,不會過于深入。
-
本人的電腦操作系統是windows11,如需要下載編譯器,還請看前檢查好自己的要下載的編譯器是否合適當前的系統。(后面會有檢查系統版本的方法)
-
目標是:大致了解C語言的基礎部分,形成一個大概的學習網絡圖
02. 內容構成
注意:本筆記會比較冗長,一是內容較多,盡可能涵蓋C語言的重點基礎內容,二是盡量讓沒怎么系統接觸過C語言的小白也能夠看懂,會顯得口語化一些。
注意:因為最近也在看《C Primer Plis(第六版)》這本書,因此在筆記里多少也會結合這本書里的比較重要的概念來書寫。
03. 學習時間
本人花時間學習C語言的時間比較零碎,光是C的基礎關鍵知識就大概學了4個月(聽說學C不用學那么久的?),當然學完不等于學會,現在很有學有遺漏的感覺,故寫本筆記來檢查自我,并且和大家一起分享學習成果。
04. 預定計劃
在2022年結束前寫完本筆記,2023年一月份前再進行一定程度的修正。
05. 網站推薦
2022/12/01
01. 驅動程序是什么?和其他電腦配件的關系?和C語言的關系?
(1)是指驅動計算機里軟件的程序。驅動程序全稱“設備驅動程序”,是添加到操作系統中的特殊程序,包含的有關硬件設備的。這個信息能使計算機與相應的設備進行通信;
(2)驅動程序是硬件廠商根據操作系統編寫的配置文件,沒有驅動程序,硬件就沒有辦法正常工作;
(3)電腦運行過程:(使用)應用軟件->(利用)操作系統->(通過)驅動程序->(運行)硬件;
(4)操作系統的左邊叫上層軟件(C也可以運用在這里),操作系統及其右邊的叫做底層軟件(C語言更加擅長底層)。
02. 計算機編程語言的發展與C語言
| 一開始直接輸入二進制(還需要查手冊才能寫出來)-> |
| 匯編語言(使用“助記符”,更好記憶語法,符合人類閱讀習慣)-> |
| B語言(但自從被C語言取代之后,B語言幾乎被廢棄)-> |
| C語言(面向過程式的計算機程序設計語言)-> |
| …后續又產生了很多優秀的語言,不過這是后話了 |
其中C語言逐漸完善,但是各家都是不同的標準,于是產生了C的標準。
這里推薦書籍《浪潮之巔》(作者吳軍)該書主要簡述了各類IT產業發展歷史,是本好書,比較厚。
03. C語言的標準有什么?
目前出的C標準有很多:C89、C90、C99、C11、C17 ……還有更加新的標準,這就說明C還是流行的(因為它仍然在不斷地更新),但可惜對比來說C99之前的標準更加流行,新加入的特性有的仍然未被大流所接受,因此并不是學越新的標準就越好,了解好C99之前的標準其實就很夠用了。
04. 常見的編譯器有哪些?如何下載一個編譯器?
- 在學習C語言之前,我們需要一個能寫代碼的環境,就像是用電腦寫文章、小說一樣,你必須有一個類似WPS一樣的軟件編寫word文檔吧?寫代碼也是一樣的,需要有個編譯器來寫代碼和運行代碼。
- 但是對于新手來說,選擇一個用來寫代碼的編譯器并不容易,操作稍有不慎,就會出現各種奇怪的提示窗口。所以對于初學者來說,還是十分推薦使用IDE類型的軟件(即集成開發環境)。
- VS就是這種類型的編程軟件,簡單來說,編譯器被包含在IDE里面,有IDE類型的軟件你就可以開始寫代碼啦,但是以后的學習中也可以自己嘗試不依賴IDE類型的軟件,開始使用別的編譯器試試看,不過那是后話了。
(1)常見的有MSVC、GCC、VS、Clang、SUBLIME、WIN-TC、Turbo C;
(2)C語言是給人看懂的,計算機只能讀懂二進制,編譯器把我們寫的代碼轉化為二進制讓電腦能夠理解。
注意:其實VS2022應該叫集成開發環境(縮寫為IDE),是編輯器、編譯器(例如msvc)、調試器的集合開發。
注意:VC是個編輯器,要裝插件不能獨自編譯;VS是集成環境(內部有編輯器、編譯器、鏈接器),即裝即用,對新手更加友好。
1、VS2019(或者VS2022)的初步了解
(1)VS的優點:VS全名是Visual Studio,它其實不是存粹的編譯器,而是集成開發環境(IDE,Integrated Development Environment )一下載就可以上手,對新手友好,不需要配置太多環境,有比較美化的代碼風格。(支持大概95%左右的C標準吧,以下為VS的代碼片段截圖);
(2)VS的缺點:內存占用大(新手使用其實大概需要10幾G(因為如果只是為了學習C語言的話,是不需要下載VS所有的功能的),并且最好是放在C盤(預防未來出現不知名的錯誤),記得給自己的盤符預留好足夠大的內存空間,此外還需要有良好的電腦使用習慣,不過這個事情就跑題了)。
2、為什么不選擇其他編譯器呢?
(1)VC6.0,是98年的編譯器,已經停止更新了,老舊并且兼容性差;
(2)Dev C++,10多年前(現在2022年)就停止更新了,代碼風格不美觀,不利于代碼風格培養;
(3)CodeBlocks,有些學校在用,都是不夠主流比較小眾,需要配置環境,但用著還算不錯;
(4)VSCode需要配置環境(本質上是個編輯器);
(5)你是大佬就用GCC、clang學習C語言。都是這些對初學計算機小白來說挺不友好的……
注意:其實編譯器只要用的足夠熟悉就可以,剛開始學習C語言的時候倒也沒必要多糾結,只是最好不要太過老舊……
3、VS的安裝過程詳解(保姆級別教學)
(1)檢查自己的電腦是否合適安裝VS2022
①通過快捷鍵“win(即那個有點像田字格的微軟圖標)+R”,輸入cmd來打開控制臺。(也可以在電腦搜索“命令提示符”或者“cmd”來找到)
于是電腦屏幕出現類似這樣的界面
輸入systeminfo,稍后會以文字形式展示系統信息
或者在控制臺中輸入winver,這個時候就會彈出一個窗口
②進入官方對于VS2022的系統要求網站,然后進行對比
③如果想下載其他版本的VS其實也可以,功能其實也差不多。不過這里也不再詳細介紹其他版本的下載了。
(2)首先用瀏覽器(我一直用的是微軟自帶的Microsoft Edge,其他也都可以)進入安裝鏈接: VS官網,打開網址如下。
(3)點擊上方“下載”按鈕(不過點這里只能下載VS2022的),然后下載“社區版”(因為是免費的),需要其他版本的VS就需要在官網找其他版本。下載好安裝包后,打開安裝包,點擊安裝包即可開始下載
(5)進入VS下載界面
(6)開始下載
(7)界面設置(選擇得當可以減少VS在電腦中的內存占比)
①“工作負荷”的“桌面應用與移動運用”中選擇“使用C++的桌面開發”
②其中“路徑”改D盤當然可以,但是最好放在C盤,避免使用不穩定
③左邊的“安裝詳細信息”也不需要改,建議直接默認就行
④看清楚安裝“要求的總空間”有多少,看自己的盤符空間夠不夠用
(8)開始下載,并且勾選“安裝后啟動”選項
(9)等待下載成功并且重啟電腦,就可以看到會出現這樣的圖標(沒出現也可以在電腦中直接搜索Visual Studio2022)
(10)社區版登錄后VS就是完全免費的(不登陸免費30天)
創建一個賬戶就可以。
(11)“開發設置”和“選擇主題顏色“
①開發設置:改成“Visual C++”即可
②顏色主題:看個人的喜好就行(個人推薦深色,不傷眼…)
(12)點擊“啟動Visual Studio(S)”按鈕
(13)等待初次啟動完畢后,開始寫第一個C語言文件
- ①點擊“創建新項目”
- ②搜索“空項目”,并點擊“空項目”,然后點擊“下一步”
- ③更改“項目的名稱”(盡量英文)和“路徑”(要保證自己找得到就行,比如創建一個文件夾,以后一直都放在這個文件夾里,這一次演示的話可以暫時放在“桌面”上)
- ④進入VS的界面
- ⑤右擊右側“解決方案資源管理器”中的“源文件”,點擊“添加”,選擇“新建項”,添加一個源文件(即后綴為.c的文件)。另外,由于我的VS裝了一些小插件,所以才有“清理已選代碼”這一選項,剛下載的VS是沒有這個選項的,這些拓展插件以后在別的文章里面也會簡單介紹幾個。
- ⑥選擇“C++文件”修改頭文件后綴.cpp為.c(這是因為“.cpp”文件是用于C++的“.c”文件是用于C語言的)。并且修改該頭文件的名字,例如我就用了main作為源文件的名字(想叫其他名字的也可以的,但同樣最好是英文名字)
- ⑦工作區出現行號和光標,可以開始編寫第一段代碼啦!
以下是上述代碼片段,可以復制下來運行試試(先別著急理解)
- ⑧運行程序
Ⅰ點擊F5或者fn+F5或者fn+shift+F5等(不同電腦可能快捷鍵不一樣)運行程序
Ⅱ也可以點擊VS界面最上方的“綠色播放鍵”按鈕,就可以運行程序
- ⑨運行結果顯示
(如果出現一閃而過的問題,可以往后看“06. 在VS2022中運行程序以及可能出現的問題”,有解決方案)
- ⑩程序運行完后,按任意鍵可以關閉程序(即現在跳出來的窗口),當然除了一些比較特殊的按鍵,比如“關機鍵”什么的 ……按個空格什么的就行了啦!
注意:如果一直不能下載:
1、請檢查當前的網絡環境是否穩定
2、修改電腦Wi-Fi里的DNS服務地址8.8.8.8或者8.8.8.4
3、虛心學習,請教身邊的大佬們吧!
05. 初步認識頭文件與源文件
首先從文件的后綴就可以看出來兩個文件的區別:“XXX.h”叫做“頭文件”,“XXX.c”叫做“源文件”,之前在VS2022里面創建的main.c就是一個源文件,現在暫時可以不知道這兩者的區別,一般寫一些基礎的代碼在.c文件中就足夠了。
06. 在VS2022中運行程序以及可能出現的問題
(1)在VS中編譯+鏈接+運行(可使用快捷鍵F5/fn+F5/ctrl+fn+F5,不同的電腦可能不太一樣)來運行代碼;
(2)若出現運行窗口一閃而過的問題,則可以:鼠標右擊“項目”->“鏈接器”->“子系統”->修改為“控制臺”即可。
07. 主函數mian()的介紹
#include<stdio.h> int main() {printf("hello word");return 0; }(1)在運行第一個C程序的時候,會發現程序里有int main()
main函數是整個程序的入口,必須有且只有一個。無論是哪個C程序,第一步總是從這里開始。
注意:這個main和之前創建的.c源文件的名字“main”不一樣,這里指的main是一個函數,上文那個“main”只是我給文件起的一個名字而已……
(2)有關mian函數的寫法:
//第一種:常見的寫法(比較多) int main() {return 0; } //第二種:過于古老了,建議別用 void main() {return 0; } //第三種:也可以(很少寫) int main(int argc,char* argv[]) {return 0; } //第四種:也可以 int main(void) {return 0; }08. 標準頭文件
#include<stdio.h> int main() {printf("hello word");return 0; }在運行第一個C程序的時候會發現,開頭有一個#include<stdio.h>。即標準頭文件。標準頭文件其實就是包含了C標準中定義的可以直接用的庫函數,引用這個標準庫,才可以使用printf函數。
就可以形象比喻成:我們要用別人的東西(想用標準頭文件stdio.h里面放的函數printf函數),需要我們和別人打個招呼(寫#include<stdio.h>),才可以使用別人的東西(使用printf函數)
注意:其中#include<stdio.h>中
①include其實是“包含”的意思
②stdio就是“標準輸入輸出(standard input/output)”的縮寫
09. 數據類型
(1)為什么會有數據類型?
| 為什么寫代碼-> |
| 解決生活的問題-> |
| 需要信息轉化為數據,利用數據描述信息-> |
| 有了數據類型的產生-> |
| 因此有能力針對數據來解決現實問題 |
(2)對生活中不同的數據進行分類:
| char | 字符類型 |
| short | 短整形 |
| int | 整形 |
| long | 長整型 |
| long long | 更長的整型 |
| float | 單精度浮點型 |
| double | 雙精度浮點數 |
| (3)之所以叫浮點數,是因為可以給小數*10^n對小數點進行移動。 |
注意:C語言標準規定long只需要保證>=(大于等于)int既可以,但是long long一定大于int;
注意:使用不同的類型的好處:空間可以節省很多,效率也能提高,但是相應的錯誤也會變多……
(4)運用“數據類型”來“存儲數據”
在上述代碼中:整形10被存儲在一個叫做a的空間里,字符C被存儲在叫做b的空間里,小數3.14被存儲在叫做c的空間里。
10. sizeof()的使用
sizeof()函數以字節為單位,是計算類型大小的運算符(操作符)。
#include<stdio.h> int main() {printf("%d",sizeof(int));return 0; } //一般打印出來4,少部分平臺為211. 計算數據大小的單位
| Byte字節 | 1B=8bit |
| Kilobyte 千字節 | 1KB =1024B |
| Mega byte 兆字節 簡稱“兆” | 1MB =1024KB |
| Giga byte 吉字節 又稱“千兆” | 1GB=1024MB |
| Tera byte 萬億字節 太字節 | 1TB =1024GB |
| Peta byte 千萬億字節 拍字節 | 1PB=1024TB |
| Exa byte 百億億字節 艾字節 | 1EB=1024PB |
| Zetta byte 十萬億億字節 澤字節 | 1ZB = 1024 EB |
| Yotta byte 一億億億字節 堯字節 | 1YB= 1024 ZB |
| Bronto byte 一千億億億字節 | 1BB= 1024 YB |
| Nona byte | 1NB= 1024BB |
| Dogga byte | 1DB= 1024NB |
注意:其中比較常用的是bit、B、KB、MB、GB、TB。后來也出現了一些簡化表達,例如K有時候代表1024,M代表1024K。
12. 變量和常量的簡單介紹
(1)變量的概念
①定義變量:“(類型)+(變量名/標識符)=(數據)"
在后面令num=20,可以使得num的值從10變化為20,所以num就是變量
②“局部變量”和“全局變量”的區分:在{}外面的是全局變量,{}內的叫局部變量,若是存在一個變量既有全局定義和局部定義,則形成沖突,優先使用局部變量
③對于定義變量的解讀
“int num=20;”中的num就是標識符,整體代碼大概意思是:在電腦的空間之中,申請4個字節存放20這個數據。
注意:char ch=‘b’,只能放一個字節,而漢字有兩個字節不能存放在char類型中,但是可以理解為字符串來存放
#include<stdio.h> int num=100; int main() {int num=10;printf("%s",num);return 0; }//則優先輸出10,而非100(2)常量的概念:值不可以改變的量。
13. scanf()的使用
scanf()是輸入函數,按照指定格式取出后面變量的地址來進行輸入。
注意,小數默認為double類型,所以可以在小數后面加上f或者F表明是一個float的小數;
注意,使用未初始的類型容易出錯,有的老編譯器是不會判斷錯誤的,所以使用初始化是一種好的編程習慣;
注意,變量名字必須由字母、數字、下劃線“_”組成,并且長度不能超過63個字符,嚴格區分大小寫,不能是已使用的關鍵字,并且最好命名是有意義的
14. printf()的使用
printf()是輸c出函數,按照指定格式輸出后面變量的值。
2022/12/03
01、修改VS外觀和字體
首先,打開VS工具->選項->環境
(1)在“常規->顏色主題”里改變外觀
(2)在“字體和顏色->字體”中改變字體等
02、變量的作用域和生命
(1)作用域:變量的作用范圍
①局部變量作用域是變量所在的局部范圍(其實就是一對{}以內);
②全局變量在一個工程(利用extern可以聲明全局變量為外部變量,在項目里面的不同源文件里都可以使用),但是不夠安全,容易改變值,引起bug。
(2)生命周期:就是生成變量和銷毀變量的一個時間段。
①在運行中,局部變量被使用了,使用完就會被銷毀,也就是說局部變量的生命周期:進入作用域生命周期開始,離開作用域生命周期結束;
②在運行中,全局變量的“生命周期”和“整個main()開始直到運行結束”或者“整個程序的開始到運行”是一樣的,也就是說全局變量的生命周期是整個程序。
03、C語言的四種常量
(1)常見的四種常量
(2)嘗試使用四種常量
#include<stdio.h> #define MAX 100 //#define定義的標識符常量,后面使用MAX結束后,編譯過程MAX全部被替換成100,末尾不加“;”是因為容易出bug。//以下創建了一個枚舉常量,只能枚舉出離散變量,但是連續變量就不能被枚舉出來 enum Sex {MALE, //默認值為0FEMALE, //默認值為1SECRET //默認值為2 };//若是將MALE賦值為5,則后面就依次改為6、7,這叫初始化,不是改變值,所以說是常量非變量int main() {100; //這里只是寫出字面常量,顧名思義“從字面上就可以看出來”'W';3.14;int a=1; //在這里1就是常量int num_1=10; //const 修飾的常變量num_1=20; //num_1是變量,值從10變成20const int num_2=10;num_2=20; //使用了const關鍵字后,這里就會報錯! /*如果加上前綴const,就使得變量具有了常屬性,就不能被改變了,但是本質上還是個變量,只是從語法的層面給num_2“上鎖”了而已*//*證明,利用數組[]內不可以放變量的特點(除去新加的變長數組的情況)*/int arr_1[num_2]={0}; //在C99之前,有的編譯器依舊是不能運行的,這就證明了被修飾的num_2本質上還是一個變量int arr_2[MAX]={0}; //可以運行,這也同樣證明了符號MAX是常量enum Sex s=FEMALE;printf("%d",s); //輸出1return 0; }04、字符、字符串和轉義字符
(1)C語言表示字符由‘ ’引起,例如:‘w’;
(2)字符串由“ ”引起,例如:“abc”,“abc”會自動在末尾加上\0,\0表示“結束標志”;
注意:“a”和‘a’是有區別的,區別在于前者有\0結尾,后者則沒有!
#include<stdio.h> int main() {char*="abcd"; //char*和char arr[]可以存放一個字符串,存放字符串的演示char arr_0[]="abcd";char arr_1[]={'a','b','c'}; //則打印可能會打印出abc和其他亂碼,原因是后面沒有\0可以結束printf("%s\n",arr); //這里%s打印出字符串,但是沒有\0提示結束char arr_2[]={'a','b','c','\0'} //這樣就沒問題了printf("%d",strlen(arr_0)); //也是靠\0來計算字符串的長度的,輸出了4,即字符串的長度printf("%d",strlen(arr_1)); //則輸出來是非3的值,是個隨機值,什么時候找到\0就輸出長度return 0; }(3)轉義字符
①常見的有:
| \? | 問號 |
| \ ’ | 單引號 |
| \ " | 雙引號 |
| \ \ | 斜杠 |
| \n | 換行 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \b | 退格符,相當于backspace |
| \f | 換頁 |
| \r | 回車 |
| \ddd | ddd表示八進制 |
| \xdd | dd表示十六進制 |
②早期的編譯器有三字母詞概念,例如“??)代表]”,?是用在來轉義的(類似想打印",不能直接寫",而是要寫\")現在的話\?比較少用了。
#include<stdio.h> int main() {printf("(are you ok??)");//由于三字母詞的存在,打印出(are you ok]//因此利用\?就可以正常打印printf("(are you ok\?\?)");//正常打印(are you ok??)printf("""); //打印失敗printf("\""); //就可以打印出單個"return 0; }③利用轉義字符 \ 來使用ASCII碼值表
#include<stdio.h> int main() {printf("%c\n",'\130'); //輸出X,其中\130是八進制數字,用''引轉義字符,說明本質上還是個字符,需要用''引用printf("%c\n",'\x63'); //輸出c,其中\x63是十六進制的數字return 0 } //轉義字符也算字符是會被整體計算成一個字符,因此用strlen要格外注意,轉義字符會整體計算進去05、注釋的使用
(1)注釋有兩種:
//注釋1,實際上是C++的注釋風格,后面被加到C中了,推薦使用這種 /*注釋2,C語言的注釋風格*/(2)注釋的作用:
①可以給別人看懂自己的代碼,或者給未來的自己看懂自己的代碼
②可以屏蔽掉不想用但是舍不得刪除的代碼,保留代碼的同時不影響其他程序
因此注釋是一個很好的習慣!
(3)另外,在VS中有關注釋的快捷鍵為:ctrl+K/ctrl+C添加注釋,ctrl+K/ctrl+U取消注釋,可能不同編譯器不一樣)。也可以按住工具欄里的按鈕實現快速注釋(一般這里是有快捷鍵提示的,建議好好熟練快捷鍵)
2022/12/05
01、細談scanf()的返回值
(1)scanf的返回值有三種情況
①正常返回的話就是讀取到數據的個數;
②如果scanf沒有讀取到任何項(比如scanf需要讀取一個數字而用戶卻輸入了字母)就會返回0;
③scanf檢測到“文件結尾”時就會返回EOF,而通常EOF的值是-1。
注意:使用scanf輸入的時候,需要按下回車鍵(enter)來提示電腦你已經輸入數據,不要傻傻等著光標跳動,計算機是不會自動把值輸入的!
(2)在VS2022中使用scanf常常會報警告,“scanf的返回值被忽略”,其實是在提示我們要注意用上scanf的返回值,但是其實目前是可以忽略這個警告的,編譯器只是警告你:要注意scanf的返回值,不要輕易忽略。
(3)利用返回值(EOF或者某個數值)來多次輸入(多組輸入),可以利用scanf的返回值來實現多次的輸入
(4)另外,VS的報錯窗口就是“錯誤列表”,可以通過“視圖”里面找到“錯誤列表”就可彈出。
注意:要經??催@個錯誤列表,能夠檢查出一些代碼的錯誤。當然有的時候編譯器自己也看不出來一些錯誤,比如,將開頭main寫成mian,在VS2022中,編譯器也檢查不出來這樣的錯誤(只會編譯失敗)。
02、浮點數的四舍五入
浮點數的四舍五入是很復雜的事情,因為浮點數是不精確的值。所以在以后的條件判斷中,盡量少用浮點數進行判斷(容易發生誤判)。
03、printf的返回值
首先看一段比較有趣的代碼:
#include<stdio.h> int main() {int A=43;printf("%d\n",printf("%d",printf("%d",A))); }//結果會輸出什么呢? //答案是4321printf的返回值就是輸出的字符數量
①第三個printf輸出"43"字符數量為2,于是返回值為2,第二個printf就輸出"2”
②第二個printf輸出"2"字符數量為1,于是返回值為1,第一個printf就輸出"1"
要注意一點是:返回值是是輸出的字符數量,包括數字,字母,標點符號,空格,轉義字符等。
04、配置文件
VS保存好寫好的代碼后,就會多出一些配置文件,可以暫時忽略其他文件,只需關注.sln和.c和.obj和.exe就可以。(其中sln文件可以打開所有上次編輯的完整的VS文件;c文件是你自己創建的源文件;obj文件時目標文件,了解即可;exe是可執行文件,了解即可。),以下是我創建的一個項目文件。
05、函數的概念
- 結構:一個函數應該由函數返回值、函數名、函數參數(參數列表)、函數體構成
- 分類:可以分為庫函數(已經寫好內部代碼的函數,比如使用printf())和自定義函數(比如自己寫一個自定義的函數Add())
- 之所以會有函數的概念,其中幾個目的是為減少代碼量、更加清晰地識別代碼,一個設計好的函數,我們要做某些事情的時候,只需用這個函數就行,而不必每次都去寫這個函數里面的內容。
就好像,你要吃薯片,雖然可以自己做薯片,但是你可以直接買商店的包裝薯片,而不必每次都自己去做。而函數就可以類比那些幫你包裝好薯片的加工廠。
- 自定義函數的結構
①無需返回的函數(無返回值的函數)
void f1(int x)//f1是由自己命名的 {printf("%d %d %d",x,x,x); }//這個函數的效果就是:輸入一個整數,就會自動打印三次這個整數②需要返回的函數(有返回值的函數)
int Add(int x,int y)//2、x,y將a,b的值拷貝過來 {return x+y; }//3、開始進行加法運算,并且函數返回這個加法后的值,return可以理解為等號“==”(C語言的等號是==,賦值符號是=)int main()//0、首先從這里開始按照數字的順序看起 {int a=0,b=0,c=0;scanf("%d%d",&a,&b);c=Add(a,b);//1、a,b的值被函數調用,返回值賦值給了cprintf("%d",c);//4、打印結果c就可return 0; }06、(一維)數組的概念(英文array)
(1)概念:同時存放一組相同類型的變量。數組的存在可以不用一個一個的區定義多個變量。
(2)格式:元素類型+數組名+[元素個數]={元素};
注意:數組是沒有\0來結尾的,只有字符串才有!!!
(3)如果需要取出數組里單個的元素:利用數組的下標,從0開始,可以用下標訪問一個元素
int main() {int i=0int arr[3]={5,4,3};printf("%d",arr[1]);//輸出4//因此可以利用循環來輸出arr的所有元素while(i<3){printf("%d\n",arr[i]);}return 0; }//依次輸出 //5 //4 //3(4)事實上還有多維數組的概念,只不過本筆記暫時只介紹一維數組,后續還會寫二階數組等深入的內容。
07、操作符(運算符)
-
(1)C語言很靈活,操作符也有很多(難點之一:操作運算符的使用)。
-
算術操作符:+、-、*、/、%
-
移位操作符:>>、<<
-
按位操作符:&、^、|(按位與、按位異或、按位或)
-
賦值操作符:=、+=、-=、*=、/=、&=、^=、|=、>>=、<<
-
單目操作符:!、-(符號)、+(符號)、&、sizeof、~、–、++
-
關系操作符:==、>=、<=、!=
-
邏輯操作符:&&、||
-
條件操作符:exp1?exp2:exp3
-
逗號操作符:exp1,exp2,exp3,……
-
下標引用、函數調用和結構成員:[ ]、( )、.、->
注意1:%是取余數,例如1%3=3,4%3=1,5%2=1(實際上%是個比較麻煩的操作符,如果兩側都是正數,那還好理解,但是如果是負數呢?后續會進行講解的……)
注意2:如果輸出符號為%d,a/b得到的是整數,a%b得到的是余數。
注意3:/的左右只要有一個數是浮點數,就會執行浮點數運算(還有輸出格式要寫成%f)
另外,如果兩端都是整數,那么運行結果也只會是整數,哪怕用%f輸出也是一樣的 注意:用/要得到完整的小數直接用用%f就行。
注意4:另外%左右應該都是整數,并且%運算后是不可以用%f輸出的 注意:初始化(int a=0)和賦值(a=20)是兩個概念
注意5:非零值為真,包括負數。
注意6:直接寫18<=a<=30語法沒問題,都是寫法是錯誤的應該寫成a>=18&&a<=30,不然是報錯的
注意7:sizeof應該是屬于運算符,而不是函數哦!
注意8:實際上()經常被人忽略,它又叫函數調用操作符。最大的用處就是標識一個函數
注意9:[ ]主要的作用就是利用數組的下標來訪問數組的各個元素,Add(a,b)中,( )的操作對象是Add、a、b
注意10:.和->是屬于結構體知識的
注意11:位操作符涉及到二進制和三碼(原反補)的概念,后續會講解
注意12:注意:后置++(–)和前置++(–)的區別
注意13:邏輯操作符&&和||的短路的性質
(2)單目操作符、雙目操作符、三目操作符的區別:有多少個操作數就是幾目操作符,如1+2,+操作1和2兩個操作數。
08、代碼風格
(1)代碼高亮:關鍵字、函數等會有顏色區分
(2)tab的使用,好的編譯器軟件會自動幫你tab,會自動把代碼排版好。
09、strlen的用法注意
char arr[4]={'b','i','t'}; strlen(arr);//由于放入了3個元素,第4個初始化默認為0,即'\0',故strlen(arr)是3,而不是隨機值10、學習C語言的網站
cplusplus.com但是是全英文的……可以自己嘗試翻譯一下,個人比較喜歡使用舊版本的網站,比較習慣。
11、注意C語言的代碼和數學寫法的區別
(1)等號
數學里的等于是“=”,在C語言的等于是“==”,而“=”只是一個賦值運算符
(2)大于(小于)等于號
數學里“1≤x≤2”,但在C語言里面必須要寫成“(x>=1)&&(x<=2)”
(3)乘法
數學里面“3x”表示“3x”,但是在C語言里面就必須寫成“3x”,不能省略乘號,只是寫成“3x”,這樣寫編譯器是會報錯的
12、VS的基礎調試
- 有關的調試用法:
①利用printf()函數進行調試
②VS自帶的調試功能 - 如果能夠試著調試自己的代碼,就能減少代碼中的bug
13、“真”與“假”的表達方式
在C語言中,數值非0的為真(包括負數),0則為假。
2022/12/07
01、三目操作符的使用(C語言里只有一個操作符)
(1)三目操作符的書寫形式
(exp1?exp2:exp3)(2)使用解說:
若是exp1為真,整個表達式的結果為exp2;
若是exp1為假,整個表達式的結果為exp3。
注意:條件操作符不要寫的過于復雜,這涉及到操作符的優先級和結合性的問題
02、逗號表達式
(1)逗號表達式的書寫形式
(exp_1,exp_2,exp_3,exp_4,exp_5,exp_6…,exp_n)(2)使用解說:
從左往右算,則最后一個表達式exp_n的值為整個式子的值。
03、一些常見的關鍵字(常用的)
(1)關鍵字,相當于是英語中的詞匯
auto、break、case 、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long、register、return、short、signed、sizeof、static struct、switch、typedf、union、unsigned、void、volatile、while
(2)這些關鍵字可以先稍微拓展學習一下,下面會嘗試講幾個關鍵字的用法。
(3)在以后的學習中需要熟記這些關鍵字(實際上敲多了就記住了,本人英語挺不好的,也是靠不斷的敲擊記憶的……)
(4)不能拿關鍵字創建變量的名字,否則會命名沖突
04、“計算機存儲的方式”和“register的作用”
(1)早期都是CPU處理,都是隨著發展CPU處理速度過快了,于是有了更快的存儲設備,比如寄存器,計算機的存儲設備:網盤->硬盤->內存->高速緩存->寄存器
(2)不同的存儲器:造價逐漸變貴,內存逐漸變小(節省電腦造價),速度逐漸變快。存儲器這樣類似金字塔的結構設計,使得電腦性價大大提高
于是關鍵字register int num=10會讓編譯器檢查這個變量是否頻繁使用,若是就把這個變量放入寄存器中,于是程序運行就會比較快(實際上在一些編譯器中就算沒有寫這個關鍵字,也會自動檢查哪個變量是最常用的,然后將這個變量放到寄存器中,所以有的時候選好編譯器確實是比較講究的問題)
(3)這涉及到“局部性原理”的知識后期有興趣的可以后期看《深入理解計算機系統》初學者的話暫且別看。
05、使用“typedef”重命名
(1)使用方法
unsigned int num_1 =100; typedef unsigned int num uint; unit num_2=10;(2)假設你的名字全稱是“歐陽李四”,你村里的人卻叫你小名“狗蛋”。這就相當于起了“別名”,故typedef的作用就像是給一些類型起了個“別名”。(你的鄰居叫“狗蛋”是為了方便,而typedef的使用也是為了方便)
06、從C語言視角的內存分類和static的作用
(1)從C語言的角度來說,內存的分布可以暫時簡化為
棧區:局部變量、形式參數
堆區:動態內存分配(像maiioc、calloc、realloc free等動態內存分配函數就是在這個地方被使用)
靜態區:靜態變量、全局變量(靜態區里的東西,整個程序結束才會銷毀)
(2)static(靜態)的作用
①修飾局部變量
①加了static就相當于:你在做數學試卷,被老師叫去談話,當你回來的時候,繼續往下做題,沒有必要重新從第一題開始
②不加static就相當于:你在做數學試卷,被老師叫去談話,當你回來的時候,又從頭開始做題了。
注意:一個局部變量本來放在棧區,加了static修飾的局部變量,就會放在靜態區了,存儲位置發生變化,導致局部變量出了作用域不會被銷毀,改變了變量的使用周期(即存儲位置發生了變化)
注意:被static修飾后,這個a后面就不會重新創建為a=1了(但是a的值是可以再被改變的,只是每次都不會被重新創建a,靜態和常量不是一個概念!!!)。
注意:靜態變量和全局變量還是有很大區別的!靜態變量只會在被修飾的局部變量里面值不變,而全局變量整個程序都是適用的。
②修飾全局變量
使得全局變量只能在本源文件里面使用,同時能讓其他源文件里,另外一個被extern修飾的全局變量跨文件作用失效。(讓全局變量的外部鏈接屬性消失了)。其實這樣的話就有對這個變量進行隱藏的功能(不會被別人看到,有保密效果)
③修飾函數
//在main_1.c中 int Add(int x,int y) {return (x+y); }//在main_2.c中 extern int Add(int x,int y);//沒有extern的時候,有的編譯器是不會去調用別的頭文件里面定義的函數的 int main() {int a=10,b=20,sum;sum=Add(a,b);printf("%d\n",sum);return 0; }實際上在C++里面static還有兩種用法,所以實際上是有五種用法
07、extern的作用
(1)可以跨.c文件使用一個被extern修飾的變量extern int num=1;
另外函數也可以類似使用:以下是兩個源文件里的內容
(2)與static的使用同時出現時,會讓extern的作用會消失
08、“#define定義常量”和“宏的使用”
(1)#define的使用
#define M 100 #define STR "hello bit" int main() {printf("%d\n",M);printf("%s\n",STR); }//就會分別輸出100和hello bit(2)宏的使用
#define MAX(x,y) (x>y?x:y)//包括宏參(宏參是沒有類型的),宏內容。 //宏與函數是有去區別的 int main() {int a=10,b=20;int m=MAX(a,b);printf("%d\n",m);return 0; }09、指針
注意:C語言基礎的重點部分,甚至有的人會出現“暈針”的現象,這一部分在之后的學習中請務必認真!!!
(1)學指針之前首先要理解一點內存的基本概念概念:內存是電腦上特別重要的存儲器,看可以cun,計算機中程序的運行都是在內存中運行的,內存可以被分割成一個個“小內存”,這個“小內存”可以用一個小格子表示,每個格子有一個對應的編號,就可以依靠編號來快速找到這個格子(也就是單個的內存空間)。而這個編號就是內存的地址,這個“小內存”就叫內存單元,內存單元一般可以存放一個字節的數據(剛好放一個char類型的數據)
(2)地址的產生:32位電腦,32根地址線(相當于電線),電線是通電的,有高電平,低電平,轉化為數字信號就是1或者0,32個二進制位就可以產生232個位置,能夠產生232個地址(管理2^32字節的空間,其實也就4G大小的空間)
注意:64位也可以類似理解
(3)此時就可以深刻理解int a=10的含義:向內存申請4個字節的空間,存儲10這個值(具體怎么存放后期講)
????????|???????? ????????|???????? (而每個字節都有地址)
a實際上是占用4個字節的空間,但是每個字節都有地址,&a取得其實是第一個字節的地址(也就是最小的地址)
(4)int pa =&a中,取出來a的地址存放到pa,pa就是一個存放指針的變量它的類型是int,我們把pa叫做一個指針變量。
注意:*在表明pa是指針變量,int是在說明pa指向的對象是int類型。 注意:指針即“地址”,通過地址可以找到變量的值,甚至改變變量的值
注意:定義指針時,*跟在類型還是跟在變量上都可以 注意:%p是用來專門打印地址的
(5)當然指針變量本身也是一個變量
(6)那么指針變量本身的大小是多少個字節呢? 指針變量是存放地址的,地址是:
①32位機器上:32個0/1組成的2進制序列,需要32位bit位的空間存儲,指針變量就需要4個字節
②64位機器上:64個0/1組成的2進制序列,需要64位bit位的空間存儲,指針變量就需要8個字節(編譯器可以換位數)
注意:不要被*前面的類型影響對指針大小的判斷
注意:編譯器如果報警告就可以將%d改成%zd
10、結構體
(1)結構體是為了描述更多的復雜對象而誕生的,有些對象僅僅靠單個的char、int、float…來描述是不夠的,這個時候就需要結構體的存在了。
(2)struct是創建結構體的重要關鍵字,結構的存在使得描述一個對象時,可以用多個數據描述。
(3)結構體成員可以利用“.”或者“->”來訪問,兩者用法是有區別的
11、運算符的優先級和結合性
這個以后找時間補充
12、關鍵字auto(用的比較少)
(1)意思為“自動”,一般用在局部變量上,表示一個“自動變量”。
(2)代碼演示和解說
13、移動VS功能模塊的小技巧
可以拖動功能模塊,更好滿足我們的工作需求。
例如下面:有兩個源文件,通過拖動這個其中一個源文件可以同時瀏覽兩個源文件。
14、編譯器的自動修正的
有的編譯器盡管能運行一些代碼,但并不代表該代碼就是沒有錯誤的,這是新手常會誤會的錯誤,認為只要有好的編譯器,代碼能運行就說明正確。但是實際上在寫代碼的時候我們要盡可能足夠嚴謹,否則就會出現意想不到的錯誤(編譯器也沒辦法修正了)
15、打開win計算器的方法
win(就是鍵盤上微軟的圖標按鈕)+R,輸入calc就可以彈出計算器。
2022/12/28 修改日志:
在編輯的過程中肯定有寫得令人遺憾的地方,如有缺漏著實抱歉。
修改日期:2022/12/29
修改日期:2022/12/30
總結
以上是生活随笔為你收集整理的001+limou+C语言入门知识——(0)大略了解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 固体物理学习笔记
- 下一篇: C++获取鼠标位置,移动鼠标