C語言程序設計基礎課件 第10章變量的作用域、存儲類別和編譯預處理_第1頁
C語言程序設計基礎課件 第10章變量的作用域、存儲類別和編譯預處理_第2頁
C語言程序設計基礎課件 第10章變量的作用域、存儲類別和編譯預處理_第3頁
C語言程序設計基礎課件 第10章變量的作用域、存儲類別和編譯預處理_第4頁
C語言程序設計基礎課件 第10章變量的作用域、存儲類別和編譯預處理_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程序設計

第10章變量的作用域、存儲類別和編譯預處理局部變量

變量的作用域作用域程序中變量在何范圍內(nèi)可見;局部變量截止到目前,我們接觸的變量都屬局部變量。intf1(inta){

intb,c;

……}intf2(intx){

inty,z; ……}intmain(){

intm,n; ……}全局變量局部變量abc可見xyzmn都不可見

xyz可見abcmn都不可見mn可見abcxyz都不可見

①只在本函數(shù)內(nèi)可見

(本函數(shù)“塊”內(nèi)可見)②若未賦初值,值為隨機數(shù)③不同函數(shù)中可使用同名變量,形參和實參也可同名(形參也是函數(shù)內(nèi)的變量)④在復合語句中定義變量,只在復合語句“塊”內(nèi)可見,同時也只在“塊”內(nèi)有效

不可見:指不能通過x、y、z、m、n這樣的名字來使用變量,但可通過其他途徑(如引用、指針)使用這些變量。對應函數(shù)結束后,變量空間被銷毀,要在此前才能使用變量。復合語句中的局部變量#include<stdio.h>main(){inti=2,j=3,k;k=i+j;{

intk=8; printf("%d\n",k);}printf("%d\n",k);}main的空間i:2j:3k:?5{}的空間k:88

85在復合語句中定義的變量只在復合語句“塊”內(nèi)可見(從定義它開始到復合語句的}

為止)。同時也只在復合語句“塊”內(nèi)有效——進“塊”時變量空間才被開辟,出“塊”后變量空間即被銷毀(即使函數(shù)還未結束)。全局變量(也稱外部變量)在函數(shù)外定義的變量。全局變量全局變量

在函數(shù)外定義的變量。①作用域:從變量定義處開始,到本程序文件末尾均有效(其中所有函數(shù)都能用)。②初始值自動為0。③全局變量可在多個函數(shù)中同時起作用,應盡量少用或不用全局變量。#include<stdio.h>intsum;voidfun1(){ sum+=20;}inta;voidfun2(){ a=20; sum+=a;}intmain(){ sum=0;fun1(); a=8;fun2(); printf("sum=%d,a=%d",sum,a);

return0;}sum:0a:0main的空間0fun1的空間208fun2的空間2040sum=40,a=20不能使用a都能使用a都能使用sumfun1如果要使用avoidfun1(){ externinta; a=1; sum+=20;}變量的聲明:聲明是為說明變量存在,不開辟新空間。與定義的區(qū)別是:變量聲明有extern,不開辟新空間;變量定義無extern,開辟新空間。一個C程序可包含多個源程序文件(.c)

main(){......

函數(shù)1();....}int

函數(shù)1(){......}float函數(shù)2(){......}void函數(shù)3(){......}main(){......

函數(shù)1();....}file1.cint

函數(shù)1(){......}float函數(shù)2(){......}file2.cvoid函數(shù)3(){......}file3.c一個程序(不是3個程序)只能有一個main函數(shù)每個文件都可被單獨編譯,但不一定能單獨運行。多文件共用同一全局變量和函數(shù)extern用于變量/函數(shù)時,是聲明,不是定義,不開辟空間聲明要使用其他文件中的全局變量或其他文件中的函數(shù)。file1.cfile2.c要使用其他文件中的全局變量或函數(shù),需要先聲明!a:01020#include<stdio.h>intmain(){ a=10; printf("main中a=%d\n",a); fun(); printf("fun后main中a=%d\n",a);

return0;}#include<stdio.h>{ a=20; printf("fun中a=%d\n",a);}聲明要使用其他文件中的全局變量a,不開辟新空間main中a=10聲明要使用其他文件中的函數(shù)funmain中a=10fun中a=20main中a=10fun中a=20fun后main中a=20inta; //全局變量voidfun()externvoidfun();extern

inta;定義全局變量a,開辟a的空間static的另一種含義(同一符號不同場合含義不同)#include<stdio.h>externvoidfun();intmain(){ …… fun(); ……}#include<stdio.h>extern

inta;{ a=20; ……}inta; //全局變量voidfun()全局變量:只能是static型的,加不加static都是static型的。但加static

有另外的含義:它不允許被其他文件使用。static不允許使用file1的a

