1.三目運算符:
(表達式1)赏胚?(表達式2) : (表達式3);
表達式1 成立 ,返回表達式2 的值矾缓,否 ?返回3 的值
內(nèi)存地址:(取地址符 &) ?打印 %P占位符 printf(“b%p”,&b)
switch (表達式)
{
case(常量)://case 里面不能直接定義變量
{
語句塊怀酷;
}
break;
default: 語句 n + 1;
}
# include
int main( )
{
void action1(int,int),action2(int,int);
char ch;
int a = 5,b = 23;
ch = getchar( );
switch (ch)
{
case‘a(chǎn)':
case‘A’: action1(a,b);break;
default: putchar(‘\a’) // 如果輸入其他字符而账,發(fā)出警告胰坟。
}
}
//內(nèi)存地址,變量的首個字節(jié)的編號就是該變量的內(nèi)存地址泞辐。
// scanf 函數(shù) printf 函數(shù) ?變量聲明 r如果下一次輸入時字符貨其他情況時笔横,?“\n”scanf(“\n")
int oldPassWord ?= 123456;
printf(“輸入新密碼:\n”);
//定義一個新變量,存儲新的密碼
intnewPassWord;
scanf(“%d”,&newPassWord);
if (oldPassWord ==newPassWord)
{
執(zhí)行語句塊咐吼;
}
2.靜態(tài)變量和動態(tài)變量
如果函數(shù)中的變量只被引用而不改變值吹缔,則定義為靜態(tài)局部變量(同時初始化),以免每次調(diào)用時重新賦值锯茄。
階乘運算 中 使用 靜態(tài)變量
# include
int main( )
{
int fac(int n);
for(int i = 1;i < 6;i++) printf(“%d! = %d\n”,i.fac(i));
return 0;
}
int fac(int n)
{
static int f = 1;// f 保留來上次調(diào)用結(jié)束時的值
f = f * i; ? ? ? ? ?// 在上次的f的值的基礎(chǔ)上再乘以n
return(f);// ? 返回值f是n! 的值
}
靜態(tài)變量存儲占用內(nèi)存(長期占用不釋放)厢塘,若非必要,不怎么使用肌幽。
3晚碾、寄存器變量(register)
一般情況下,變量(靜態(tài)和動態(tài))的值存放于內(nèi)存中的喂急。當程序中用到哪一個變量的值時格嘁,由控制器發(fā)出指令將內(nèi)存中該變量的值送到運算器中。經(jīng)過運算器進行運算廊移,如需要存數(shù)糕簿,再從運算器將數(shù)據(jù)送到內(nèi)存存放。
如果變量使用頻繁狡孔,存儲變量的值花費時間較多懂诗。提高執(zhí)行效率,允許將局部變量的值放在cpu中的寄存器中苗膝,需要時直接從寄存器取出參加運算殃恒,不必再到內(nèi)存中去存儲。(寄存器的存儲速度遠高于內(nèi)存)荚醒。這種變量叫:寄存器變量芋类,用關(guān)鍵字register 作聲明:
register ?int f ;// 定義f為寄存器變量 。
注:三種局部變量的存儲位置是不同的:自動變量存儲于 動態(tài)存儲區(qū) 界阁;靜態(tài)局部變量 存于 靜態(tài)存儲區(qū);寄存器存儲于cpu的寄存器中.
4胖喳、全局變量的存儲類別
一般而言泡躯,外部變量是在函數(shù)外部定義的的全局變量,其作用域從 定義處開始 到 本程序文件的末尾。在此作用域內(nèi)较剃,全局變量可以為各個函數(shù)所引用咕别。but 希望能擴展外部變量的作用域時可以。
> 在一個文件內(nèi)擴展外部變量的作用域写穴。
如果外部變量的不在文件的開頭定義惰拱,其有效的作用范圍只限于定義處到文件結(jié)束。在定義點之前的函數(shù)不能引用該處變量啊送。若需要偿短,則應(yīng)該在引用之前用關(guān)鍵字 extern 對該處變量作
“外部變量聲明”,表示把該處的作用域擴展到此位置馋没。
eg:
# include
int main ( )
{
int max( );
extern int A,B,C; ?// 將外部變量擴展到從此處開始
printf(“three number?enter:”);
scanf(“%d %d %d”,&A,&B,&C);
printf(“Max is %d\n”,max);
return 0;
}
int A,B,C; ? // 定義外部變量昔逗;
int max( )
{
int m;
m = A > B ? A : B;
return (m);
}
> 將外部變量的作用域擴展到其他文件
一個c程序可由一個或多個源程序文件組成。此時篷朵,如果一個程序由多個文件組成勾怒。如,一個程序由兩個文件組成声旺,在兩個文件中都需要用到另一個外部變量Num笔链,不能分別在兩個文件中各自定義一個外部變量 Num ,否則在進行程序的連接時會出現(xiàn)“重復(fù)定義”的錯誤腮猖〖ǎ the right way is :在其中一個文件中定義外部變量,在另一文件中用extern 對 Num 作“外部變量聲明缚够,即extern Num”.
文件file1.c
# include
int A;
int main ( )
{
int power(int);
int b = 3,c,d,m;
printf(“enter the number a and its power m:\n”);
scanf(“%d,%d”,&A,&m);
c = A * b;
d = power(m);
printf(“%d * %d = %d”,A,m,d);
return 0;
}
文件file2.c
extern A;
int power(int n)
{
int i,y = 1;
for (i = 1;i < = n;i++)
{
y *= A;
}
}
>將外部變量的作用域限制在本文件中
當不希望某些變量被其他文件引用幔妨,只限于在本文件引用。此時可以在定義外部變量時加一個 static 聲明谍椅。
file1.c ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?file2.c
static int A ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?此時本文件不可使用
這種加上 static 聲明误堡,只能用于本文件的外部變量 稱為 靜態(tài)外部變量。
用static 聲明一個變量的作用是:
(1)對局部變量用static 聲明雏吭,把它分配在靜態(tài)存儲區(qū)锁施,該變量在整個程序執(zhí)行期間不釋放,其所分配的空間始終存在杖们。
(2)對全局變量用static 聲明悉抵,則該變量的作用域只限于本文件模塊(即聲明的文件中)
注: 不能先定義 后指定存儲類型。
********** 存儲類別小結(jié)******************
對一個數(shù)據(jù)的定義摘完,需要指定兩種屬性:數(shù)據(jù)類型 ? 存儲類型姥饰,分別使用兩個關(guān)鍵字 ? static ?auto
static int a//靜態(tài)局部變量或者靜態(tài)外部整形變量
auto char c//自動變量 ,在函數(shù)內(nèi)定義
register ?int d// 寄存器變量 孝治,在函數(shù)內(nèi)定義
static 對局部變量和全局變量的作用不同列粪。對局部變量來說审磁,它使變量由 ? 動態(tài)存儲方式 ?變?yōu)??靜態(tài)存儲方式。對全局變量來說岂座,它使變量局部化(局部于本文件)态蒂,但仍為靜態(tài)存儲方式。
從作用域角度:凡由static 聲明的费什,其作用域都是有限的钾恢,或是局限于本函數(shù)內(nèi)。
此外 鸳址,可以用extern 聲明已經(jīng)定義的外部變量瘩蚪,例如:
extern b; //將已經(jīng)定義的外部變量 b 的作用域擴展至此。
內(nèi)存中:靜態(tài)存儲區(qū)和動態(tài)存儲區(qū) ?以及 CPU中的寄存器
一個函數(shù)一般由兩個部分構(gòu)成: 聲明部分 和 執(zhí)行部分氯质。
聲明部分:對有關(guān)的標識符(變量募舟、函數(shù)、結(jié)構(gòu)體闻察、共用體~)的屬性進行聲明拱礁。
eg:有一個字符串 ?內(nèi)有若干個字符 ,先輸入一個字符辕漂,要求程序?qū)⒆址性撟址麆h去呢灶。用外部函數(shù)實現(xiàn)。
:用一個字符數(shù)組 str 存放一個字符串钉嘹,然后對str 數(shù)組中的字符逐個檢查鸯乃,如果不是指定要刪除的字符則 保留,仍存放在數(shù)組中 ?跋涣,否 缨睡,則 刪去。定義三個函數(shù)用來輸入字符串陈辱,刪除字符串奖年,輸出字符串。按以上要求沛贪,將三個函數(shù)分別放在三個文件中陋守,main函數(shù)在另一個函數(shù)中。
file1.c
# include
int main( )
{
extern void enter_string(char str[ ]);
extern void delete_string(char str[ ],char ch);
extern void print_string(char str[ ]);
//以上三個函數(shù)的聲明在本函數(shù)將要調(diào)用的已在其他文件中定義的3個函數(shù)利赋;
char c ,str [80];
enter_string(str);
scanf(“%c”,&ch);
delete_string(str,ch);
print_string(str);
return 0;
}
file2.c
void enter_string(char str[80])
{
gets(str); ? //向字符數(shù)組輸入字符串
}
file3.c
void delete_string(char str[ ],char ch)
{
int i,j;
for(i = j = 0;str[i] !=‘\0’;i++)
{
if(str[i] != ch) str[j++] = str[i]; str[j] =‘\0’;
}
}