Linux環(huán)境編程4Linux C語言編程基礎課件_第1頁
Linux環(huán)境編程4Linux C語言編程基礎課件_第2頁
Linux環(huán)境編程4Linux C語言編程基礎課件_第3頁
Linux環(huán)境編程4Linux C語言編程基礎課件_第4頁
Linux環(huán)境編程4Linux C語言編程基礎課件_第5頁
已閱讀5頁,還剩127頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章LinuxC語言編程基礎1第4章LinuxC語言編程基礎1Linux環(huán)境編程4LinuxC語言編程基礎課件Linux環(huán)境編程4LinuxC語言編程基礎課件第一個C程序編譯選項-E 僅進行預處理,不進行其他操作。助于發(fā)現(xiàn)宏錯誤。-S 編譯到匯編語言,不進行其他操作。-c 編譯、匯編到目標代碼,不進行鏈接-Wall 盡可能多地顯示警告信息。-Werror 將所有的警告當作錯誤處理。-g 在可執(zhí)行文件中包含標準調試信息。-I 設置頭文件的路徑,可以設置多個,默認路徑“/usr/include”。-L 設置庫文件的路徑,可以設置多個,默認路徑“/usr/lib”。-l 設定編譯所需的庫名稱,如果一個庫的文件名為“l(fā)ibxxx.so”那么 它的庫名稱為“xxx”。jianglinmei@ubuntu:~/c$gcc-op.c-Efirst.cjianglinmei@ubuntu:~/c$catp.c#1"first.c"#1"<built-in>"#1"<command-line>"#1"first.c"#1"/usr/include/stdio.h"134…externvoidfunlockfile(FILE*__stream)__attribute__((__nothrow__));#936"/usr/include/stdio.h"34#2"first.c"2intmain(void){printf("Helloworld!\n");}jianglinmei@ubuntu:~/c$gcc-Sfirst.cjianglinmei@ubuntu:~/c$catfirst.s.file"first.c".section.rodata.LC0:.string"Helloworld!".text.globlmain.typemain,@functionmain:…….LFE0:.sizemain,.-main.ident"GCC:(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1".section.note.GNU-stack,"",@progbitsjianglinmei@ubuntu:~/c$gcc-cfirst.cjianglinmei@ubuntu:~/c$ls-lfirst.o-rw-rw-r--1jianglinmeijianglinmei102810月123:47first.ojianglinmei@ubuntu:~/c$gcc-Wall-ofirstfirst.cfirst.c:Infunction‘main’:first.c:6:1:warning:controlreachesendofnon-voidfunction[-Wreturn-type]jianglinmei@ubuntu:~/c$rmfirstjianglinmei@ubuntu:~/c$ls1.txtfirst.cfirst.ofirst.sp.cjianglinmei@ubuntu:~/c$gcc-Werror-Wall-ofirstfirst.cfirst.c:Infunction‘main’:first.c:6:1:error:controlreachesendofnon-voidfunction[-Werror=return-type]cc1:allwarningsbeingtreatedaserrorsjianglinmei@ubuntu:~/c$ls1.txtfirst.cfirst.ofirst.sp.cjianglinmei@ubuntu:~/c$llfirst-rwxrwxr-x1jianglinmeijianglinmei71592013-04-1708:58first*jianglinmei@ubuntu:~/c$gcc-g-ofirstfirst.cjianglinmei@ubuntu:~/c$llfirst-rwxrwxr-x1jianglinmeijianglinmei80432013-04-1709:03first*jianglinmei@ubuntu:~$gcc-I/usr/include/gtk-2.0/-c-otest.otest.cjianglinmei@ubuntu:~$gcc-L/usr/lib/i386-linux-gnu/-lX11-otesttest.c4.1gcc編譯器4第一個C程序jianglinmei@ubuntu:~/c$選項含義--help顯示命令幫助說明--version顯示編譯器版本信息-o<文件>指定輸出文件名,缺省設置為“a.out”。-DMACRO定義宏MACRO。-E僅進行預處理,不進行其他操作。-S編譯到匯編語言,不進行其他操作。-c編譯、匯編到目標代碼,不進行鏈接-g在可執(zhí)行文件中包含標準調試信息。-Wall盡可能多地顯示警告信息。-Werror將所有的警告當作錯誤處理。-w禁止所有警告。-ansi采用標準的ANSIC進行編譯。-llibrary設定編譯所需的庫名稱,如果一個庫的文件名為“l(fā)ibxxx.so”那么它的庫名稱為“xxx”。-Ipath設置頭文件的路徑,可以設置多個,默認路徑“/usr/include”。-Lpath設置庫文件的路徑,可以設置多個,默認路徑“/usr/lib”。-static使用靜態(tài)鏈接,編譯后可執(zhí)行程序不依賴于庫文件。-ON優(yōu)化編譯,主要提高可執(zhí)行程序得運行速度,N可取值為1、2、3。-Q顯示各個階段的執(zhí)行時間。4.1gcc編譯器5選項含義--help顯示命令幫助說明--version顯示編4.2EclipseCDT安裝和啟動在Unbutu12.04環(huán)境下的安裝方法jianglinmei@ubuntu:~$sudoapt-getupdatejianglinmei@ubuntu:~$sudoapt-getupgradejianglinmei@ubuntu:~$sudoapt-getinstalleclipse-cdt啟動64.2EclipseCDT安裝和啟動jianglinme4.2EclipseCDT安裝和啟動啟動初次啟動時會要求用戶設置工作空間(workspace)的位置。工作空間是Eclipse中軟件項目的所有文件所存放的目錄,工作空間同時也是Eclipse進行資源管理的一個環(huán)境。74.2EclipseCDT安裝和啟動啟動74.2EclipseCDT安裝和啟動啟動主界面包含4個窗格。84.2EclipseCDT安裝和啟動84.2EclipseCDT創(chuàng)建項目并運行File->New->Project…94.2EclipseCDT創(chuàng)建項目并運行94.2EclipseCDT創(chuàng)建項目并運行項目設置104.2EclipseCDT創(chuàng)建項目并運行104.2EclipseCDT創(chuàng)建項目并運行114.2EclipseCDT創(chuàng)建項目并運行114.2EclipseCDT創(chuàng)建項目并運行給項目添加源程序文件。File->New->SourceFile124.2EclipseCDT創(chuàng)建項目并運行124.2EclipseCDT創(chuàng)建項目并運行源代碼編輯器中編寫代碼134.2EclipseCDT創(chuàng)建項目并運行134.2EclipseCDT創(chuàng)建項目并運行Build()144.2EclipseCDT創(chuàng)建項目并運行144.2EclipseCDT創(chuàng)建項目并運行在IDE中運行()在終端上運行jianglinmei@ubuntu:~$cdworkspace/HelloWorld/Debug/jianglinmei@ubuntu:~/workspace/HelloWorld/Debug$lsHelloWorldhw.dhw.omakefileobjects.mksources.mksubdir.mkjianglinmei@ubuntu:~/workspace/HelloWorld/Debug$./HelloWorldHelloworld!154.2EclipseCDT創(chuàng)建項目并運行在終端上運行ji4.2EclipseCDT程序調試基本調試方法斷點單步查看變量調用棧查看內存查看寄存器反匯編顯示行號Window->PreferencesGeneral->Editors->TextEditors164.2EclipseCDT程序調試顯示行號164.2EclipseCDT程序調試編輯hw.c#include<stdio.h>voidpr(){ printf("Helloworld!\n");}intsum(inta,intb){ intc=a+b; returnc;}intmain(){ ints; pr(); s=sum(2,5); printf("Thesumof2and5is:%d",s); return0;}運行設置斷點調試()單步(F6)繼續(xù)運行(F8)174.2EclipseCDT程序調試#include<s4.3C語言基礎C語言概述既可以編寫系統(tǒng)軟件,也可以編寫應用軟件。DennisMRitchie為開發(fā)UNIX操作系統(tǒng)的方便而設計出來的。大多數(shù)操作系統(tǒng)的內核的大部分內容都是用C語言編寫的。優(yōu)點語言簡潔、緊湊、靈活(32個關鍵字,9種控制語句)。運算符豐富(34種),表達式類型多樣、靈活、簡練。數(shù)據(jù)結構豐富、合理,能夠方便地實現(xiàn)鏈表、樹、棧、隊列和圖等各種復雜的結構。具有結構化的控制語句,符合現(xiàn)代編程風格。兼有高級語言和低級語言的特點。可移植性好。目標代碼質量高,程序執(zhí)行效率高。語法限制不太嚴格,程序設計自由度大。184.3C語言基礎C語言概述184.3C語言基礎數(shù)據(jù)類型“數(shù)據(jù)結構+算法=程序”(NiklausWirth)數(shù)據(jù)類型決定了數(shù)據(jù)可參與的運算、所表示的數(shù)的范圍和所占用的內存大小。數(shù)據(jù)類型所占用的內存大小因平臺而異(以32位Linux為例)。194.3C語言基礎數(shù)據(jù)類型194.3C語言基礎數(shù)據(jù)類型常量與變量在程序運行過程中,其值不可改變的量稱為常量;反之,其值可以改變的量稱為變量。常量可分為直接常量和符號常量。直接常量從其字面形式即可判別,如2、1.23456、’A’等。符號常量用一個標識符來代表一個固定不變的量,其優(yōu)點是使得的程序的可讀性更好。符號常量定義:#define常量名 常量值例:#definePI3.1415926變量定義:數(shù)據(jù)類型 變量名inta; /*定義整型變量a*/floatb; /*定義浮點型變量b*/變量應“先定義,后使用”。204.3C語言基礎數(shù)據(jù)類型204.3C語言基礎數(shù)據(jù)類型整型可細分為基本型(int)、短整型(short)、長整型(long)和無符號型?;拘驼?個字節(jié)、短整型占2個字節(jié)、長整型占8個字節(jié);它們各有對應的無符號型:unsignedint、unsignedshort和unsignedlong。無符號型數(shù)據(jù)的最高位不用作符號位。整型常量三種表示形式十進制整數(shù)。由數(shù)字0~9和正負號表示,如:123,-456,0。八進制整數(shù)。由數(shù)字0開頭,后跟數(shù)字0~7表示,如:0123,011。十六進制整數(shù)。由0x或0X開頭,后跟0~9,a~f,A~F表示,如:0x123,0Xff。整型常量默認為int型。若其值所在范圍確定超出了int的表示范圍,則其類型為long型。如:123是int型,0x123456789是long型。也可以在整常量后加上字母l或L,指明它是long型,如:1234L。214.3C語言基礎數(shù)據(jù)類型214.3C語言基礎數(shù)據(jù)類型整型整型變量定義:整型數(shù)據(jù)類型變量名整型數(shù)據(jù)為類型可以為:int、long、short。并且可以在這三個關鍵字前加上關鍵字signed和unsigned指明是有符號還是無符號。默認為有符號整型。例:intx,y; /*定義x,y為整型變量*/unsignedshortm,n;/*定義m,n為無符號短整型變量*/longa; /*定義a為長整型變量*/224.3C語言基礎數(shù)據(jù)類型224.3C語言基礎數(shù)據(jù)類型浮點型可分為單精度浮點型(float)和雙精度浮點型(double)。單精度浮點型占4個字節(jié)和雙精度浮點型占8個字節(jié)。浮點型常量兩種表示形式十進制整數(shù)。由整數(shù)部分、小數(shù)點和小數(shù)部分組成,如:1.24、0.345、.222、234.0、333.、0.0等。指數(shù)形式。形如<實數(shù)部分>e<指數(shù)部分>,如:1.23E2、314.15E-2、0E3等。E之后的整數(shù)表示的是10的幾次方。浮點型常量默認為double型,可以在浮點型常量后加上字母f或F,指明它是float型,如:1.234F。浮點型變量定義:double變量名 或float變量名例:doublex,y;/*定義x,y為雙精度浮點型變量*/floatm,n;/*定義m,n為單精度浮點型變量*/234.3C語言基礎數(shù)據(jù)類型234.3C語言基礎數(shù)據(jù)類型字符型可分為char和unsignedchar兩種,均占1個字節(jié)。字符型數(shù)據(jù)可視為一個整數(shù)。字符型常量用單引號括起來的單個普通字符或轉義字符。普通字符如:’A’、’a’、’8’等,轉義字符以反斜線(’\’)后面跟一個字符或一個代碼值表示。轉義字符含義轉義字符含義\n換行\(zhòng)t水平制表符\v垂直制表符\b退格\r回車\f走紙換頁\a響鈴\\反斜線\’單引號\”雙引號\ddd3位8進制數(shù)ddd代表的字符\xhh2位16進制數(shù)hh代表的字符244.3C語言基礎數(shù)據(jù)類型轉義字符含義轉義字符含義\n換行\(zhòng)4.3C語言基礎數(shù)據(jù)類型字符型字符串常量用雙引號括起來的字符序列,如:”abcd”。序列末尾隱含了一個空字符’\0’(ASCII值為0)。故,字符串”a”實際包含了兩個字符’a’和’\0’,占用兩個字節(jié)。字符型變量定義:char變量名例:chard;/*定義d為字符型變量*/程序示例254.3C語言基礎數(shù)據(jù)類型254.3C語言基礎數(shù)據(jù)類型字符型程序示例Program4-4:ex_char.c1#include<stdio.h>23intmain()4{5charc1,c2;67c1=65;8c2='a';910/*printf()是一個標準庫函數(shù),用以格式化輸出數(shù)據(jù)*/11/*其中的%d表示以十進制數(shù)值的形式輸出變量值,*/12/*%c表示以字符形式輸出變量值*/13printf("0101\tC1\tC1-ASCII\n");/*\t為轉義字符*/14printf("\101\t%c\t%d\n",c1,c1);/*\101為以八進制表示的轉義字符’A’*/15printf("0X61\tC2\tC2-ASCII\n");16printf("\x61\t%c\t%d\n",c2,c2);/*\x61為以十六進制表示的轉義字符’a’*/1718return0;19}jianglinmei@ubuntu:~/c$gcc-oex_charex_char.cjianglinmei@ubuntu:~/c$./ex_char0101 C1 C1-ASCIIA A 650X61 C2 C2-ASCIIa a 97264.3C語言基礎數(shù)據(jù)類型Program4-4:ex_c4.3C語言基礎數(shù)據(jù)類型布爾型布爾型只有“真”和“假”兩個值,C語言使用整數(shù)1表示“真”,使用整數(shù)0表示“假”。在進行邏輯判斷時,C語言將任何非零值都認為是“真”,而將零值認為是“假”。例:printf("%d\n",3>2);/*結果為1*/printf("%d\n",3>2>1);/*結果為0*/printf("%d\n",3&&2);/*結果為1*/printf("%d\n",3&&0);/*結果為0*/274.3C語言基礎數(shù)據(jù)類型274.3C語言基礎數(shù)據(jù)類型枚舉型枚舉類型變量的取值范圍只限于所列舉出來的值。使用enum關鍵字定義:例:enumweek{sun,mon,tue,wed,thu,fri,sat};說明花括號中以逗號分隔的標識符稱為枚舉元素,枚舉元素也稱枚舉常量,具有固定的整數(shù)值。右花括號后的“;”是必不可少的語法組成部分。默認情況下,第一個枚舉元素的值為0,其它枚舉元素的值是其前一個元素的值加1后得到的值。也可以在枚舉元素后用“=”為其指定一個值,例如:enumweek{mon=1,tue,wed,thu,fri,sat,sun=0};定義枚舉變量如: enumweekweekday;使用枚舉變量如: weekday=wed;284.3C語言基礎數(shù)據(jù)類型284.3C語言基礎數(shù)據(jù)類型數(shù)組由n(n≥1)個具有相同數(shù)據(jù)類型的數(shù)據(jù)元素a0、a1、…、an-1構成的一個有序序列(集合)。標記數(shù)組元素的下標個數(shù)決定了數(shù)組的維數(shù)。數(shù)組的所有元素存儲在一塊地址連續(xù)的內存單元中,最低地址對應首元素,最高地址對應末元素。一維數(shù)組定義:數(shù)據(jù)類型數(shù)組名[整型常量表達式];如:inta[5];初始化:用一對花括號括起以逗號分隔的元素。如:inta[5]={0,1,2,3,4};如果花括號中值的個數(shù)少于數(shù)組的長度(部分初始化),則后面無對應值的元素的初值為一個隨機數(shù),但如果是靜態(tài)數(shù)組,則后面無對應值的元素的初值為0。如:staticinta[5]={0,1,2};294.3C語言基礎數(shù)據(jù)類型294.3C語言基礎數(shù)據(jù)類型數(shù)組一維數(shù)組引用:只能逐個引用數(shù)組元素,而不能一次引用數(shù)組的所有元素。staticinta[3]={7,8,9};/*輸出a[0]=7a[1]=8a[2]=9*/printf("a[0]=%da[1]=%da[2]=%d\n",a[0],a[1],a[2]);printf("a=%d\n",a); /*錯誤*/304.3C語言基礎數(shù)據(jù)類型staticinta[3]=4.3C語言基礎數(shù)據(jù)類型數(shù)組二維數(shù)組定義:數(shù)據(jù)類型數(shù)組名[整型常量表達式][整型常量表達式];如:inta[2][3];初始化:使用兩層花括號括起以逗號分隔的元素,內層的每對花括號對應一行。如:inta[2][3]={{0,1},{2,3},{4,5}};也可以只用一對花括號為二維數(shù)組賦初值,按元素的排列順序(行序優(yōu)先)依次為各元素賦初值。二維數(shù)組也可以部分初始化。如:inta[2][3]={0,1,2,3};引用只能逐個引用二維數(shù)組的各個元素staticinta[1][2]={6,7};/*輸出a[0][0]=6a[0][1]=7*/printf("a[0][0]=%da[0][1]=%d\n",a[0][0],a[0][1]);314.3C語言基礎數(shù)據(jù)類型staticinta[1][4.3C語言基礎數(shù)據(jù)類型數(shù)組字符數(shù)組定義:char數(shù)組名[整型常量表達式];如:charstr[5];初始化:逐個初始化,如:charstr[5]={'H','e','l','l','o'};用字符串常量為字符數(shù)組初始化,如:charstr[6]="Hello";引用可以逐個引用字符數(shù)組的各個元素,也可以以字符串的形式一次引用字符數(shù)組的所有元素。charstr[3]={'H','i','\0'};printf("str=%c%c\n",str[0],str[1]);/*輸出str=Hi*/printf("str=%s\n",str); /*輸出str=Hi*/324.3C語言基礎數(shù)據(jù)類型charstr[3]={'H4.3C語言基礎數(shù)據(jù)類型指針一個變量在內存中的地址就稱為該變量的“指針”。一級指針指針變量的定義指針變量是用來存放另一個變量的“地址”的變量,當一個指針變量p所存放的內容是另一個變量a的地址時,稱變量p“指向”變量a。定義:數(shù)據(jù)類型*指針變量名; 如:int*p;指針變量的賦值建議總是將指針變量初始化為空值——NULL對指針變量進行賦值只有三種情況是合法的。一是賦NULL值,二是賦同類型變量的地址,三是賦同類型指針。inta,*p=NULL,*q=NULL,*r=NULL;/*定義整型變量a和三個整型指針*/p=&a; /*給指針p賦同類型變量a的地址?!?”是取地址操作符*/q=p; /*給指針q賦同類型指針p,賦值后p和q都指向a*/r=0X12345678; /*錯誤,不屬于前面提到的三種賦值方式之一*/334.3C語言基礎數(shù)據(jù)類型inta,*p=NULL,4.3C語言基礎數(shù)據(jù)類型指針一級指針指針變量的引用使用“*”操作符(定義指針時用的“*”不是指針引用,而是指針變量的說明符)。引用指針變量所指向的目標的內容。引用指針變量之前應當確保它指向了一個有效的地址單元。inta=10,*p=NULL;p=&a;printf("a=%d,*p=%d",a,*p); /*輸出a=10,*p=10);344.3C語言基礎數(shù)據(jù)類型inta=10,*p=4.3C語言基礎數(shù)據(jù)類型指針二級指針二級指針變量的定義指針變量是用來存放另一個變量的“地址”的變量,當一個指針變量p所存放的內容是另一個變量a的地址時,稱變量p“指向”變量a。定義:數(shù)據(jù)類型**指針變量名; 如:int**pp;二級指針變量的賦值也只有三種情況是合法的。一是賦NULL值,二是賦同類型的一級指針變量的地址,三是賦同類型指針。inta,*p=NULL,**pp=NULL;/*定義整型變量a、一級指針p和二級指針pp*/p=&a;pp=&&p; /*給二級指針pp賦同類型一級指針p地址*/二級指針變量的引用連續(xù)用兩個“*”操作符。inta=10,*p=NULL,**pp=NULL;p=&a;pp=&p;printf("a=%d,*p=%d,**pp=%d",a,*p,*pp);/*輸出a=10,*p=10,**pp=10*/354.3C語言基礎數(shù)據(jù)類型inta,*p=NULL,4.3C語言基礎數(shù)據(jù)類型結構體結構體是多數(shù)據(jù)項的一種組織方式,是由多個數(shù)據(jù)項構成的緊密關聯(lián)的數(shù)據(jù)單元。結構體類型所占內存的大小是其所有成員所占內存大小之和。結構體類型的定義示例struct結構體名{ 數(shù)據(jù)類型1 成員名1; 數(shù)據(jù)類型2 成員名2; ... 數(shù)據(jù)類型n 成員名n;};structstudent{ intnumber; /*學號*/ charname[30]; /*姓名*/};364.3C語言基礎數(shù)據(jù)類型示例struct結構體名stru4.3C語言基礎數(shù)據(jù)類型結構體結構體類型變量的定義在定義好一個結構體類型之后,即可定義該結構體類型的變量。格式:struct結構體名變量名;如:structstudenta;結構體成員的引用只能逐個引用結構體的數(shù)據(jù)成員,而不能一次引用結構體的所有成員。使用分量運算符——“.”a.number=1; /*給a的number成員賦值1,即學號為1*/[0]='T'; /*以下4行給a的name成員賦字符串"Tom",即姓名為Tom*/[1]='o'; [2]='m'; [3]='\0'; /*下面一行輸出a的信息,輸出結果為:Studenta:number=1,name=Tom*/printf("Studenta:number=%d,name=%s\n",a.number,);結構體成員的初始化在定義結構體變量的同時用花括號進行初始化。如: structstudenta={1,{'T','o','m','\0'}};374.3C語言基礎數(shù)據(jù)類型結構體成員的引用a.number4.3C語言基礎數(shù)據(jù)類型共用體幾個不同的數(shù)據(jù)成員存放在同一段內存的結構。共用體類型的定義方式、共用體變量的定義方式以及共用體成員的引用方式和結構體相類似,區(qū)別在于使用“union”關鍵字代替了“struct”關鍵字。當各成員類型所占用的內存大小不同時,共用體所占的內存大小是其最大成員所占內存的大小。示例uniondata /*定義共用體類型data*/{ intd; charch[4];};uniondataa; /*定義共用體data類型的變量a*/a.d=0x44434241; /*給成員d賦值*/printf("%c%c%c%c",a.ch[0],a.ch[1],a.ch[2],a.ch[3]);/*輸出:ABCD*/384.3C語言基礎數(shù)據(jù)類型示例uniondata /*定4.3C語言基礎數(shù)據(jù)類型自定義類型使用typedef關鍵字為已存在的類型取一個別名,即自定義一個類型名。自定義類型的用法和功能與已有類型的用法和功能完全一樣。語法格式:typedef已有數(shù)據(jù)類型新類型名;如:常用于為書寫較為復雜的類型(如結構體、共用體)取一個別名。如:typedefintCOUNT;COUNTa=10;printf("a=%d",a); /*輸出10*/typedefstructstudentSTUDENT;STUDENTa;STUDENTb;394.3C語言基礎數(shù)據(jù)類型常用于為書寫較為復雜的類型(如結構4.3C語言基礎運算符與表達式運算符運算符(也稱操作符)是表述最基本的運算形式的符號。C語言提供了13類共34個運算符。1)算術運算符2)關系運算符3)邏輯運算符4)位運算符5)賦值運算符6)條件運算符7)逗號運算符8)指針運算符9)求字節(jié)數(shù)10)強制類型轉換11)分量運算符12)數(shù)組下標運算符13)其它404.3C語言基礎運算符與表達式404.3C語言基礎運算符與表達式運算符運算符優(yōu)先級運算符優(yōu)先級()、[]、.、->1,最高!、~、-(負號)、++、--、&(取址)、*(指針)、(類型)、sizeof2,右結合*(乘)、/、%3+、-(減)