file2.cfile1.c函數(shù): 定義前加static也表示:它不允許被其他文件使用。 若定義前不加static或加extern,表示函數(shù)可被其他文件使用。static不允許使用file2的fun

static①局部變量定義前加static,表示靜態(tài)變量;②全局變量定義前或函數(shù)定義前加static,表示不允許被其他文件使用。static和extern總結static①局部變量定義前加static,表示靜態(tài)變量;②全局變量定義前或函數(shù)定義前加static,表示不允許被其他文件使用。extern①全局變量的聲明或函數(shù)聲明前加extern,表示該全局變量或函數(shù)是其他文件中定義的,或是本文件后面定義的,用于擴大可見性(不開辟新變量空間);②函數(shù)定義前加extern或不寫,表示該函數(shù)允許被其他文件使用。①聲明:不分配內(nèi)存,可出現(xiàn)多次

②定義:分配內(nèi)存、寫出執(zhí)行語句,只能出現(xiàn)一次。聲明和定義盡量不要使用全局變量否則會破壞函數(shù)的獨立性;并可能導致變量值意外被其他函數(shù)所改變。變量的存儲類別不同存儲類別的變量的特點變量定義前加autostaticregister存儲位置內(nèi)存動態(tài)存儲區(qū)內(nèi)存靜態(tài)存儲區(qū)CPU寄存器(沒在內(nèi)存)作用域所在函數(shù)內(nèi),或所在復合語句{}內(nèi)有效生存期離開函數(shù)或{}就消失永久保留同auto初值隨機數(shù),初值重新賦值值為0,初值只賦一次同autoregister型變量的速度要遠遠快于其他存儲類型的變量。auto類型可缺省,離開}掃干凈。有賦初值重新賦,未賦初值值不定。static靜態(tài)型,永久保留內(nèi)存中。有賦初值只一次,未賦初值值為0。f的空間存儲類別程序例#include<stdio.h>intf(inta){ intb=0;

static

intc=3; b=b+1; c=c+1;

returna+b+c;}intmain(){ inta=2,i;

for(i=0;i<3;i++) printf("%d",f(a));

return0;}main的空間自動類型要缺省,離開}

掃干凈。有賦初值重新賦,未賦初值值不定。static靜態(tài)型,永久保留內(nèi)存中。有賦初值只一次,未賦初值值為0。a:

2i:

?0b:

0a:

21771f的空間a:

2b:

018782f的空間c:

35a:

2b:

041697893全局變量和局部變量的存儲類別①全局變量: 只能是靜態(tài)(static)型的,不能為自動型;②函數(shù)中,或{}

中的局部變量: 可以是自動型或靜態(tài)(static)型的;③函數(shù)的形參: 只能是自動型的,不能為靜態(tài)(static)型。生存期變量從空間被開辟,到該空間被釋放所經(jīng)歷的期間。作用域空間時間程序中,變量在何范圍內(nèi)可見。全局變量局部變量存儲類別(可見性)靜態(tài)型自動型編譯預處理編譯預處理(預編譯處理)#include<stdio.h>main(){

inta,b,c; a=10; b=20; c=a+b; printf("%d",c);}C語言源程序可執(zhí)行程序編譯(compile)鏈接(link)目標程序編譯預處理①前有#,后無;②先預處理,再編譯:預處理在編譯之前

③預處理部分不編譯

編譯(compile)編譯器一般都是把兩個階段一起完成,我們感覺不到預處理階段的存在包含文件(#include)

宏定義(#define)

條件編譯(#if,#ifdef…)

文件包含(#include)也可寫作putchar()的定義getchar()的定義printf()的定義#$%^&...stdio.h頭文件我的程序.cpp#include<stdio.h>main(){...printf("%d",c);...}編譯運行putchar()的定義getchar()的定義printf()的定義#$%^&...將某文件(一般是.h頭文件)嵌入到當前文件中#include<頭文件名.h>#include"頭文件名.h"宏定義(#define)練習若有定義:#defineM(y*y+3*y)則語句: s=3*M+4*M;宏展開(預編譯處理)后變?yōu)?s=3*(y*y+3*y)+4*(y*y+3*y);若有定義:#defineMy*y+3*y則語句: s=3*M+4*M;宏展開(預編譯處理)后變?yōu)?s=3*y*y+3*y+4*y*y+3*y;文本替換,不會計算宏定義(#define)練習#include<stdio.h>#defineN3+5main(){ printf("%d",2*N);}編譯預處理#include<stdio.h>main(){ printf("%d",2*3+5);}文本替換,不會計算#include<stdio.h>#defineN3+5;main(){ printf("%d",2*N);}編譯預處理#include<stdio.h>main(){ printf("%d",2*3+5;);}#include<stdio.h>#definePR

溫馨提示

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

最新文檔

評論

0/150

提交評論