1.三目運算符:
(表達式1)?(表達式2) : (表達式3);
表達式1 成立 ,返回表達式2 的值,否 ?返回3 的值
內存地址:(取地址符 &) ?打印 %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':
case‘A’: action1(a,b);break;
default: putchar(‘\a’) // 如果輸入其他字符,發出警告。
}
}
//內存地址,變量的首個字節的編號就是該變量的內存地址。
// scanf 函數 printf 函數 ?變量聲明 r如果下一次輸入時字符貨其他情況時,?“\n”scanf(“\n")
int oldPassWord ?= 123456;
printf(“輸入新密碼:\n”);
//定義一個新變量,存儲新的密碼
intnewPassWord;
scanf(“%d”,&newPassWord);
if (oldPassWord ==newPassWord)
{
執行語句塊;
}
2.靜態變量和動態變量
如果函數中的變量只被引用而不改變值,則定義為靜態局部變量(同時初始化),以免每次調用時重新賦值。
階乘運算 中 使用 靜態變量
# 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 保留來上次調用結束時的值
f = f * i; ? ? ? ? ?// 在上次的f的值的基礎上再乘以n
return(f);// ? 返回值f是n! 的值
}
靜態變量存儲占用內存(長期占用不釋放),若非必要,不怎么使用。
3、寄存器變量(register)
一般情況下,變量(靜態和動態)的值存放于內存中的。當程序中用到哪一個變量的值時,由控制器發出指令將內存中該變量的值送到運算器中。經過運算器進行運算,如需要存數,再從運算器將數據送到內存存放。
如果變量使用頻繁,存儲變量的值花費時間較多。提高執行效率,允許將局部變量的值放在cpu中的寄存器中,需要時直接從寄存器取出參加運算,不必再到內存中去存儲。(寄存器的存儲速度遠高于內存)。這種變量叫:寄存器變量,用關鍵字register 作聲明:
register ?int f ;// 定義f為寄存器變量 。
注:三種局部變量的存儲位置是不同的:自動變量存儲于 動態存儲區 ;靜態局部變量 存于 靜態存儲區;寄存器存儲于cpu的寄存器中.
4、全局變量的存儲類別
一般而言,外部變量是在函數外部定義的的全局變量,其作用域從 定義處開始 到 本程序文件的末尾。在此作用域內,全局變量可以為各個函數所引用。but 希望能擴展外部變量的作用域時可以。
> 在一個文件內擴展外部變量的作用域。
如果外部變量的不在文件的開頭定義,其有效的作用范圍只限于定義處到文件結束。在定義點之前的函數不能引用該處變量。若需要,則應該在引用之前用關鍵字 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 ,否則在進行程序的連接時會出現“重復定義”的錯誤。 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 聲明,只能用于本文件的外部變量 稱為 靜態外部變量。
用static 聲明一個變量的作用是:
(1)對局部變量用static 聲明,把它分配在靜態存儲區,該變量在整個程序執行期間不釋放,其所分配的空間始終存在。
(2)對全局變量用static 聲明,則該變量的作用域只限于本文件模塊(即聲明的文件中)
注: 不能先定義 后指定存儲類型。
********** 存儲類別小結******************
對一個數據的定義,需要指定兩種屬性:數據類型 ? 存儲類型,分別使用兩個關鍵字 ? static ?auto
static int a//靜態局部變量或者靜態外部整形變量
auto char c//自動變量 ,在函數內定義
register ?int d// 寄存器變量 ,在函數內定義
static 對局部變量和全局變量的作用不同。對局部變量來說,它使變量由 ? 動態存儲方式 ?變為 ?靜態存儲方式。對全局變量來說,它使變量局部化(局部于本文件),但仍為靜態存儲方式。
從作用域角度:凡由static 聲明的,其作用域都是有限的,或是局限于本函數內。
此外 ,可以用extern 聲明已經定義的外部變量,例如:
extern b; //將已經定義的外部變量 b 的作用域擴展至此。
內存中:靜態存儲區和動態存儲區 ?以及 CPU中的寄存器
一個函數一般由兩個部分構成: 聲明部分 和 執行部分。
聲明部分:對有關的標識符(變量、函數、結構體、共用體~)的屬性進行聲明。
eg:有一個字符串 ?內有若干個字符 ,先輸入一個字符,要求程序將字符串中該字符刪去。用外部函數實現。
:用一個字符數組 str 存放一個字符串,然后對str 數組中的字符逐個檢查,如果不是指定要刪除的字符則 保留,仍存放在數組中 ?,否 ,則 刪去。定義三個函數用來輸入字符串,刪除字符串,輸出字符串。按以上要求,將三個函數分別放在三個文件中,main函數在另一個函數中。
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[ ]);
//以上三個函數的聲明在本函數將要調用的已在其他文件中定義的3個函數;
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); ? //向字符數組輸入字符串
}
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’;
}
}