4<<、>>5<、<=、>、>=6==、!=7&(位與)

8^9|10&&11||12?:13,右結合=、復合賦值符號(如:+=、*=、…)14,右結合,15,最低414.3C語言基礎運算符與表達式運算符優(yōu)先級()、[]、4.3C語言基礎運算符與表達式運算符表達式由運算符(操作符)和運算量(操作數(shù))組成,用以描述對什么數(shù)據(jù)以什么順序進行什么操作。運算符對運算量進行運算的結果稱為“表達式的值”。任何有值的式子都可以稱為表達式。一個表達式中,最后一個運算的運算符的類型決定了表達式的類型。inta;doublex;a=5 /*賦值表達式,值為:5 */x=1.0 /*賦值表達式,值為:1.0 */(++a+1)*(x+0.5) /*算術表達式,值為:10.5 */a>5 /*關系表達式,值為:0 */a&&2||0 /*邏輯表達式,值為:1 */a+=2,x+3.0 /*逗號表達式,值為:4.0 */424.3C語言基礎運算符與表達式inta;424.3C語言基礎運算符與表達式C語言的語句C程序的基本組成部分。C語句均以分號“;”結尾。C語句可分為:指令語句、非指令語句和復合語句指令語句將被編譯成若干條計算機的指令,以指示計算機執(zhí)行相應的操作。包括表達式語句和流程控制語句。非指令語句不會被編譯成計算機的指令,其作用是輔助編譯器翻譯指令語句。包括數(shù)據(jù)定義語句和編譯預處理。復合語句由一對花括號括起來的一組語句,其作用是將若干條語句組成一個語法上的整體。434.3C語言基礎運算符與表達式434.3C語言基礎運算符與表達式C語言的語句444.3C語言基礎運算符與表達式444.3C語言基礎控制結構三類控制結構語句條件判斷語句循環(huán)語句轉移控制語句。條件判斷語句if語句三種形式示例①形式一if(條件表達式) 語句組②形式二if(條件表達式) 語句組1else 語句組2③形式三if(條件表達式1) 語句組1elseif(條件表達式2) 語句組2......elseif(條件表達式n) 語句組nelse 語句組n+1454.3C語言基礎控制結構①形式一454.3C語言基礎控制結構條件判斷語句if語句示例程序清單4-5ex_if.c/*判斷用戶輸入的年份是否是閏年*/#include<stdio.h>intmain(void){intyear,leap;printf("Pleaseinputayear:");

