版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第1章C語言概述
編程與計算思維什么是編程從廣義角度來講,使用電視機(jī)的遙控器本身就是一種編程行為。遙控器上的按鍵可以看作一種可視化編程界面。我們在點(diǎn)擊按鍵的時候,實(shí)際上是改變了電視機(jī)內(nèi)部的電路狀態(tài),包括:驅(qū)動電流、接受頻率等。編程就是使用一種軟件的方式(編程語言)來改變計算機(jī)的硬件的行為。
計算機(jī)、程序員、程序之間的關(guān)系程序員(Programmer)編寫程序源代碼(SourceCode)的人計算機(jī)、程序員、程序之間的關(guān)系計算機(jī)程序員程序樂隊指揮家樂譜軍隊總司令作戰(zhàn)計劃4/37指令、程序和軟件■指令:指令=操作碼+地址碼。面向機(jī)器。執(zhí)行指令■程序:指令的集合。面向開發(fā)者。編寫程序■軟件:軟件=程序+數(shù)據(jù)+文檔,面向用戶,是一個商業(yè)概念。銷售軟件
編程語言語言-交流的基礎(chǔ)與藝術(shù)“如果你想成為周游世界的旅行家,那么你大概需要學(xué)習(xí)用6912種語言說:'你好,廁所在哪里?'”——BrianHayes《分號的戰(zhàn)爭》人類之間溝通和交流的語言——漢語、英語...讓計算機(jī)像人一樣地思考,與人自然交流,一直是計算機(jī)行業(yè)的夢想。如果計算機(jī)能讀懂人的自然語言(NaturalLanguage),那么。。。。?7/37編程語言的終極目標(biāo)-自然語言直接用人類自然語言進(jìn)行編程,是人類的終極目標(biāo),但目前還不能完全做到人與計算機(jī)交流-編程語言
計算機(jī)學(xué)會人的語言,與人自然交流——自然語言理解(NaturalLanguageUnderstanding)盡管自然語言理解技術(shù)得到了長足發(fā)展,但目前人機(jī)交互(Human-ComputerCommunication)幾乎還只能使用嚴(yán)格限制的各種非自然語言,即計算機(jī)專用的語言人類只能主動學(xué)計算機(jī)的語言,做不到計算機(jī)學(xué)會人的語言9/37人機(jī)交流設(shè)計更貼近人類自然語言和數(shù)學(xué)語言的計算機(jī)語言高級語言(High-levelLanguages)“高級”在哪里?可以在一個更高的級別上進(jìn)行編程不像低級語言那樣依賴于硬件更遠(yuǎn)離機(jī)器語言更易學(xué)易用,具有可移植性10/37高級語言與機(jī)器語言高級語言、匯編語言與機(jī)器語言高級語言C、C++、C#、JAVA、PHP、Python…機(jī)器語言0/1計算機(jī)硬件唯一可直接識別語言。匯編語言MOV、ADD、HTL…高級語言、匯編語言和機(jī)器語言機(jī)器語言:由0、1代碼組成的能被機(jī)器直接理解、執(zhí)行的指令集合。匯編語言:采用助記符來代替機(jī)器語言中的指令和數(shù)據(jù),又稱為符號語言。高級語言:易學(xué)、易懂、易修改、通用性好,不依賴機(jī)器。但機(jī)器不能直接運(yùn)行,必須翻譯成機(jī)器語言。如:C、JAVA、Python、PHP等。機(jī)器語言機(jī)器語言就是機(jī)器指令對應(yīng)的語言指令=操作碼+地址碼【1100】,【0000】:
將內(nèi)存1100單元的數(shù)和0000單元的數(shù)相加機(jī)器語言書寫程序需要記憶大量的機(jī)器碼,還需要知道很多硬件的知識,只有極少數(shù)專業(yè)的科學(xué)家和工程師才能掌握。匯編語言把操作碼換成英文單詞的助記符,就有了很大的進(jìn)步,方便人的書寫。[1100][0000]:將內(nèi)存1100單元的數(shù)和0000單元的數(shù)相加ADD[1100],[0000]高級語言高級語言是面向人的,人使用方便a=100b=99if(a>b)print(a)elseprint(b)計算機(jī)的母語-二進(jìn)制機(jī)器碼
計算機(jī)只能識別二進(jìn)制指令機(jī)器語言(MachineLanguage)用機(jī)器語言編寫的一組機(jī)器指令的集合,稱為機(jī)器代碼(MachineCode),簡稱機(jī)器碼用一系列二進(jìn)制0和1組成的二進(jìn)制代碼代表不同的機(jī)器指令機(jī)器語言編寫的1+1程序——猶如天書!101110000000000100000000000001010000000100000000計算機(jī)的母語是什么?17/37程序員的語言-高級語言
Bothlearnathird-partylanguage用助記符代表機(jī)器指令的操作碼用一個匯編器(Assembler)將這些符號翻譯成機(jī)器可識別、可執(zhí)行的二進(jìn)制指令——匯編過程匯編語言(AssemblyLanguage)低級語言,與計算機(jī)硬件的距離的級別較低,對硬件依賴性強(qiáng)MOVAX,1101110000000000100000000ADDAX,100000101000000010000000018/37PRINT1+1BASIC語言編寫的1+1程序高級語言的特點(diǎn)
C語言編寫的1+1程序#include<stdio.h>intmain(){ printf("%d\n",1+1);return0;}既非英語,也非機(jī)器語言,但更像英語高級語言程序必須通過編譯器或解釋器翻譯成機(jī)器語言形式的目標(biāo)代碼,才能被計算機(jī)識別和執(zhí)行易學(xué)、易用、易讀、易懂、強(qiáng)大、可移植19/37高級語言的分類
語言典型代表特點(diǎn)過程式語言(Procedural)C命令驅(qū)動,面向動作(語句),即將計算看作是動作(語句)的序列,程序由一系列的語句組成函數(shù)式語言(Functional)LISP注重程序?qū)崿F(xiàn)的功能,程序的編寫過程是從已有函數(shù)出發(fā)構(gòu)造出更復(fù)雜的函數(shù),應(yīng)用這些函數(shù)直至計算求得最終結(jié)果面向?qū)ο笳Z言(Object-Oriented)SmallTalk、C++、Java程序的編寫過程是直接從問題本身出發(fā)分析問題,并把數(shù)據(jù)和操作封裝在一起構(gòu)成對象,用數(shù)據(jù)描述對象屬性,用對數(shù)據(jù)的操作描述對象行為邏輯式語言(Logical)PROLOG基于規(guī)則的具有推理功能的語言20/37高級語言與機(jī)器語言從高級語言到機(jī)器語言編譯型語言通過編譯器(Compiler)把源程序全部翻譯成邏輯上與之等價的機(jī)器語言表示的目標(biāo)代碼(ObjectCode),才能被計算機(jī)識別和執(zhí)行解釋型語言解釋程序(Interpreter)邊掃描邊解釋,語句被逐條地解釋成可執(zhí)行的機(jī)器指令,不產(chǎn)生目標(biāo)程序——“同聲傳譯”有些解釋語言(如Java和C#)采用了“先編譯、后解釋”的方法來提速22/37編譯和解釋解釋:對源程序是一邊翻譯,一邊執(zhí)行,不產(chǎn)生目標(biāo)程序。編譯和解釋編譯:將高級語言所編寫的源程序翻譯成等價的用機(jī)器語言表示的目標(biāo)程序。
C語言的發(fā)展歷史C語言的誕生始末1969年,ken夢想能遨游宇宙,設(shè)計了一款模擬在太陽系航行的電子游戲——“SpaceTravel”,1971年dmr加入游戲在PDP-7小型機(jī)上開發(fā),因?yàn)檫@臺機(jī)器免費(fèi),但免費(fèi)的機(jī)器沒有操作系統(tǒng)玩游戲前,先給PDP-7做個操作系統(tǒng),命名為UNIX20世紀(jì)60年代,Ritchie和Thompson在貝爾實(shí)驗(yàn)室開發(fā)UNIX操作系統(tǒng)26/37C語言的誕生始末匯編編寫UNIX太慢,而一般的高級語言難以實(shí)現(xiàn)匯編語言的某些功能,怎么辦?dmr改造B語言,設(shè)計了一種新的高級語言,命名為“C語言”,把UNIX的90%以上代碼用C改寫1983年,因?yàn)閁NIX和C語言的巨大成功,ken和dmr共同獲得當(dāng)年度的計算機(jī)界最高獎——圖靈獎1999年接受美國國家技術(shù)勛章27/37C語言的誕生編程語言受歡迎程度排行/tpci.htm
29/37C語言標(biāo)準(zhǔn)1978年,DennisM.Richie和BrianW.Kernighan合著影響深遠(yuǎn)的名著《TheCProgrammingLanguage》1982年,美國國家標(biāo)準(zhǔn)化協(xié)會(AmericanNationalStandardsInstitute,ANSI)成立C標(biāo)準(zhǔn)委員會1989年,發(fā)布第一個完整的C語言標(biāo)準(zhǔn),簡稱C89習(xí)慣上也稱為ANSIC(標(biāo)準(zhǔn)C)1990年被國際標(biāo)準(zhǔn)化組織ISO采納,也稱為C901999年修正和完善之后,ISO發(fā)布了C9930/37
C語言的學(xué)習(xí)方法為什么要學(xué)C語言?是一種高級語言并不“高級”,只是相對低級語言在一個高的級別上進(jìn)行編程實(shí)際上是一種介于高級語言和低級語言之間的語言,運(yùn)行效率高透過現(xiàn)象看本質(zhì),透過C語言窺探計算機(jī)底層的工作原理很多流行語言、新生語言都借鑒了它的思想、語法從C++,到Java,再到C#學(xué)好C是學(xué)習(xí)這些流行語言的基礎(chǔ),了解程序設(shè)計的基本思想交流、筆試、面試時最常見的語言32/37學(xué)習(xí)C語言的三把斧語法算法數(shù)據(jù)結(jié)構(gòu)程序=算法+數(shù)據(jù)結(jié)構(gòu)程序是指令的集合程序=數(shù)據(jù)結(jié)構(gòu)+算法程序=算法+數(shù)據(jù)結(jié)構(gòu)程序是指令的集合程序=數(shù)據(jù)結(jié)構(gòu)+算法算法算法:有限個步驟組成的用來解決問題的具體過程。如:學(xué)生進(jìn)行核算檢測
核酸檢測的流程是算法
學(xué)生排成隊列是數(shù)據(jù)結(jié)構(gòu)其它例子:大雁飛行廣場舞做菜等算法算法:用有限個步驟組成的用來解決問題的具體過程。如:1.魚香肉絲的烹飪步驟2.員工離職流程3.找出10個數(shù)中的最大值:2,3,4,66,9,0,100,101,45,22算法算法的三種結(jié)構(gòu):順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)算法的三種結(jié)構(gòu):順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)算法算法的特點(diǎn):有窮性確定性可行性零個或多個輸入一個或多個輸出算法的表示方法:自然語言流程圖偽代碼計算機(jī)語言等。a=100b=99if(a>b)print(a)elseprint(b)數(shù)據(jù)結(jié)構(gòu)抽象出來的數(shù)據(jù)之間的關(guān)系,代表信息的組織方式,目的是提高算法的效率。數(shù)據(jù)結(jié)構(gòu)■線性表■堆棧:先進(jìn)后出■隊列:先進(jìn)先出
C語言的應(yīng)用C語言的應(yīng)用場景硬件(Hardware)OperationSystem操作系統(tǒng)(OS)
Application(應(yīng)用程序)應(yīng)用
平臺基于
平臺的應(yīng)用
程序DomainofLowlevellanguageDomainofHighlevellanguageDomainofC43/37
C語言的結(jié)構(gòu)C語言的結(jié)構(gòu)C語言的構(gòu)成C語言編譯過程程序的開發(fā)步驟Whatistobedone?Howisittobedone?分析設(shè)計編碼編譯連接運(yùn)行測試調(diào)試維護(hù)修改一種語言對應(yīng)一種編譯器(Compiler)把源程序翻譯成邏輯上與之等價的機(jī)器語言表示的目標(biāo)程序把程序調(diào)用的庫函數(shù)鏈接到目標(biāo)程序中,生成可被OS執(zhí)行的程序48/37第2章程序設(shè)計基礎(chǔ)知識C語言的數(shù)據(jù)類型單精度實(shí)型(float)雙精度實(shí)型(double)整型(int)字符型(char)枚舉類型數(shù)組類型結(jié)構(gòu)體類型共用體類型實(shí)型(浮點(diǎn)型)基本類型構(gòu)造類型空類型(void)指針類型數(shù)據(jù)類型整型數(shù)據(jù)類型1.整型數(shù)據(jù)類型概述在C語言中,整型數(shù)據(jù)類型是一種用于表示整數(shù)范圍的數(shù)據(jù)類型。C語言提供了多種整型數(shù)據(jù)類型,如short、int、long等,這些類型根據(jù)需要提供不同范圍的整數(shù)。它們的主要用途是存儲和處理數(shù)值,特別是在計算和數(shù)學(xué)運(yùn)算中。short:適用于小范圍整數(shù),如變量、循環(huán)計數(shù)器等。它在大多數(shù)情況下都能滿足需求,但在處理大數(shù)據(jù)時可能會消耗更多的內(nèi)存。示例:使用short類型存儲循環(huán)計數(shù)器,以控制循環(huán)次數(shù)。int:這是C語言中最常用的整型數(shù)據(jù)類型,適用于大多數(shù)情況。它的范圍足夠大,可以處理大多數(shù)數(shù)值運(yùn)算。示例:使用int類型存儲和處理需要整數(shù)的變量和表達(dá)式。long:適用于需要更大范圍整數(shù)的場景,如長整數(shù)運(yùn)算或存儲大量數(shù)據(jù)。示例:使用long類型處理需要更大范圍整數(shù)的數(shù)學(xué)運(yùn)算或存儲大數(shù)據(jù)。C語言的數(shù)據(jù)類型2.整型數(shù)據(jù)類型的應(yīng)用場景整型數(shù)據(jù)類型在C語言中應(yīng)用廣泛,從簡單的數(shù)值運(yùn)算到復(fù)雜的數(shù)學(xué)問題,都可以使用它們來解決。此外,它們還廣泛應(yīng)用于各種編程場景,如游戲開發(fā)、科學(xué)計算、數(shù)據(jù)分析等。在游戲開發(fā)中,使用int類型的變量占比超過70%,這是因?yàn)橛螒蛑械臄?shù)值通常較小,使用int類型可以節(jié)省內(nèi)存空間。在科學(xué)計算和數(shù)據(jù)分析中,long類型的變量占比約為30%,這是因?yàn)樾枰幚淼臄?shù)據(jù)范圍較大,使用long類型可以更好地處理大數(shù)據(jù)。在嵌入式系統(tǒng)編程中,short類型的變量占比較高,這是因?yàn)榍度胧较到y(tǒng)的資源有限,使用short類型可以更有效地利用內(nèi)存資源。整型數(shù)據(jù)分類及取值范圍整型數(shù)據(jù)分為一般整型(int)、短整型(short)和長整型(long),并且每一種類型又分為帶符號(signed)和無符號(unsigned)兩種類型。整型數(shù)據(jù)的特性見下表:
數(shù)據(jù)類型名說明VisualC++6.0環(huán)境TurboC2.0環(huán)境字節(jié)取值范圍字節(jié)取值范圍short[int]短整型2-32768~327672-32768~32767signedshort[int]帶符號短整型2-32768~327672-32768~32767unsignedshort[int]無符號短整型20~6553520~65535int整型4-2147483648~21474836472-32768~32767signed[int]帶符號整型4-2147483648~21474836472-32768~32767unsigned[int]無符號整型40~429496729520~65535long[int]長整型4-2147483648~21474836474-2147483648~2147483647signedlong[int]帶符號長整型4-2147483648~21474836474-2147483648~2147483647unsignedlong[int]無符號長整型40~429496729540~4294967295浮點(diǎn)型數(shù)據(jù)類型1.浮點(diǎn)型數(shù)據(jù)類型簡介浮點(diǎn)型數(shù)據(jù)類型是C語言中最常用的數(shù)據(jù)類型之一,它包括單精度浮點(diǎn)數(shù)(float)和雙精度浮點(diǎn)數(shù)(double)。這些數(shù)據(jù)類型用于存儲帶有小數(shù)部分的數(shù)值,如貨幣、坐標(biāo)、科學(xué)計算等場景。2.浮點(diǎn)型數(shù)據(jù)類型的特點(diǎn)精度高:相對于整數(shù)類型,浮點(diǎn)型數(shù)據(jù)類型能夠提供更高的精度,適用于需要精確計算的場景。占用空間大:由于需要存儲小數(shù)部分,浮點(diǎn)型數(shù)據(jù)類型通常需要更多的內(nèi)存空間。運(yùn)算速度快:由于計算機(jī)硬件對浮點(diǎn)數(shù)的運(yùn)算有優(yōu)化,因此浮點(diǎn)型數(shù)據(jù)類型的運(yùn)算速度通常比整數(shù)類型快。3.浮點(diǎn)型數(shù)據(jù)類型的取值范圍單精度浮點(diǎn)數(shù)的取值范圍約為3.4E-38~3.4E+38,雙精度浮點(diǎn)數(shù)的取值范圍約為1.7E-308~1.7E+308。這些范圍限制了浮點(diǎn)型數(shù)據(jù)類型在處理大規(guī)模數(shù)據(jù)時的適用性。4.浮點(diǎn)型數(shù)據(jù)類型的比較精度比較:雙精度浮點(diǎn)數(shù)(double)通常比單精度浮點(diǎn)數(shù)(float)具有更高的精度。數(shù)值穩(wěn)定性:在某些情況下,使用單精度浮點(diǎn)數(shù)可能會導(dǎo)致數(shù)值不穩(wěn)定,而使用雙精度浮點(diǎn)數(shù)則更可靠。浮點(diǎn)型數(shù)據(jù)分類
浮點(diǎn)型數(shù)據(jù)分為單精度實(shí)型(float)、雙精度實(shí)型(double)和長雙精度實(shí)型(longdouble)。具體情況見下表所示:數(shù)據(jù)類型名說明VisualC++6.0環(huán)境TurboC2.0環(huán)境字節(jié)取值范圍有效數(shù)字字節(jié)取值范圍有效數(shù)字float單精度實(shí)型4-3.4×1038~3.4×10386~74-3.4×1038~3.4×10386~7double雙精度實(shí)型8-1.7×10308~1.7×1030815~168-1.7×10308~1.7×1030815~16longdouble長雙精度實(shí)型815~1610-1.2×104932~1.2×10493218~191.7×10308~1.7×10308浮點(diǎn)型數(shù)據(jù)類型的應(yīng)用1.數(shù)值模擬在物理模擬、流體動力學(xué)、經(jīng)濟(jì)學(xué)等領(lǐng)域,浮點(diǎn)型數(shù)據(jù)類型被廣泛用于表示和計算復(fù)雜的數(shù)學(xué)模型。例如,在流體動力學(xué)模擬中,需要高精度的數(shù)值計算,因此雙精度浮點(diǎn)數(shù)被廣泛使用。2.數(shù)據(jù)分析和統(tǒng)計在數(shù)據(jù)分析、機(jī)器學(xué)習(xí)等領(lǐng)域,浮點(diǎn)型數(shù)據(jù)類型用于存儲和處理大量的數(shù)據(jù)。單精度浮點(diǎn)數(shù)由于其較小的內(nèi)存占用,因此在處理大規(guī)模數(shù)據(jù)時更具優(yōu)勢。3.科學(xué)可視化在科學(xué)可視化中,浮點(diǎn)型數(shù)據(jù)類型用于表示3D圖形和圖像數(shù)據(jù)。高精度的浮點(diǎn)數(shù)能夠?qū)崿F(xiàn)更精確的視覺效果和更豐富的交互體驗(yàn)。4.金融計算在金融領(lǐng)域,浮點(diǎn)型數(shù)據(jù)類型用于處理復(fù)雜的金融計算,如利率計算、投資回報率等。高精度的浮點(diǎn)數(shù)能夠提高計算的準(zhǔn)確性和可靠性。字符型數(shù)據(jù)類型
char類型,即字符類型,用于存儲字符數(shù)據(jù),實(shí)際上是一個整數(shù)類型。當(dāng)今最常用的字符集是ASCII(美國信息交換標(biāo)準(zhǔn)碼),它用7位代碼表示128個字符。在ASCII碼中,數(shù)字0~9用0110000~0111001碼來表示,大寫字母A~Z用1000001~1011010碼表示。ASCII碼常被擴(kuò)展用于表示256個字符,相應(yīng)的字符集Latin-1包含西歐和許多非洲語言中的字符。字符型數(shù)據(jù)分類
字符型數(shù)據(jù)分為一般字符型(char)、帶符號字符型(signedchar)和無符號字符型(unsignedchar)三種類型。具體情況見下表所示:數(shù)據(jù)類型名說明字節(jié)取值范圍char字符型1-128~127signedchar帶符號字符型1-128~127unsignedchar無符號字符型10~255數(shù)據(jù)類型的意義“數(shù)據(jù)類型”的意義:1.定義了數(shù)據(jù)占用的內(nèi)存空間大小2.定義了數(shù)據(jù)在內(nèi)存中的存儲格式3.決定了數(shù)據(jù)的運(yùn)算規(guī)則(自身的行為)4.為編譯器提供了檢查依據(jù)數(shù)據(jù)類型是避免程序錯誤的初級(基本)手段,不是全部手段。數(shù)據(jù)類型的意義【例2.1】計算2個整數(shù)的和。1 #include<stdio.h>2 3 intmain(void)4 {5 intnum1=1;6 intnum2=2;7 printf("num1+num2=%d\n",num1+num2);8 return0;9 }標(biāo)識符與關(guān)鍵字例2.1程序第1行是一條預(yù)處理命令,通過#include引入標(biāo)準(zhǔn)輸入輸出庫(stdio.h),它包含了一系列用于輸入和輸出的函數(shù)和宏定義。這些函數(shù)和宏定義提供了與終端窗口或文件交互的方法,使程序能夠從用戶那里獲取輸入,并將輸出顯示給用戶。第3行代碼我們定義了一個名為main的函數(shù),我們一般稱之為“主函數(shù)”,主函數(shù)非常重要,它是程序的入口點(diǎn),也是程序的結(jié)束點(diǎn),無論一個C語言程序有多大,它都有且僅有一個主函數(shù)。關(guān)于函數(shù)的具體細(xì)節(jié),將在第四章介紹。第5-6行代碼,我們定義了兩個變量,其標(biāo)識符命名為num1和num2,其數(shù)據(jù)類型為int整型,并且分別賦值為1和2;第7行代碼,我們使用printf()函數(shù)輸出了一段為“num1+num2=3”的內(nèi)容,通過加法運(yùn)算符對變量num1和num2進(jìn)行求和,并結(jié)果輸出到控制臺上。標(biāo)識符與關(guān)鍵字在C語言中,關(guān)鍵字(Keywords)是預(yù)先定義的一組特殊單詞,具有特殊含義和用途。這些關(guān)鍵字在C語言的語法中有著特殊的地位,不能用作標(biāo)識符(變量名、函數(shù)名等)或其他用途。autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsignedcontinueforsignedvoiddefaultgotosizeofvolatiledoifstaticwhile常量與變量在例2.1中:1 intnum1=3;2 floatnum2=3.14;num1、num2分別是兩個變量,每一個變量都必須有一個類型(type)。類型用來說明變量所存儲的數(shù)據(jù)的種類。C語言擁有廣泛多樣的類型。目前,我們先只了解int類型和float類型。由于類型會影響變量的存儲方式以及允許對變量進(jìn)行的操作,所以根據(jù)實(shí)際場景,選擇合適的類型是非常關(guān)鍵的。數(shù)值型變量的類型決定了變量所能存儲的最大值和最小值,同時也決定了是否允許在小數(shù)點(diǎn)后出現(xiàn)數(shù)字。常量與變量【例2.2】查看int型和float型變量取值范圍。1 #include<stdio.h>2 #include<limits.h>3 #include<float.h>4 5 intmain()6 {7 printf("INT_MAX:%d\n",INT_MAX);8 printf("INT_MIN:%d\n",INT_MIN);9 printf("FLT_MIN:%e\n",FLT_MIN);10 printf("FLT_MAX:%e\n",FLT_MAX);11 return0;12 }變量命名1.標(biāo)識符命名規(guī)則變量名由字母(大寫或小寫)、數(shù)字和下劃線組成。變量名必須以字母或下劃線開頭,不能以數(shù)字開頭。變量名對大小寫敏感,例如myVariable和myvariable是兩個不同的變量名。2.標(biāo)識符長度C語言標(biāo)準(zhǔn)沒有規(guī)定標(biāo)識符的最大長度,但通常建議保持標(biāo)識符簡潔和易于理解。一般而言,標(biāo)識符的長度應(yīng)該在幾個字符到幾十個字符之間。變量命名3.關(guān)鍵字沖突C語言標(biāo)準(zhǔn)沒有規(guī)定標(biāo)識符的最大長度,但通常建議保持標(biāo)識符簡潔和易于理解。一般而言,標(biāo)識符的長度應(yīng)該在幾個字符到幾十個字符之間。4.合理的命名變量名應(yīng)該具有描述性,能夠清晰地表達(dá)變量的用途和含義。這樣有助于代碼的可讀性和維護(hù)性。使用有意義的單詞或縮寫來命名變量,避免使用過于簡單或晦澀的名稱。專業(yè)的命名方法將在2.6中進(jìn)行介紹。變量命名以下是一些有效的變量命名示例:int
age;float
salary;char
firstName;double
averageScore;
以下是一些無效的變量命名示例:int
123var;
//以數(shù)字開頭,無效int
for;
//
使用關(guān)鍵字,無效int
my
variable;//包含空格,無效常量表2.2一些關(guān)于常量的實(shí)例案例常量類型實(shí)例備注整數(shù)常量8,20,0,O77,0x1A包括正整數(shù)、負(fù)整數(shù)和零在內(nèi)的所有整數(shù);也可以是十進(jìn)制、八進(jìn)制(以0開頭)或十六進(jìn)制(以0x開頭)形式浮點(diǎn)數(shù)常量3.14,-0.21,45.0表示實(shí)數(shù)(浮點(diǎn)數(shù))值,通常包括小數(shù)點(diǎn)字符常量a','Q','1','8','%'表示單個字符,用單引號括起來字符串常量Hello,World!','zhangsan','M76'表示一串字符,用雙引號括起來顧名思義,常量是指在程序執(zhí)行期間不能被修改的量。按照類型的不同,可以劃分為以下幾種類型:整數(shù)常量、浮點(diǎn)常量、字符常量和字符串常量等。注釋在C語言中,注釋是一種用于解釋和說明代碼的文本形式。它們不會被編譯器處理或執(zhí)行,而是僅供程序員閱讀和理解代碼時使用。注釋在代碼中起到了以下幾個重要的作用:解釋代碼目的和邏輯提供上下文信息標(biāo)識和解釋關(guān)鍵步驟版本控制和合作開發(fā)調(diào)試和維護(hù)注釋例如:/*這是多行注釋,可以跨越多行*/下面我們來為例2.1添加注釋。/*以下程序計算2個整數(shù)的和*/#include<stdio.h>//引入標(biāo)準(zhǔn)輸入輸出頭文件
int
main(void)//程序入口函數(shù){
int
num1
=
1;//定義變量num1并為它賦值為1
int
num2
=
2;//定義變量num2并為它賦值為2
printf("num1
+
num2
=
%d\n",
num1
+
num2);//計算num1與num2的和
return
0;}字符操作在C語言中字符的操作非常簡單,因?yàn)榇嬖谶@樣一個事實(shí):C語言把字符當(dāng)作小整數(shù)進(jìn)行處理。畢竟所有字符都是以二進(jìn)制的形式進(jìn)行編碼的,而且無需花費(fèi)太多的想象就可以將這些二進(jìn)制代碼看成整數(shù)。例如,在ASCII碼中,字符的取值范圍是0000000~1111111,可以看成是0~127的整數(shù)。字符'a'的值為97,'A'的值為65,'0'的值為48,而''的值為32。在C中,字符和整數(shù)之間的關(guān)聯(lián)是非常強(qiáng)的,字符常量事實(shí)上是int類型而不是char類型(這是一個非常有趣的現(xiàn)象,但對我們并無影響)。當(dāng)計算中出現(xiàn)字符時,C語言只是使用它對應(yīng)的整數(shù)值。思考下面這個例子,假設(shè)采用ASCII字符集字符操作【例2.4】字符操作1 #include<stdio.h>2 3 intmain(){4
5
charch;6
inti;7
i='a';/*iisnow97*/8
ch=65;/*chisnow'A'*/9
printf("i=%c\n",i);10
printf("ch=%c\n",ch);11 12
ch=ch+1;/*chisnow'B'*/13
printf("ch+1=%c\n",ch);14
15
ch++;/*chisnow'C'*/16
printf("ch++=%c\n",ch);17 18
return0;19 }字符操作運(yùn)行結(jié)果如下:i=ach=Ach+1=Bch++=C據(jù)此,我們可以實(shí)現(xiàn)大小寫字母之前的相互轉(zhuǎn)換:【例2.5】大小寫字母轉(zhuǎn)換1 #include<stdio.h>2 3 intmain(){4
5
charch1='E',ch2='g';6
ch1=ch1+('a'-'A');//大寫字母轉(zhuǎn)小寫字母7
ch2=ch2-('a'-'A');//小寫字母轉(zhuǎn)大寫字母8
printf("ch1=%c\n",ch1);9
printf("ch2=%c\n",ch2);10
return0;11 }運(yùn)行結(jié)果如下:ch1=ech2=G類型轉(zhuǎn)換通過前面的學(xué)習(xí),我們知道每種數(shù)據(jù)類型都有它的取值范圍,如果我們在使用數(shù)據(jù)類型定義變量并對其進(jìn)行初始化時,不小心超出了取值范圍,編譯器會如何處理呢?我們通過以下代碼進(jìn)行測試:【例2.6】查看int型和float型變量取值范圍。#include<stdio.h>
int
main(void){
//
有符號int測試
int
signed_num1
=
2147483647;
//有符號int最大值
int
signed_num2
=
2147483648;
//超出有符號int的最大值
printf("signed_num1
=
%d\n",
signed_num1);
printf("signed_num2
=
%d\n",
signed_num2);
//
無符號int測試
unsigned
int
unsigned_num1
=
4294967295;
//無符號int最大值
unsigned
int
unsigned_num2
=
4294967296;
//超出無符號int的最大值
printf("unsigned_num1
=
%u\n",
unsigned_num1);
printf("unsigned_num2
=
%u\n",
unsigned_num2);}類型轉(zhuǎn)換程序運(yùn)行結(jié)果如下:signed_num1=2147483647signed_num2=-2147483648unsigned_num1=4294967295unsigned_num2=0我們知道,對于64位的操作系統(tǒng)來說,有符號int類型的最大值為2,147,483,647,二進(jìn)制表示為01111111111111111111111111111111。程序中的變量signed_num2初始化值為2,147,483,648,超出了有符號int類型的最大值,這時編譯器是如何處理的呢?其實(shí),在越界情況下,符號位需要多出來一位,對于int型,符號位在第33的位置上,然后按照這種形式計算補(bǔ)碼。因?yàn)檎龜?shù)原碼和補(bǔ)碼一致,所以2,147,483,648的二進(jìn)制補(bǔ)碼是:010000000000000000000000000000000,而int型實(shí)際只有32位,即存儲的是后32位,也就是-2,147,483,648的補(bǔ)碼。常用算術(shù)轉(zhuǎn)換常用算術(shù)轉(zhuǎn)換可用于大多數(shù)二元運(yùn)算符(包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算
符和判等運(yùn)算符)的操作數(shù)。執(zhí)行常用算術(shù)轉(zhuǎn)換的規(guī)則可以劃分成兩種情況。任一操作數(shù)的類型是浮點(diǎn)類型的情況。按照下圖將類型較狹小的操作數(shù)進(jìn)行提升:float→double→longdouble也就是說,如果一個操作數(shù)的類型為longdouble,那么把另一個操作數(shù)的類型轉(zhuǎn)換成longdouble類型。否則,如果一個操作數(shù)的類型為double類型,那么把另一個操作數(shù)轉(zhuǎn)化成double類型。否則,如果一個操作數(shù)的類型是float類型,那么把另一個操作數(shù)轉(zhuǎn)換成float類型。以下是浮點(diǎn)數(shù)隱式轉(zhuǎn)換的案例:常用算術(shù)轉(zhuǎn)換【例2.7】浮點(diǎn)數(shù)隱式轉(zhuǎn)換。1 #include<stdio.h>2 3 intmain(){4
floata=1.234;5
doubleb=3.14159265358979323846;6
longdoublec;7 8
printf("轉(zhuǎn)換前:\n");9
printf("a的字節(jié)為:%zu\n",sizeof(a));10
a=b;11
printf("轉(zhuǎn)換后:\n");12
printf("double:a的字節(jié)為:%zu\n",sizeof(a));13
b=c;14
printf("longdouble:b的字節(jié)為:%zu\n",sizeof(b));15 16
return0;17 }運(yùn)行結(jié)果為:轉(zhuǎn)換前:a的字節(jié)為:4轉(zhuǎn)換后:double:a的字節(jié)為:4longdouble:b的字節(jié)為:8算術(shù)運(yùn)算符算術(shù)運(yùn)算是程序設(shè)計語言中最基礎(chǔ)的運(yùn)算,這類運(yùn)算可以執(zhí)行加法、減法、乘法和除法。下表列出了算術(shù)運(yùn)算符的詳細(xì)信息:一元運(yùn)算符二元運(yùn)算符
+正號運(yùn)算符-負(fù)號運(yùn)算符加/減法乘/除法+加法運(yùn)算符-減法運(yùn)算符*乘法運(yùn)算符/除法運(yùn)算符%求余運(yùn)算符算術(shù)運(yùn)算符【例2.8】求一個三位數(shù)各個數(shù)位上的值。#include
<stdio.h>
int
main(void)
{
int
a
=
163,
a0,
a1,
a2;
a0
=
a
/
100;
//
獲取百位
a1
=
a
%
100
/
10;
//
獲取十位
a2
=
a
%
100
%
10;
//
獲取個位
printf("a0
=
%d,
a1
=
%d,
a2
=
%d\n",
a0,
a1,
a2);}程序的運(yùn)行結(jié)果如下:a0=1,a1=6,a2=3賦值運(yùn)算符在C語言中,"="符號不稱為等號,而是叫做賦值運(yùn)算符。其基本語法如下:
變量=表達(dá)式
其表示將“表達(dá)式”的計算結(jié)果賦值給“變量”,賦值過程是從右往左進(jìn)行的。賦值運(yùn)算符以下是賦值運(yùn)算符的使用場景:(1)基本賦值int
x
=
5;
以上代碼表示將整數(shù)5賦值給整型變量x。
(2)復(fù)合賦值inty;y
+=
5;
在C語言中,這是一種常用賦值方式,“y+=5”等同于“y=y+5”,表示將
y
加
5
的結(jié)果賦給
y,程序開始將y初始化為10,執(zhí)行"y+=5"操作后y的值將變?yōu)?/p>
15。賦值運(yùn)算符(3)多重賦值int
a,
b,
c;a
=
b
=
c
=
10;
將整數(shù)值10賦給整型變量a、b和c。(4)表達(dá)式作為右操作數(shù)賦值運(yùn)算符的右操作數(shù)可以是一個表達(dá)式。在這種情況下,表達(dá)式會被計算,并將結(jié)果賦給左操作數(shù),例如:
int
x
=
5;int
y
=
3;x
=
x
+
y;
賦值運(yùn)算符(5)連續(xù)賦值C語言允許將多個賦值操作放在同一行,用逗號“,”分隔它們,我們將其稱為逗號表達(dá)式。這些賦值操作從左到右進(jìn)行,表達(dá)式的結(jié)果是最右側(cè)變量的值。例如:以上代碼為a、b、c連續(xù)賦值。逗號表達(dá)式“a
=
5,
b
=
10,
c
=
15”的值為15。關(guān)系運(yùn)算符關(guān)系運(yùn)算符用于在C語言中執(zhí)行不同值之間的比較操作,以確定它們之間的關(guān)系。這些運(yùn)算符返回一個布爾類型(bool)的值(true或false),表示比較的結(jié)果。在標(biāo)準(zhǔn)的C語言中,沒有直接的bool類型,但可以使用整數(shù)類型來模擬布爾值。其中0表示false,非零值表示true。關(guān)系運(yùn)算符C語言中常見的比較運(yùn)算符:(1)等于(==)運(yùn)算符:用于檢查兩個值是否相等。如果兩個值相等,它返回true;否則返回false。【例2.9】比較兩個整數(shù)是否相等#include
<stdio.h>
int
main(void)
{
int
a
=
5;
int
b
=
5;程序運(yùn)行結(jié)果如下:
int
c
=
10;
printf("a和b相等,
比較結(jié)果為%d\n",
a
==
b);
printf("a和c不相等,
比較結(jié)果為%d\n",
a
==
c);}關(guān)系運(yùn)算符(2)不等于(!=)運(yùn)算符:用于檢查兩個值是否不相等。如果兩個值不相等,它返回true;否則返回false。(3)大于(>)運(yùn)算符:用于檢查一個值是否大于另一個值。如果第一個值大于第二個值,它返回true;否則返回false。(4)小于(<)運(yùn)算符:用于檢查一個值是否小于另一個值。如果第一個值小于第二個值,它返回true;否則返回false。(5)大于等于(>=)運(yùn)算符:用于檢查一個值是否大于或等于另一個值。如果第一個值大于或等于第二個值,它返回true;否則返回false。(6)小于等于(<=)運(yùn)算符:用于檢查一個值是否小于或等于另一個值。如果第一個值小于或等于第二個值,它返回true;否則返回false。關(guān)系運(yùn)算符【例2.10】關(guān)系運(yùn)算符的使用:整數(shù)之間的大小比較#include
<stdio.h>
int
main(void)
{
int
a
=
5;
int
b
=
5;
int
c
=
10;printf("a和b相等,比較結(jié)果為%d\n",
a
!=
b);
printf("a和c不相等,
比較結(jié)果為%d\n",
a
!=
c);
printf("a和b相等,比較結(jié)果為%d\n",
a
>
b);
printf("c大于a,
比較結(jié)果為%d\n",
c
>
a);邏輯運(yùn)算符邏輯運(yùn)算符是C語言中用于處理布爾(Boolean)類型表達(dá)式的運(yùn)算符,它們允許你在條件語句和布爾邏輯中執(zhí)行復(fù)雜的操作。邏輯運(yùn)算符用于將一個或多個布爾表達(dá)式組合成更復(fù)雜的表達(dá)式,并返回一個布爾結(jié)果(true或false)。是C語言中常見的邏輯運(yùn)算符及其用法:(1)邏輯與運(yùn)算符(&&):當(dāng)且僅當(dāng)所有操作數(shù)都為真(true)時,邏輯與運(yùn)算返回真;否則返回假(false)。邏輯運(yùn)算符【例2.11】與運(yùn)算符(&&)的使用舉例#include
<stdio.h>
int
main(void)
{
int
a
=
5;
int
b
=
10;
printf("a和b都大于0,
比較結(jié)果為%d\n",
a
>
0
&&
b
>
0);
printf("a和b都小于0,
比較結(jié)果為%d\n",
a
<
0
&&
b
<
0);
printf("a大于0且b小于0,
比較結(jié)果為%d\n",
a
>
0
&&
b
<
0);}邏輯運(yùn)算符程序運(yùn)行結(jié)果如下:
a和b都大于0,比較結(jié)果為1a和b都小于0,比較結(jié)果為0a大于0且b小于0,比較結(jié)果為0在第5行代碼中,變量a和b都滿足大于0的條件,所以比較結(jié)果為true,輸出結(jié)果為1;第6行代碼中,與運(yùn)算符(&&)左邊表達(dá)式a<0比較結(jié)果為false,根據(jù)與運(yùn)算符(&&)的定義,直接判定整個表達(dá)式結(jié)果為false,輸出結(jié)果為0;第7行代碼中,與運(yùn)算符(&&)左邊表達(dá)式a>0比較結(jié)果為true滿足條件,右邊表達(dá)式b<0比較結(jié)果為false,根據(jù)與運(yùn)算符(&&)的定義,左右表達(dá)式?jīng)]有同時滿足都為true,所以最后結(jié)果為false,輸出值為0。邏輯運(yùn)算符(2)邏輯或運(yùn)算符(||):只要至少一個操作數(shù)為真(true),邏輯或運(yùn)算返回真;只有當(dāng)所有操作數(shù)都為假時,它才返回假(false)?!纠?.12】或運(yùn)算符(||)的使用舉例
程序運(yùn)行結(jié)果如下:#include
<stdio.h>
int
main(void)
{
int
a
=
5;
int
b
=
10;
printf("a大于0或b大于0,
比較結(jié)果為%d\n",
a
>
0
||
b
>
0);
printf("a小于0或b小于0,
比較結(jié)果為%d\n",
a
<
0
||
b
<
0);
printf("a大于0或b小于0,
比較結(jié)果為%d\n",
a
>
0
||
b
<
0);}
a大于0或b大于0,比較結(jié)果為1a小于0或b小于0,比較結(jié)果為0a大于0或b小于0,比較結(jié)果為1邏輯運(yùn)算符(3)邏輯非運(yùn)算符(!):用于反轉(zhuǎn)布爾表達(dá)式的值。如果操作數(shù)為真,邏輯非運(yùn)算返回假;如果操作數(shù)為假,它返回真?!纠?.13】非運(yùn)算符(?。┑氖褂门e例#include
<stdio.h>
int
main(void)
{
int
a
=
5;
int
b
=
10;
printf("a不大于0,
比較結(jié)果為%d\n",
!(a
>
0)
);
printf("a不大于b,
比較結(jié)果為%d\n",
!(a
>
b)
);}程序運(yùn)行結(jié)果:a大于0或b大于0,比較結(jié)果為1a小于0或b小于0,比較結(jié)果為0a大于0或b小于0,比較結(jié)果為1邏輯運(yùn)算符(4)邏輯運(yùn)算符的短路原則與運(yùn)算符&&和或運(yùn)算符||具有短路原則。短路原則是指在進(jìn)行邏輯運(yùn)算時,如果根據(jù)前面的表達(dá)
式已經(jīng)可以確定整個表達(dá)式的結(jié)果,那么后面的表達(dá)式將不再被計算。對于與運(yùn)算符&&:如果第一個操作數(shù)(左操作數(shù))為假(0),則整個表達(dá)式結(jié)果一定為假(0),此時不會計算第二個操作數(shù)(右操作數(shù))。只有當(dāng)?shù)谝粋€操作數(shù)為真(非零)時,才會繼續(xù)計算并返回第二個操作數(shù)的值作為整個表達(dá)式的結(jié)果。對于或運(yùn)算符||:如果第一個操作數(shù)(左操作數(shù))為真(非零),則整個表達(dá)式結(jié)果一定為真(非零),此時不會計算第二個操作數(shù)(右操作數(shù))。只有當(dāng)?shù)谝粋€操作數(shù)為假(0)時,才會繼續(xù)計算并返回第二個操作數(shù)的值作為整個表達(dá)式的結(jié)果。邏輯運(yùn)算符【例2.14】短路原則的使用舉例#include<stdio.h>
intmain(){intnum1=-1;intnum2=10;
//使用邏輯與運(yùn)算符(&&)展示短路原則if(num1>0&&num2++>5){printf("Bothconditionsaretrue.\n");}else{printf("Atleastoneconditionisfalse.\n");}printf("num2:%d\n",num2);//輸出num2的值
//使用邏輯或運(yùn)算符(||)展示短路原則if(num1<10||num2++>5){printf("Atleastoneconditionistrue.\n");}else{printf("Bothconditionsarefalse.\n");}printf("num2:%d\n",num2);//輸出num2的值return0;}
程序運(yùn)行結(jié)果為:Atleastoneconditionisfalse.num2:10Atleastoneconditionistrue.num2:10在這個程序中,我們聲明了2個整型變量num1和num2,并賦予它們初始值-1和10。接下來,我們使用邏輯與運(yùn)算符和邏輯或運(yùn)算符來展示短路原則。在第8行的條件語句中,我們首先檢查num1>0是否為真。由于num1的值為-1,它不大于0,因此該條件為假。根據(jù)短路原則,整個表達(dá)式的結(jié)果已經(jīng)確定為假,因此不會計算第二個條件num2++>5。程序?qū)⑦M(jìn)入else分支并輸出"Atleastoneconditionisfalse."。在第16行,我們輸出num2的值,它仍然是10。在第19行的條件語句中,我們首先檢查num1<10是否為真。由于num1的值為-1,它小于10,因此該條件為真。根據(jù)短路原則,整個表達(dá)式的結(jié)果已經(jīng)確定為真,因此不會計算第二個條件num2++>5。程序?qū)⑦M(jìn)入if分支并輸出"Atleastoneconditionistrue."。在第26行,我們輸出num2的值,它仍然是10。位運(yùn)算符位運(yùn)算符是C語言中用于直接操作二進(jìn)制位的運(yùn)算符。它們在低級別編程和處理底層硬件時非常有用,可以用于執(zhí)行位級別的操作,如位掩碼、位設(shè)置和位清除。與算術(shù)運(yùn)算符不同的是,位運(yùn)算符在計算時,是對數(shù)值的二進(jìn)制格式進(jìn)行運(yùn)算。以下是C語言中常見的位運(yùn)算符及其用法:(1)按位與運(yùn)算符(&):對兩個操作數(shù)的每個對應(yīng)位執(zhí)行邏輯與操作。只有兩個位都為1時,結(jié)果位才為1,否則為0。位運(yùn)算符【例2.15】按位與運(yùn)算符(&)的使用舉例。#include
<stdio.h>
int
main(void)
{
unsigned
int
a
=
5;
//
二進(jìn)制:0101
unsigned
int
b
=
3;
//
二進(jìn)制:0011
unsigned
int
result
=
a
&
b;
//
結(jié)果為
0001,即1
printf("result
=
%d\n",
result);}
程序運(yùn)行結(jié)果如下:result=1位運(yùn)算符(2)按位或運(yùn)算符(|):對兩個操作數(shù)的每個對應(yīng)位執(zhí)行邏輯或操作。只要兩個位中至少有一個為1,結(jié)果位就為1。【例2.16】按位或運(yùn)算符(|)的使用舉例#include
<stdio.h>
int
main(void)
{
unsigned
int
a
=
5;
//
二進(jìn)制:0101
unsigned
int
b
=
3;
//
二進(jìn)制:0011
unsigned
int
result
=
a
|
b;
//
結(jié)果為
0111,即7
printf("result
=
%d\n",
result);}
程序運(yùn)行結(jié)果為:result=7位運(yùn)算符(3)按位異或運(yùn)算符(^):對兩個操作數(shù)的每個對應(yīng)位執(zhí)行邏輯異或操作。如果兩個位不同,則結(jié)果位為1;如果兩個位相同,則結(jié)果位為0?!纠?.17】按位異或運(yùn)算符(^)的使用舉例。#include
<stdio.h>
int
main(void)
{
unsigned
int
a
=
5;
//
二進(jìn)制:0101
unsigned
int
b
=
3;
//
二進(jìn)制:0011
unsigned
int
result
=
a
^
b;
//
結(jié)果為
0110,即6
printf("result
=
%d\n",
result);}
程序運(yùn)行結(jié)果如下:result=6位運(yùn)算符(4)按位取反運(yùn)算符(~):對操作數(shù)的每個位執(zhí)行邏輯取反操作,將1變?yōu)?,0變?yōu)??!纠?.18】按位取反運(yùn)算符(~)的使用舉例#include
<stdio.h>
int
main(void)
{
int
a
=
5;
//
二進(jìn)制:0000
0101
int
result
=
~a;
//
結(jié)果為
1111
1010,即-6
printf("result
=
%d\n",
result);}程序運(yùn)行結(jié)果為:result=-6位運(yùn)算符(5)左移運(yùn)算符(<<):將操作數(shù)的所有位向左移動指定的位數(shù)。在左側(cè)添加零,右側(cè)丟棄超出指定位數(shù)的位?!纠?.19】左移運(yùn)算符(<<)的使用舉例#include
<stdio.h>
int
main(void)
{
unsigned
int
a
=
5;
//
二進(jìn)制:0101
unsigned
int
result
=
a
<<
2;
//
結(jié)果為
010100,即20
printf("result
=
%d\n",
result);}
程序運(yùn)行結(jié)果為:result=20位運(yùn)算符(6)右移運(yùn)算符(>>):將操作數(shù)的所有位向右移動指定的位數(shù)。在右側(cè)添加零(對于無符號數(shù)),或者添加符號位(對于有符號數(shù)),左側(cè)丟棄超出指定位數(shù)的位。【例2.20】右移運(yùn)算符(>>)的使用舉例。#include
<stdio.h>
int
main(void)
{
unsigned
int
a
=
16;
//
二進(jìn)制:00010000
unsigned
int
result
=
a
>>
2;
//
結(jié)果為
00000100,即4
printf("result
=
%d\n",
result);}
程序運(yùn)行結(jié)果為:result=4復(fù)合運(yùn)算復(fù)合運(yùn)算符描述示例+=加法賦值運(yùn)算符,將右側(cè)值加到左側(cè)變量并賦值a+=5;將a增加5。-=減法賦值運(yùn)算符,將右側(cè)值從左側(cè)變量減去并賦值b-=3;將b減去3。*=乘法賦值運(yùn)算符,將左側(cè)變量與右側(cè)值相乘并賦值c*=2;將c乘以2。/=除法賦值運(yùn)算符,將左側(cè)變量除以右側(cè)值并賦值d/=4;將d除以4。%=取模賦值運(yùn)算符,將左側(cè)變量模右側(cè)值并賦值e%=7;將e取模7。&=按位與賦值運(yùn)算符,將左側(cè)變量與右側(cè)值按位與并賦值f&=0x0F;將f的低四位保留,其他位清零。|=按位或賦值運(yùn)算符,將左側(cè)變量與右側(cè)值按位或并賦值`g^=按位異或賦值運(yùn)算符,將左側(cè)變量與右側(cè)值按位異或并賦值h^=0x10;將h的某位翻轉(zhuǎn)。<<=左移賦值運(yùn)算符,將左側(cè)變量左移右側(cè)值指定的位數(shù)并賦值i<<=2;將i向左移動2位。>>=右移賦值運(yùn)算符,將左側(cè)變量右移右側(cè)值指定的位數(shù)并賦值j>>=3;將j向右移動3位。表2.8復(fù)合運(yùn)算符運(yùn)算的優(yōu)先級優(yōu)先級運(yùn)算符名稱或含義使用形式結(jié)合方向說明1()圓括號(表達(dá)式)/函數(shù)名(形參表)
--2-負(fù)號運(yùn)算符-表達(dá)式右到左單目運(yùn)算符~按位取反運(yùn)算符~表達(dá)式++自增運(yùn)算符++變量名/變量名++--自減運(yùn)算符--變量名/變量名--&取地址運(yùn)算符&變量名!邏輯非運(yùn)算符!表達(dá)式(類型)強(qiáng)制類型轉(zhuǎn)換(數(shù)據(jù)類型)表達(dá)式--3/除表達(dá)式/表達(dá)式左到右雙目運(yùn)算符*乘表達(dá)式*表達(dá)式%余數(shù)(取模)整型表達(dá)式%整型表達(dá)式4+加表達(dá)式+表達(dá)式左到右雙目運(yùn)算符-減表達(dá)式-表達(dá)式5<<左移變量<<表達(dá)式左到右雙目運(yùn)算符>>右移變量>>表達(dá)式6>大于表達(dá)式>表達(dá)式左到右雙目運(yùn)算符>=大于等于表達(dá)式>=表達(dá)式<小于表達(dá)式<表達(dá)式<=小于等于表達(dá)式<=表達(dá)式7==等于表達(dá)式==表達(dá)式左到右雙目運(yùn)算符!=不等于表達(dá)式!=表達(dá)式運(yùn)算的優(yōu)先級8&按位與表達(dá)式&表達(dá)式左到右雙目運(yùn)算符9^按位異或表達(dá)式^表達(dá)式左到右雙目運(yùn)算符10|按位或表達(dá)式|表達(dá)式左到右雙目運(yùn)算符11&&邏輯與表達(dá)式&&表達(dá)式左到右雙目運(yùn)算符12||邏輯或表達(dá)式||表達(dá)式左到右雙目運(yùn)算符14=賦值運(yùn)算符變量=表達(dá)式右到左--/=除后賦值變量/=表達(dá)式--*=乘后賦值變量*=表達(dá)式--%=取模后賦值變量%=表達(dá)式--+=加后賦值變量+=表達(dá)式---=減后賦值變量-=表達(dá)式--<<=左移后賦值變量<<=表達(dá)式-->>=右移后賦值變量>>=表達(dá)式--&=按位與后賦值變量&=表達(dá)式--^=按位異或后賦值變量^=表達(dá)式--|=按位或后賦值變量|=表達(dá)式--15,逗號運(yùn)算符表達(dá)式,表達(dá)式,…左到右--運(yùn)算的優(yōu)先級【例2.21】運(yùn)算符的優(yōu)先級別。1#include
<stdio.h>
2int
main(void)
{3
inta=5,b=10,c=15;4intresult;5result=a+b>c&&b-a==c||a*b<c;
6printf("結(jié)果:%d\n",result);7}根據(jù)邏輯運(yùn)算符的優(yōu)先級,邏輯與運(yùn)算符&&的優(yōu)先級高于邏輯或運(yùn)算符||。由于邏輯與運(yùn)算符的操作數(shù)中有一個為假,整個表達(dá)式的結(jié)果將為假。運(yùn)行結(jié)果如下:result=0輸入與輸出在C語言中,輸入和輸出是與用戶交互和顯示結(jié)果的重要部分。通過合適的輸入和輸出操作,我們可以讀取用戶輸入的數(shù)據(jù),進(jìn)行計算和處理,并將結(jié)果輸出給用戶。scanf函數(shù)和printf函數(shù)是C語言編程中使用最頻繁的兩個函數(shù),它們用來格式化輸入和輸出。正如我們前面學(xué)習(xí)到的事例代碼,我們可以通過printf函數(shù)在控制臺中打印某些文字內(nèi)容和變量的值。scanf函數(shù)則可以接收一個來自控制臺輸入的值,作為代碼中某個變量的值。雖然這兩個函數(shù)功能很簡單,并且很強(qiáng)大,但想要學(xué)習(xí)好它們卻不容易。本小節(jié)我們將對printf函數(shù)和scanf函數(shù)做一些簡單的介紹,熟練的使用輸入輸出函數(shù)還需要大量的編程實(shí)踐。printf函數(shù)printf是“printformatted”的縮寫,它用于將結(jié)構(gòu)化的數(shù)據(jù)輸出到控制臺上,該函數(shù)原型在標(biāo)準(zhǔn)頭文件’<stdio.h>’中,所以在代碼中如果要使用printf函數(shù),需提前進(jìn)行聲明。printf函數(shù)使用格式化字符串作為第一個參數(shù),并根據(jù)格式化字符串中的占位符和后續(xù)參數(shù)的值進(jìn)行格式化輸出。printf(格式串,表達(dá)式1,表達(dá)式2,....);其中表達(dá)式可以是常量、變量或是一些更加復(fù)雜的表達(dá)式。以例2.1為例,第7行代碼:其中"num1
+
num2
=
%d\n"代表的是格式串,"num1
+
num2"代表的是表達(dá)式。printf("num1
+
num2
=
%d\n",
num1
+
num2);printf函數(shù)【例2.22】格式轉(zhuǎn)換的例子。int
num1,
num2;
float
num3,
num4;
num1
=
10;
num2
=
65;
num3
=
3.1415;
num4
=
-6.524f;
printf("num1
=
%d,
num2
=
%d,
num3
=
%f,
num4
=
%f\n",
num1,
num2,
num3,
num4);運(yùn)行結(jié)果如下:num1=10,num2=65,num3=3.141500,num4=-6.524000printf函數(shù)需要注意的是,作為初學(xué)者在學(xué)習(xí)printf函數(shù)時,會經(jīng)常犯如下幾點(diǎn)錯誤:(1)轉(zhuǎn)換說明和表達(dá)式數(shù)量不匹配。不幸的是,如果代碼中出現(xiàn)這樣的錯誤,編譯器并不會提示錯誤,只會進(jìn)行警告,代碼還是能正常的編譯。例如:表達(dá)式多于轉(zhuǎn)換說明:printf("num1=%d\n",num1,num2);/**WRONG**/實(shí)際的輸出結(jié)果只有num1的值,運(yùn)行結(jié)果為10又如:轉(zhuǎn)換說明多于表達(dá)式:printf("num1
=
%d
num2
=
%d\n",
num1);/**WRONG**/實(shí)際的輸出結(jié)果只有num1是一個正確值,而num2賦予了一個隨機(jī)值,對于我們來說是無意義的,運(yùn)行結(jié)果:num1=10num2=12853072printf函數(shù)(2)表達(dá)式數(shù)據(jù)類型與占位符%數(shù)據(jù)類型不匹配。C語言編譯器不檢測轉(zhuǎn)換說明是否適合要顯示項的數(shù)據(jù)類型。如果程序員使用不正確的轉(zhuǎn)換說明,程序?qū)唵蔚禺a(chǎn)生無意義的輸出。思考下面的printf函數(shù)調(diào)用,其中int型變量num1和float型變量num3的順序放置錯誤:printf("num1=%f
num3=%d\n",num1,num3);/**WRONG**/運(yùn)行結(jié)果:num1=0.000000num3=-1073741824printf函數(shù)除了前面例子中的%d、%f,print函數(shù)通過轉(zhuǎn)換說明符(specifier)給程序員提供了非常豐富且靈活的輸出格式控制方法。以下是常見的幾個轉(zhuǎn)換說明符所代表的含義:d-----表示十進(jìn)制(基數(shù)為10)形式的整數(shù)。f-----表示“定點(diǎn)十進(jìn)制”形式的浮點(diǎn)數(shù)。e-----表示指數(shù)(科學(xué)記數(shù)法)形式的浮點(diǎn)數(shù)。c-----表示輸出字符。s-----表示輸出字符串g-----。printf函數(shù)我們在使用printf函數(shù)進(jìn)行程序內(nèi)容輸出時,輸出內(nèi)容的格式,數(shù)值的寬度和精度控制也是printf函數(shù)格式化輸出的重要部分。它們允許你指定輸出字段的格式,寬度和小數(shù)點(diǎn)后的精度,以便更好地控制輸出的外觀?!纠?.23】數(shù)值的寬度、精度控制的例子#include
<stdio.h>
int
main(void)
{
int
i;
float
x;
i
=
36;
x
=
314.1592f;
printf("|%d|%4d|%-4d|%5.3d|\n",
i,
i,
i,
i);
printf("|%8.3f|%-8.3f|%10.3e|\n",
x,
x,
x);
return
0;
}運(yùn)行結(jié)果如下:|36|36|36|036||314.159|314.159|3.142e+002|printf函數(shù)在輸出時,printf函數(shù)格式串中的字符|只是用來幫助顯示每個數(shù)所占用的空格數(shù)量;下面詳細(xì)介紹一下例2.23中的輸出格式:%d——以十進(jìn)制形式顯示變量i;%4d——以十進(jìn)制形式顯示變量i,且輸出至少占用4個字符的空間,由于i的值為36,只包含2個字符,所以輸出時在左側(cè)(4為正數(shù))添加了2個空格進(jìn)行占位,即右對齊;%-4d——其含義類似%4d,但輸出的對齊方式是左對齊(-4為負(fù)數(shù));%5.3d——以十進(jìn)制形式顯示變量i,至少占用5個字符的空間且保留3位數(shù)字。因?yàn)樽兞縤只有2個字符,所以要添加一個額外的零來保證有3位數(shù)字。添加0后即036包含3個字符,因此還要在左側(cè)添加2個空格(5為正數(shù)),即右對齊;%8.3f——以定點(diǎn)十進(jìn)制形式顯示變量x,且至少占用8個字符空間,其中小數(shù)點(diǎn)后保留3位數(shù)字。因?yàn)樽兞縳只需要7個字符(即小數(shù)點(diǎn)前3位,小數(shù)點(diǎn)后3位,再加上小數(shù)點(diǎn)本身1位),所以在變量左面有1個空格(8為正數(shù))。%-8.3f——含義類似%8.3f,但因-8為負(fù)數(shù),所以采用左對齊%10.3e——以指數(shù)形式顯示變量x,應(yīng)占用10個字符的空間,其中小數(shù)點(diǎn)后保留3位數(shù)字。printf函數(shù)在前面的printf案例中,我們會經(jīng)常看到”\n”這樣的字符,其作用是在輸出”\n”出現(xiàn)的位置進(jìn)行換行操作,一般將這種格式的代碼稱為轉(zhuǎn)義字符。轉(zhuǎn)義字符是一種特殊的字符序列,用于表示一些不可打印字符或具有特殊意義的字符。這些字符通常以反斜杠符號(\)開頭,后面跟著一個字符,組成一個轉(zhuǎn)義序列。轉(zhuǎn)義字符的目的是允許你在字符串中插入那些本來無法直接輸入的字符,或者表示一些特殊的控制行為。以下是一些常見的轉(zhuǎn)義字符以及它們的含義:\n:換行符。它用于在字符串中創(chuàng)建一個新的行(換行)。\t:制表符。它用于在字符串中插入一個水平制表符(Tab)。\":雙引號。用于在雙引號括起的字符串中插入雙引號,以避免與字符串的起始或結(jié)束沖突。\':單引號。類似于雙引號,但用于在單引號括起的字符串中插入單引號。\\:反斜杠符號自身。用于在字符串中插入一個反斜杠符號。printf函數(shù)【例2.24】轉(zhuǎn)義字符。1
#include
<stdio.h>
2
int
main(void)
{
3
printf("\"Hello\tWorld!\"\tI\tlove\t\nC\t\'program\'");4
return
0;
5
}
運(yùn)行結(jié)果如下:"HelloWorld!"IloveC'program'scanf函數(shù)scanf是C語言標(biāo)準(zhǔn)庫中的一個輸入函數(shù),它用于從標(biāo)準(zhǔn)輸入設(shè)備(通常是鍵盤)或其他輸入流中讀取數(shù)據(jù)并將其存儲到指定的變量中。scanf函數(shù)是根據(jù)格式化字符串中的格式說明符進(jìn)行讀取的。與printf函數(shù)類似,scanf函數(shù)的格式串也包含普通字符和轉(zhuǎn)換說明兩部分。scanf函數(shù)轉(zhuǎn)換說明的用法和printf函數(shù)本質(zhì)上是一樣的。scanf函數(shù)【例2.25】scanf函數(shù)的簡單使用。#include
<stdio.h>
int
main(void)
{
int
a,b;
float
c,d;
scanf("%d%d%f%f",
&a,&b,&c,&d);
printf("a=%d\tb=%d\nc=%.2f\td=%.3f\n",
a,
b,
c,
d);
return
0;
}scanf函數(shù)運(yùn)行程序,按以下格式輸入:12-3212.3-3.12程序運(yùn)行結(jié)果結(jié)果:a=12b=-32c=12.30d=-3.120從輸出結(jié)果來看,scanf函數(shù)將輸入數(shù)據(jù)”12-3212.3-3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- W國內(nèi)本地商業(yè)龍頭競爭擾動不改長期價值
- 2026年工業(yè)設(shè)備維護(hù)與保養(yǎng)知識測試題庫
- 未來五年金融資產(chǎn)管理服務(wù)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 未來五年新形勢下冬蟲夏草類飲片行業(yè)順勢崛起戰(zhàn)略制定與實(shí)施分析研究報告
- 未來五年干炸羊肉制品企業(yè)ESG實(shí)踐與創(chuàng)新戰(zhàn)略分析研究報告
- 未來五年新興軟件和新型信息技術(shù)服務(wù)企業(yè)ESG實(shí)踐與創(chuàng)新戰(zhàn)略分析研究報告
- 未來五年運(yùn)動場地草坪維護(hù)服務(wù)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報告
- 學(xué)習(xí)環(huán)境保護(hù)教育心得體會范文
- 房地產(chǎn)物業(yè)租賃合同模板及解讀
- 制造企業(yè)安全環(huán)保管理手冊
- (新版?。笆逦濉鄙鷳B(tài)環(huán)境保護(hù)規(guī)劃
- 教培行業(yè)年終述職
- 2025中國西電集團(tuán)有限公司招聘(35人)筆試備考試題附答案
- 海內(nèi)外云廠商發(fā)展與現(xiàn)狀(三):資本開支壓力與海外云廠需求情況拆解-國信證券
- 基于小動物影像學(xué)探究電針百會、神庭穴改善缺血再灌注大鼠學(xué)習(xí)記憶的機(jī)制研究
- 2025年航運(yùn)行業(yè)航運(yùn)業(yè)數(shù)字化轉(zhuǎn)型與智能航運(yùn)發(fā)展研究報告及未來發(fā)展趨勢預(yù)測
- 安全生產(chǎn)責(zé)任保險技術(shù)服務(wù)方案
- 2025年中國N-甲基嗎啉氧化物行業(yè)市場分析及投資價值評估前景預(yù)測報告
- 地質(zhì)鉆機(jī)安全培訓(xùn)課件
- 隧道爐安全操作培訓(xùn)課件
- 拆除爆破施工方案
評論
0/150
提交評論