日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

001+limou+C语言入门知识——(0)大略了解

發布時間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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陷阱與缺陷》(電子書其實挺好找的,不想找的可以直接“踢”我,我發給你……),在其間穿插牛客網等網站上的題目(練題挺重要的),順便寫一些沒事找事的“整活”代碼。

  • 本筆記只是為了在正式學習C語言之前,初步了解C語言的大致框架,僅僅只是點到為止,不會過于深入。

  • 本人的電腦操作系統是windows11,如需要下載編譯器,還請看前檢查好自己的要下載的編譯器是否合適當前的系統。(后面會有檢查系統版本的方法)

  • 目標是:大致了解C語言的基礎部分,形成一個大概的學習網絡圖

02. 內容構成

注意:本筆記會比較冗長,一是內容較多,盡可能涵蓋C語言的重點基礎內容,二是盡量讓沒怎么系統接觸過C語言的小白也能夠看懂,會顯得口語化一些。

注意:因為最近也在看《C Primer Plis(第六版)》這本書,因此在筆記里多少也會結合這本書里的比較重要的概念來書寫。

03. 學習時間

本人花時間學習C語言的時間比較零碎,光是C的基礎關鍵知識就大概學了4個月(聽說學C不用學那么久的?),當然學完不等于學會,現在很有學有遺漏的感覺,故寫本筆記來檢查自我,并且和大家一起分享學習成果。

04. 預定計劃

在2022年結束前寫完本筆記,2023年一月份前再進行一定程度的修正。