/*%d表示把輸入的值轉換成整數(shù)后保存到后面的變量的地址單元*/scanf("%d",&year); if(year%4==0){if(year%100==0){if(year%400==0)leap=1;elseleap=0;}elseleap=1;}elseleap=0;if(leap)printf("%disaleapyear.\n",year);elseprintf("%disnotaleapyear.\n",year);return0;}jianglinmei@ubuntu:~$gcc-oex_ifex_if.cjianglinmei@ubuntu:~$./ex_ifPleaseinputayear:20002000isaleapyear.jianglinmei@ubuntu:~$./ex_ifPleaseinputayear:20012001isnotaleapyear.464.3C語言基礎控制結構程序清單4-5ex_if.ce4.3C語言基礎控制結構條件判斷語句switch語句形式示例switch(整型表達式){ case常量表達式1: 語句組1; [break;] case常量表達式2: 語句組2; [break;] ...... case常量表達式n: 語句組n; [break;] [default: 語句組n+1];}474.3C語言基礎控制結構switch(整型表達式)474.3C語言基礎控制結構條件判斷語句if語句示例程序清單4-6ex_switch.c/*轉換百分制成績?yōu)?分制等級*/#include<stdio.h>intmain(void){intscore;chargrade;printf("Pleaseinputscore:");scanf("%d",&score);switch(score/10){case10:case9:grade='A';break;case8:grade='B';break;case7:grade='C';break;

case6:grade='D';break;default:grade='E';}printf("Yourgradeis:%c\n",grade);return0;}jianglinmei@ubuntu:~$gcc-oex_switchex_switch.cjianglinmei@ubuntu:~$./ex_switchPleaseinputscore:67Yourgradeis:Djianglinmei@ubuntu:~$./ex_switchPleaseinputscore:91Yourgradeis:A484.3C語言基礎控制結構程序清單4-6ex_switc4.3C語言基礎控制結構循環(huán)語句while語句形式當條件表達式的值為“真”時,反復執(zhí)行語句組while(條件表達式){ 語句組;}do{ 語句組;}while(條件表達式);do...while語句形式反復執(zhí)行語句組,直到條件表達式的值為“假”時退出循環(huán)。for語句形式首先執(zhí)行初始化表達式,然后判斷條件表達式,當條件表達式的值為“真”時,反復執(zhí)行語句組和值更改表達式,當條件表達式的值為“假”時退出循環(huán)for(初始化表達式;條件表達式;值更改表達式){ 語句組;}494.3C語言基礎控制結構while(條件表達式)dodo.4.3C語言基礎控制結構循環(huán)語句for語句示例程序清單4-7ex_for.c/*計算0~100之間所有偶數(shù)之和*/#include<stdio.h>intmain(void){inti,sum;for(i=0,sum=0;i<=100;i+=2){sum+=i;}printf("Thesumofallevennumberdigitbetween\0and100is:%d\n",sum);return0;}jianglinmei@ubuntu:~$gcc-oex_forex_for.cjianglinmei@ubuntu:~$./ex_forThesumofallevennumberdigitbetween0and100is:2550504.3C語言基礎控制結構for語句程序清單4-7ex_4.3C語言基礎控制結構轉移控制語句break語句switch語句的case分支中,用以退出switch。循環(huán)語句中,用以退出循環(huán)。continue語句只能用在循環(huán)語句中,作用是中止一次循環(huán),即跳過循環(huán)語句組中位于continue之后的語句,進入下一次循環(huán)條件表達式的判斷。return語句用于函數(shù)體內,作用是退出函數(shù),同時可以給調用者返回一個值。goto語句用以將程序執(zhí)行流程無條件轉移到一個標號處。標號是一個后面跟一個冒號“:”的標識符。示例514.3C語言基礎控制結構514.3C語言基礎程序清單4-8ex_transfer.c/*計算n~100之間所有偶數(shù)之和,n為用戶輸入的一個整數(shù)*/#include<stdio.h>intmain(void){inti,sum,digit;printf("Pleaseinputapositivedigit:");scanf("%d",&digit);if(digit>100)gotoEND; /*跳到標號END后面的行*//*條件表達式省略,永遠為真*/for(i=digit,sum=0;;i++){if(i>100)break; /*退出循環(huán)*/if(i%2==1)/*中止本次循環(huán),流程轉入“i++”continue; sum+=i;}printf("Thesumofallevennumberdigitbetween0and100is:%d\n",sum);return0;END: /*定義標號*/printf("Thedigityouinputtedistoolarge\n");return0;}jianglinmei@ubuntu:~$./ex_transferPleaseinputapositivedigit:0Thesumofallevennumberdigitbetween0and100is:2550jianglinmei@ubuntu:~$./ex_transferPleaseinputapositivedigit:120Thedigityouinputtedistoolarge524.3C語言基礎程序清單4-8ex_transfer.4.3C語言基礎函數(shù)一個C源程序由一個或多個文件構成,每個源文件就是一個編譯單位。一個C語言源文件由一個或多個函數(shù)構成。每個程序有且只有一個主函數(shù)(main),其他都是子函數(shù)。主函數(shù)可以調用子函數(shù),子函數(shù)可以相互調用,但子函數(shù)不能調用主函數(shù)。函數(shù)的定義格式形式參數(shù)數(shù)據(jù)類型變量名[,數(shù)據(jù)類型變量名...]示例數(shù)據(jù)類型函數(shù)名([形式參數(shù)說明]){ 函數(shù)體}intsum(intx,inty){ intz; z=x+y; returnz;}534.3C語言基礎函數(shù)數(shù)據(jù)類型函數(shù)名([形式參數(shù)說明])4.3C語言基礎函數(shù)函數(shù)原型在程序中調用函數(shù)需滿足以下條件被調用函數(shù)必須存在,且必須遵循“先定義后使用”的原則;如果被調用函數(shù)定義在主調函數(shù)之后,可以在調用之前給出原型聲明。原型聲明的一般格式數(shù)據(jù)類型函數(shù)名(形參類型[變量名],[形參類型[變量名],…]);說明:為函數(shù)定義格式除去花括號與函數(shù)體的部分,加一個分號結束。形式參數(shù)的變量名是可選的。例:intsum(intx,inty);或intsum(int,int);544.3C語言基礎函數(shù)intsum(intx,int4.3C語言基礎函數(shù)函數(shù)的調用一般形式函數(shù)名([實參列表])應注意如果被調用沒有形式參數(shù),則不能有實參列表,但必須有圓括號;實參個數(shù)和形參個數(shù)必須相同;實參和形參的數(shù)據(jù)類型一一對應,必須相同或實參的類型能安全轉換為形參的類型。調用函數(shù)時,按位置順序將實參的值一一賦值給對應的形參,這是按值傳遞參數(shù)的過程。被調用函數(shù)有返回值時,主調函數(shù)中可以獲取該返回值。示例554.3C語言基礎函數(shù)554.3C語言基礎程序清單4-9ex_function.c#include<stdio.h>/*聲明函數(shù)原型*/intsum(intx,inty);intmain(void){intresult;result=sum(3,5); //調用自定義函數(shù)printf("thesumof3and5is:%d\n",result);return0;}/*定義函數(shù),計算兩數(shù)之和*/intsum(intx,inty){intz;z=x+y;returnz;}jianglinmei@ubuntu:~$./ex_functionthesumof3and5is:8564.3C語言基礎程序清單4-9ex_function.4.3C語言基礎內存管理C語言的標準庫中提供了3個函數(shù)用以分配和回收內存。動態(tài)分配內存函數(shù)malloc()函數(shù)原型:void*malloc(unsignedsize);功能:在堆中分配一塊size字節(jié)的內存。調用結果為新分配的內存的首地址,是一個void類型指針。若分配失敗,則返回NULL。動態(tài)分配內存函數(shù)calloc()函數(shù)原型:void*calloc(unsignedintn,unsignedintsize);功能:在堆中分配一塊n*size字節(jié)的內存。調用結果為新分配的內存的首地址,是一個void類型指針。若分配失敗,則返回NULL。釋放動態(tài)分配的內存函數(shù)free()函數(shù)原型:voidfree(void*p);功能:釋放p所指向的動態(tài)分配的內存。注意,實參必須是一個指向動態(tài)分配的內存的指針,它可以是任何類型的指針變量。示例574.3C語言基礎內存管理574.3C語言基礎程序清單4-10ex_malloc.c#include<stdio.h>#include<stdlib.h>typedefstructst{intn;structst*next;}ST;main(){inti,*ip;ST*p=NULL;p=(structst*)malloc(sizeof(structst));p->n=5;p->next=NULL;printf("p->n=%d\n",p->n);free(p);jianglinmei@ubuntu:~/c$gcc-oex_mallocex_malloc.cjianglinmei@ubuntu:~/c$./ex_mallocp->n=5024681012141618