05. 網站推薦

  • 博客園
  • CSDN
  • 51CTO.com
  • 開源中國
  • chinaUnix
  • 稀土掘金
  • GitHub
  • segmentfault 思否
  • 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就需要在官網找其他版本。![在這里插入圖片描述](https://img-blog.csdnimg.cn/23c41932edac43fe8a924f660565916a.png
    (4)下載好安裝包后,打開安裝包,點擊安裝包即可開始下載


    (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作為源文件的名字(想叫其他名字的也可以的,但同樣最好是英文名字)
    • ⑦工作區出現行號和光標,可以開始編寫第一段代碼啦!

      以下是上述代碼片段,可以復制下來運行試試(先別著急理解)
    #include<stdio.h> int main() {printf("hello word");return 0; }
    • ⑧運行程序
      Ⅰ點擊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)運用“數據類型”來“存儲數據”

    #include <stdio.h> int main() {int a=10;//整形可以存儲一個整數char b='C'//字符型可以存儲一個字符(字符包括“字母”和“數字”和“特殊符號”)float c=3.14//浮點型可以存儲一個小數return 0; }

    在上述代碼中:整形10被存儲在一個叫做a的空間里,字符C被存儲在叫做b的空間里,小數3.14被存儲在叫做c的空間里。

    10. sizeof()的使用

    sizeof()函數以字節為單位,是計算類型大小的運算符(操作符)。

    #include<stdio.h> int main() {printf("%d",sizeof(int))return 0; } //一般打印出來4,少部分平臺為2

    11. 計算數據大小的單位

    數據單位轉化關系
    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 byte1NB= 1024BB
    Dogga byte1DB= 1024NB

    注意:其中比較常用的是bit、B、KB、MB、GB、TB。后來也出現了一些簡化表達,例如K有時候代表1024,M代表1024K。

    12. 變量和常量的簡單介紹

    (1)變量的概念
    ①定義變量:“(類型)+(變量名/標識符)=(數據)"

    int num=10; num=20;

    在后面令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)生命周期:就是生成變量和銷毀變量的一個時間段。
    ①在運行中,局部變量被使用了,使用完就會被銷毀,也就是說局部變量的生命周期:進入作用域生命周期開始,離開作用域生命周期結束;

    #include<stdio.h> int main()//局部變量的生命周期演示 {{int a=10;//在代碼塊{}里面創建了a這個局部變量printf("%d\n",a);//這里成功打印了a的值}//出了代碼塊{}的范圍,a被銷毀printf("%d\n",a);//在上面a的值被銷毀,這次就不能再輸出10了return 0; }

    ②在運行中,全局變量的“生命周期”和“整個main()開始直到運行結束”或者“整個程序的開始到運行”是一樣的,也就是說全局變量的生命周期是整個程序。

    03、C語言的四種常量

    (1)常見的四種常量

  • 字面常量
  • const 修飾的常變量
  • #define定義的標識符常量
  • 枚舉常量,關鍵字是enum
  • (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回車
    \dddddd表示八進制
    \xdddd表示十六進制

    ②早期的編譯器有三字母詞概念,例如“??)代表]”,?是用在來轉義的(類似想打印",不能直接寫",而是要寫\")現在的話\?比較少用了。

    #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)來提示電腦你已經輸入數據,不要傻傻等著光標跳動,計算機是不會自動把值輸入的!

    #include<stdio.h> int main() {int a=0;//存放輸入值1int b=0;//存放輸入值2int c=0;//存放scanf的返回值scanf("%d%d",&a,&b);//這里的%d的寫法,就是要求是輸入一個整型,如果你輸入一個字母進去就會造成讀取失敗,返回0)printf("%d\n",c);return 0; }

    (2)在VS2022中使用scanf常常會報警告,“scanf的返回值被忽略”,其實是在提示我們要注意用上scanf的返回值,但是其實目前是可以忽略這個警告的,編譯器只是警告你:要注意scanf的返回值,不要輕易忽略。
    (3)利用返回值(EOF或者某個數值)來多次輸入(多組輸入),可以利用scanf的返回值來實現多次的輸入

    #include <stdio.h> int main() {int a=0;while(scanf("%d",&a)==1){printf("你成功輸入了%d次\n",a+1);}//這樣就可以重復的輸入了return 0; }

    (4)另外,VS的報錯窗口就是“錯誤列表”,可以通過“視圖”里面找到“錯誤列表”就可彈出。

    注意:要經常看這個錯誤列表,能夠檢查出一些代碼的錯誤。當然有的時候編譯器自己也看不出來一些錯誤,比如,將開頭main寫成mian,在VS2022中,編譯器也檢查不出來這樣的錯誤(只會編譯失敗)。

    02、浮點數的四舍五入

    浮點數的四舍五入是很復雜的事情,因為浮點數是不精確的值。所以在以后的條件判斷中,盡量少用浮點數進行判斷(容易發生誤判)。

    03、printf的返回值

    首先看一段比較有趣的代碼:

    #include<stdio.h> int main() {int A=43;printf("%d\n",printf("%d",printf("%d",A))); }//結果會輸出什么呢? //答案是4321

    printf的返回值就是輸出的字符數量

    ①第三個printf輸出"43"字符數量為2,于是返回值為2,第二個printf就輸出"2”
    ②第二個printf輸出"2"字符數量為1,于是返回值為1,第一個printf就輸出"1"
    要注意一點是:返回值是是輸出的字符數量,包括數字,字母,標點符號,空格,轉義字符等。

    #include<stdio.h> int main() {printf("%d\n",printf("0,1,2,3\n")); } //結果為 //0,1,2,3 //8

    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)格式:元素類型+數組名+[元素個數]={元素};

    int main() {int arr[3]={0};//數組的初始化,和int a=0;這種單個變量初始化是類似的int arr_1[4]={1,2,3};//不完全初始化char arr_3[]="bit";//存放字符串return 0}

    注意:數組是沒有\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的值為整個式子的值。

    //例如: #include <stdio.h> int main() {int a=1,b=1,c=1;int x=(a+1,b+2,c+2);printf("%d",x);return 0; }

    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(靜態)的作用
    ①修飾局部變量

    void test() {int a=1;a++;printf(""%d",a); } int main() {int i=0;while(i<10){test();i++;}return 0; }//這打印了10個2,也就是2 2 2 2 2 2 2 2 2 2void test() {static int a=1;//增加了statica++;printf(""%d",a); } int main() {int i=0;while(i<10){test();i++;}return 0; }//這就打印了2 3 4 5 6 7 8 9 10 11,說明上面的a的值沒有被銷毀,仍然保留著上一次a的值

    ①加了static就相當于:你在做數學試卷,被老師叫去談話,當你回來的時候,繼續往下做題,沒有必要重新從第一題開始
    ②不加static就相當于:你在做數學試卷,被老師叫去談話,當你回來的時候,又從頭開始做題了。

    注意:一個局部變量本來放在棧區,加了static修飾的局部變量,就會放在靜態區了,存儲位置發生變化,導致局部變量出了作用域不會被銷毀,改變了變量的使用周期(即存儲位置發生了變化)

    注意:被static修飾后,這個a后面就不會重新創建為a=1了(但是a的值是可以再被改變的,只是每次都不會被重新創建a,靜態和常量不是一個概念!!!)。
    注意:靜態變量和全局變量還是有很大區別的!靜態變量只會在被修飾的局部變量里面值不變,而全局變量整個程序都是適用的。

    ②修飾全局變量
    使得全局變量只能在本源文件里面使用,同時能讓其他源文件里,另外一個被extern修飾的全局變量跨文件作用失效。(讓全局變量的外部鏈接屬性消失了)。其實這樣的話就有對這個變量進行隱藏的功能(不會被別人看到,有保密效果)

    //源文件1 extern int a; printf("%d",a);//打印不出a的值//源文件2 static int a=10//則只能在本源文件里使用

    ③修飾函數

    //在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;
    另外函數也可以類似使用:以下是兩個源文件里的內容

    int Add(int x,int y) {return x+y; } exterp int Add(int,int)//這里是函數的聲明,只需要告知函數的參數是什么即可 {int a=10,b=20;int sum=Add(a,b);printf("%d\n",sum);return 0; }

    (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個字節(編譯器可以換位數)

    int main() {char* p1;int* p2;double *p3;printf("%zd\n",sizeof(p1));//zd是printf("%zd\n",sizeof(p2));printf("%zd\n",sizeof(p3));return 0; }//在x86(32位機器)結果都是4,而64位機器都是8

    注意:不要被*前面的類型影響對指針大小的判斷

    注意:編譯器如果報警告就可以將%d改成%zd

    10、結構體

    (1)結構體是為了描述更多的復雜對象而誕生的,有些對象僅僅靠單個的char、int、float…來描述是不夠的,這個時候就需要結構體的存在了。
    (2)struct是創建結構體的重要關鍵字,結構的存在使得描述一個對象時,可以用多個數據描述。
    (3)結構體成員可以利用“.”或者“->”來訪問,兩者用法是有區別的

    struct Student {char name[20];//名字int age;//年齡char id[15];//學號float score;//成績 }; int main() {struct Student s1={"張三",20,"2022010823",88.5f};struct Student s2={“翠花”,18,"2022030405",98.0f};printf("%s %d %s %f",s1.name,s1.age,s1.id,s1.score);struct Student *ps1=&s1;printf("%s %d %s",(*ps1).name,(*ps1).age,(*ps1).id,(*ps1).score);printf("%s %d %s %f",ps1->name,ps1->age,ps1->id,ps1->score); }

    11、運算符的優先級和結合性

    這個以后找時間補充

    12、關鍵字auto(用的比較少)

    (1)意思為“自動”,一般用在局部變量上,表示一個“自動變量”。
    (2)代碼演示和解說

    int main() {int a=10;//局部變量又叫自動變量,自動創建自動銷毀,由于所有的局部變量都是自動變量,所以前面的auto被省略了,實際上通常是不會寫的。return 0; }

    13、移動VS功能模塊的小技巧

    可以拖動功能模塊,更好滿足我們的工作需求。
    例如下面:有兩個源文件,通過拖動這個其中一個源文件可以同時瀏覽兩個源文件。

    14、編譯器的自動修正的

    有的編譯器盡管能運行一些代碼,但并不代表該代碼就是沒有錯誤的,這是新手常會誤會的錯誤,認為只要有好的編譯器,代碼能運行就說明正確。但是實際上在寫代碼的時候我們要盡可能足夠嚴謹,否則就會出現意想不到的錯誤(編譯器也沒辦法修正了)

    15、打開win計算器的方法

    win(就是鍵盤上微軟的圖標按鈕)+R,輸入calc就可以彈出計算器。

    2022/12/28 修改日志:

    在編輯的過程中肯定有寫得令人遺憾的地方,如有缺漏著實抱歉。

    修改日期:2022/12/29

    修改日期:2022/12/30

    總結

    以上是生活随笔為你收集整理的001+limou+C语言入门知识——(0)大略了解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。