ip=(int*)calloc(10,sizeof(int));for(i=0;i<10;i++)ip[i]=i*2;for(i=0;i<10;i++)printf("%d",*(ip+i));printf("\n");free(ip);}584.3C語言基礎程序清單4-10ex_malloc.c4.3C語言基礎編譯預處理即在編譯之前對源文件進行的處理。包括:宏定義、文件包含和條件編譯宏定義不帶參數(shù)的宏定義格式:#define宏名[宏體]如:#definePI3.1415926說明宏名一般用大寫字母表示,以區(qū)別于一般的變量名;宏定義位置任意,但一般在函數(shù)外面,其作用域為從定義位置直到文件結束;使用#undef可終止宏名作用域。如:#undefPI預編譯時,對宏進行展開操作,即用宏體來替換宏名,替換過程不作語法檢查。宏定義中應注意使用圓括號以保證宏展開后的式子依然正確。#defineWIDTH 80#defineLENGTH WIDTH+40var=LENGTH*2;宏展開過程:var=WIDTH+40*2var=80+40*2#defineWIDTH 80#defineLENGTH (WIDTH+40)var=LENGTH*2;宏展開過程:var=(WIDTH+40)*2var=(80+40)*2594.3C語言基礎編譯預處理#defineWIDTH 84.3C語言基礎編譯預處理宏定義帶參數(shù)的宏定義格式:#define宏名(形參表)宏體如:#defineMAX(x,y)((x)>(y)?(x):(y))說明宏體及各形參應用圓括號括起來,以免歧義;宏名與參數(shù)之間不能有空格;引用帶參的宏時要求實參個數(shù)與形參個數(shù)相同。其形式與函數(shù)調用相同,但處理方式不同。函數(shù)傳參是在運行階段,宏參數(shù)替換是在預處理階段。符號“#”、“##”和“\”# 把宏參數(shù)變?yōu)橐粋€字符串,即在宏參數(shù)兩邊加上“"”;## 把兩個宏參數(shù)粘合在一起,即順序連接兩參數(shù)的值;\ 續(xù)行符,允許分多行書寫宏體,注意在“\”后不能有任何字符。示例#defineMUL(x,y)x*yvar=MUL(3+5,2+1);#defineS(r)PI*r*r604.3C語言基礎編譯預處理#defineMUL(x,y4.3C語言基礎編譯預處理宏定義帶參數(shù)的宏定義格式:#define宏名(形參表)宏體如:#defineMAX(x,y)((x)>(y)?(x):(y))說明宏體及各形參應用圓括號括起來,以免歧義;宏名與參數(shù)之間不能有空格;引用帶參的宏時要求實參個數(shù)與形參個數(shù)相同。其形式與函數(shù)調用相同,但處理方式不同。函數(shù)傳參是在運行階段,宏參數(shù)替換是在預處理階段。符號“#”、“##”和“\”# 把宏參數(shù)變?yōu)橐粋€字符串,即在宏參數(shù)兩邊加上“"”;## 把兩個宏參數(shù)粘合在一起,即順序連接兩參數(shù)的值;\ 續(xù)行符,允許分多行書寫宏體,注意在“\”后不能有任何字符。示例#defineMUL(x,y)x*yvar=MUL(3+5,2+1);#defineS(r)PI*r*r614.3C語言基礎編譯預處理#defineMUL(x,y4.3C語言基礎編譯預處理宏定義程序清單4-11ex_presymbol.c#include<stdio.h>#defineSTR(s)#s#defineVERSION(major,minor)major##.##minor#defineDEFINE_FUNCTION(id,name)\staticvoidname##id()\{\printf("functionis:%s\n",STR(name##id));\}\DEFINE_FUNCTION(10,output);intmain(){printf(STR(itisastring));//輸出:itisastringprintf("\n%.1f\n",VERSION(5,3));//輸出:5.3output10();return0;}staticvoidoutput10(){printf("functionis:%s\n","output10");};intmain(){printf("itisastring");printf("\n%.1f\n",5.3);output10();return0;}624.3C語言基礎編譯預處理程序清單4-11ex_pre4.3C語言基礎編譯預處理文件包含一個源文件將另一個源文件的內容全部包含進來格式:#include“文件名”或#include<文件名>#include一般用于包含“.h”頭文件,如用于包含“.c”文件很容易引起變量重復定義的錯誤。在預編譯時,#include指令行會被所包含的文件的內容取代。例/*a.h文件*/externintmax(int,int);/*a.c文件*/#include"a.h"/*包含a.h文件*/intmax(inta,intb){returna>b?a:b;}經預處理后,a.c文件的內容變?yōu)椋篹xternintmax(int,int);intmax(inta,intb){returna>b?a:b;}634.3C語言基礎編譯預處理/*a.h文件*/經預處理后4.3C語言基礎編譯預處理條件編譯在某個條件成立的情況下才進行編譯。條件編譯有三種形式。示例1)形式一#ifdef標識符程序段1[#else程序段2]#endif2)形式二#ifndef標識符程序段1[#else程序段2]#endif3)形式三#if常量表達式1程序段1[#elif常量表達式2程序段2#else程序段n]#endif程序清單4-11ex_presymbol.c#include<stdio.h>intmain(){#ifCIRCLEprintf("drawcircle\n");#elifRECTANGLEprintf("drawrectangle\n");#elseprintf("drawline\n");#endifreturn0;}jianglinmei@ubuntu:~/c$gcc-E-oex_preif.eex_preif.cintmain(){printf("drawline\n");return0;}jianglinmei@ubuntu:~/c$gcc-E–DRECTANGLE=1-oex_preif.eex_preif.cintmain(){printf("drawrectangle\n");return0;}644.3C語言基礎編譯預處理1)形式一程序清單4-114.3C語言基礎思考如何交換兩個整數(shù)#include<stdio.h>voidswap(intx,inty){intt;t=x;x=y;y=t;}voidmain(){inta=3,b=5;swap(a,b);printf(“%d%d\n”,a,b);}#include<stdio.h>voidswap(int*x,int*

y){intt;t=*

x;

*

x=*

y;

*

y=t;}voidmain(){inta=3,b=5;swap(&a,&b);printf(“%d%d\n”,a,b);}voidswap(int*x,int*

y){int*t;t=x;x=y;

y=t;}voidswap(int*x,int*

y){int*t;

*

t=*

x;

*

x=*

y;

*

y=*

t;}654.3C語言基礎思考#include<stdio.h>4.2LanguageC思考如何交換兩個字符串voidswap(char*pp1,char*pp2){ char*p;p=pp1; pp1=pp2; pp2=p;}voidmain(){ char*p1="please"; char*p2="Doit,"; swap(p1,p2); printf("%s%s",p1,p2);}voidswap(char*pp1,char*pp2){

char*p;*p=*pp1; *pp1=*pp2; *pp2=*p;}voidmain(){ char*p1="please"; char*p2="Doit,"; swap(p1,p2); printf("%s%s",p1,p2);}voidswap(char**pp1,char**pp2){ char*p;p=*pp1; *pp1=*pp2; *pp2=p;}voidmain(){ char*p1="please"; char*p2="Doit,"; swap(&p1,&p2); printf("%s%s",p1,p2);}664.2LanguageC思考voidswap(char第4章LinuxC語言編程基礎67第4章LinuxC語言編程基礎1Linux環(huán)境編程4LinuxC語言編程基礎課件Linux環(huán)境編程4LinuxC語言編程基礎課件第一個C程序編譯選項-E 僅進行預處理,不進行其他操作。助于發(fā)現(xiàn)宏錯誤。-S 編譯到匯編語言,不進行其他操作。-c 編譯、匯編到目標代碼,不進行鏈接-Wall 盡可能多地顯示警告信息。-Werror 將所有的警告當作錯誤處理。-g 在可執(zhí)行文件中包含標準調試信息。-I 設置頭文件的路徑,可以設置多個,默認路徑“/usr/include”。-L 設置庫文件的路徑,可以設置多個,默認路徑“/usr/lib”。-l 設定編譯所需的庫名稱,如果一個庫的文件名為“l(fā)ibxxx.so”那么 它的庫名稱為“xxx”。jianglinmei@ubuntu:~/c$gcc-op.c-Efirst.cjianglinmei@ubuntu:~/c$catp.c#1"first.c"#1"<built-in>"#1"<command-line>"#1"first.c"#1"/usr/include/stdio.h"134…externvoidfunlockfile(FILE*__stream)__attribute__((__nothrow__));#936"/usr/include/stdio.h"34#2"first.c"2intmain(void){printf("Helloworld!\n");}jianglinmei@ubuntu:~/c$gcc-Sfirst.cjianglinmei@ubuntu:~/c$catfirst.s.file"first.c".section.rodata.LC0:.string"Helloworld!".text.globlmain.typemain,@functionmain:…….LFE0:.sizemain,.-main.ident"GCC:(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1".section.note.GNU-stack,"",@progbitsjianglinmei@ubuntu:~/c$gcc-cfirst.cjianglinmei@ubuntu:~/c$ls-lfirst.o-rw-rw-r--1jianglinmeijianglinmei102810月123:47first.ojianglinmei@ubuntu:~/c$gcc-Wall-ofirstfirst.cfirst.c:Infunction‘main’:first.c:6:1:warning:controlreachesendofnon-voidfunction[-Wreturn-type]jianglinmei@ubuntu:~/c$rmfirstjianglinmei@ubuntu:~/c$ls1.txtfirst.cfirst.ofirst.sp.cjianglinmei@ubuntu:~/c$gcc-Werror-Wall-ofirstfirst.cfirst.c:Infunction‘main’:first.c:6:1:error:controlreachesendofnon-voidfunction[-Werror=return-type]cc1:allwarningsbeingtreatedaserrorsjianglinmei@ubuntu:~/c$ls1.txtfirst.cfirst.ofirst.sp.cjianglinmei@ubuntu:~/c$llfirst-rwxrwxr-x1jianglinmeijianglinmei71592013-04-1708:58first*jianglinmei@ubuntu:~/c$gcc-g-ofirstfirst.cjianglinmei@ubuntu:~/c$llfirst-rwxrwxr-x1jianglinmeijianglinmei80432013-04-1709:03first*jianglinmei@ubuntu:~$gcc-I/usr/include/gtk-2.0/-c-otest.otest.cjianglinmei@ubuntu:~$gcc-L/usr/lib/i386-linux-gnu/-lX11-otesttest.c4.1gcc編譯器70第一個C程序jianglinmei@ubuntu:~/c$選項含義--help顯示命令幫助說明--version顯示編譯器版本信息-o<文件>指定輸出文件名,缺省設置為“a.out”。-DMACRO定義宏MACRO。-E僅進行預處理,不進行其他操作。-S編譯到匯編語言,不進行其他操作。-c編譯、匯編到目標代碼,不進行鏈接-g在可執(zhí)行文件中包含標準調試信息。-Wall盡可能多地顯示警告信息。-Werror將所有的警告當作錯誤處理。-w禁止所有警告。-ansi采用標準的ANSIC進行編譯。-llibrary設定編譯所需的庫名稱,如果一個庫的文件名為“l(fā)ibxxx.so”那么它的庫名稱為“xxx”。-Ipath設置頭文件的路徑,可以設置多個,默認路徑“/usr/include”。-Lpath設置庫文件的路徑,可以設置多個,默認路徑“/usr/lib”。-static使用靜態(tài)鏈接,編譯后可執(zhí)行程序不依賴于庫文件。-ON優(yōu)化編譯,主要提高可執(zhí)行程序得運行速度,N可取值為1、2、3。-Q顯示各個階段的執(zhí)行時間。4.1gcc編譯器71選項含義--help顯示命令幫助說明--version顯示編4.2EclipseCDT安裝和啟動在Unbutu12.04環(huán)境下的安裝方法jianglinmei@ubuntu:~$sudoapt-getupdatejianglinmei@ubuntu:~$sudoapt-getupgradejianglinmei@ubuntu:~$sudoapt-getinstalleclipse-cdt啟動724.2EclipseCDT安

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論