程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> [C程序設計語言]第一部分,c程序設計第一部分

[C程序設計語言]第一部分,c程序設計第一部分

編輯:關於C語言

[C程序設計語言]第一部分,c程序設計第一部分


聲明:原創作品,轉載時請注明文章來自SAP師太博客,並以超鏈接形式標明文章原始出處,否則將追究法律責任!

 
數組... 1
extern. 3
“定義”與“聲明”... 3
變量命名規則... 3
數據類型... 3
算術類型提升與轉換規則... 5
void. 5
\000、\xhh. 5
ANSI C中所有轉義字符... 6
\0. 6
 

數組


局部數組定義時如果未指定長度,又未指定數組內容,則編譯報錯。但全局的好像可以在定義時不指定長度的情況下也不指定數組內容,但編譯時會有警告,內存全清零,並可以對它進行某個元素的讀寫,但如果下標索引過大可能引起內存讀寫錯誤。
 
在定義數組時可以不指定數組長度,而只指定數組內容。也可既指定長度,又指定數組內容。
 
C語言中的定義的多維數組是定長的,不像Java那樣可以在定義時不指定多維數組長度,而指定不同長度的維度內容,如果C中如此定義,則列的長度為某個維度中最長的長度。
 
如果在C語言要定義多維不定長的數組,則只能通過指針的形式來指定多維數組,即數組裡的非第一維采用指針形式定義,如字符串指針數組。
 
C語言中的字符串可以使用一個最末元素為’\0’的空字符來定義。也可將一個字符串直接賦值給一個數組。
 
定義多維數組時,除了第一維不需要指定大小外,其他維都需要指定數組大小。
 
Java在聲明一個數組時,不能指定數組大小,這與C不同,在new時可以省略後面的維度大小,不能省略前面而指定後面大小: int  b[][][]= newint[1][][];也可以這樣:int a[][][] = { { { 1 }, { 2, 3 } } };,C語言只允許以後面這樣形式定義: int a[][1][1] ={{{1}}};,只允許省略第一維大小(在有初始化的情況下,如果定義時未馬上初始化,則第一維也不能省略),也可都不省略,但最好別省略,且初始化時定義時大小與初始化的大小一致,否則容易出問題。
 
如果初始化值的個數少於數組元素的個數,剩余的元素被自動初始化為0(多維數組也是這樣),例如,可以用下面的語句將數組n的元素初始化為0:int a[10]={0};。但千萬要記住:數組的元素不會被自動初始化為0——程序員至少要把第一個數組元素初始為0才能使剩下的元素自動初始化為0。
 
C語言不檢查數組是否越界。
 
如下的數組聲明會導致語法錯誤,因為數組元素只有5個而初始化值卻有6個:int a[5] = { 1, 2, 3, 4, 5, 6 };,初始化值列表中的初始化值個數多於數組元素的個數是一種語法錯誤。
 
如果在聲明帶有初始化值列表的數組時省略數組的大小(如果沒有初始化列表則不能省略),那麼數組元素的個數就是初始化列表中的元素個數,例如:int a[] = { 1, 2, 3, 4, 5, 6 };,建立一個有6個元素的數組。
 
聲明為static的數組是在編譯時一次性初始化的,如果程序員沒有明確地初始化靜態數組,那麼編譯器把它初始化為0。
 
數組實際上就是數組的第一個元素的地址:
int main(int argc, char * argv[]) {
    char array[5];
    printf("%p \n", array);//0022FF4B
    printf("%p \n",&array[0]);//0022FF4B
    return 0;
}
轉換說明符%p通常用來以十六進制格式輸出地址。
 
數組通過引用進行參數傳遞會提高性能。如果用傳值的方式傳遞數組就會傳遞每一個元素的值拷貝。對於頻繁傳遞的大型數組來說,對數組進行拷貝會消耗一定時間與內存。
 
數組作為參數聲明時,可以不必定義數組的大小,如果即使包括了,編譯器會把它忽略掉。對多維數組來說,第一個下標也是不必要的,但是要給出其後所有的下標,編譯器用這些下標確定這些元素在內存中的位置。
 
C語言也會忽略函數原型(使用前的聲明)中的變量名。切記:函數原型只是告訴編譯器出現在函數中的參數的個數和參數的類型。
 
多維數組也可這樣定義:int array[2][3] = { 1, 2, 3, 4, 5 };,這樣像一維那樣,它會按照順序先初始化第一行,再初始化第二行,這裡最後一個元素 array[1][2] 未被初始化,所以為0。
 
在將多維數組做為函數的參數時,第一個下標也是不必要的(如果寫了編譯器也會忽略掉),但是要給出其後其他所有的下標,因為編譯器要用這些下標確定這些元素在內存中的位置,不管數組的下標有多少個,所有的元素都是在內存中連續存放的,所以編譯要根據第一個下標後面所其他下標來定位元素(定位時需要跳過多少個元素)void printArray(int a[][3])
 
多維數組的數組名為第一維中第一個元素(可能又是一個多維數組)的地址。

extern


如果程序包含在多個源文件中,而某個外部(全局)變量在file1文件中定義、在file2和file3文件中使用,那麼在文件file2與file3中就需要使用extern聲明來建立該變量與其定義之間的聯系。

“定義”與“聲明”


“定義”表示創建變量或分配存儲空間,而“聲明”指的是說明變量的性質,但不分配存儲單元。
下面即是聲明:int lower,upper,step;
 
聲明用於說明每個標識符的含義,而並不需要為每個標識符預留存儲空間,預留存儲空間的聲明稱為定義。

變量命名規則


與Java一樣 A$0
標准規定,標識符前至少31個字符有效,在某些實現中,有效字符可能會更多。

數據類型


char
int
float
double
short (int)
long (int)
float
double
long double
 
int通常代表特定機器中整數的自然長度。short類型通過為16位,long類型通常為32位,int類型可能是16或32位。各編譯器可以根據硬件特殊自主選擇合適的類型長度,但要遵循下列限制:short與int類型至少為16位,而long類型至少為32位,並且short類型不得長於int類型,而int類型不得長於long類型。
 
類型限定符signed與unsigned可以限定char類型或任何整型。
 
有關這些類型長度定義的符號常量以及其他與機器和編譯有關的屬性可以在標准頭文件<limits.h>與<float.h>中找到。
 
c++有bool類型,標准C沒有布爾類型,用整型代替布爾類型,非0表示真,0表示假
 
整型常量若以字母u或U為後綴,則表示它是一個無符號數;若以字母1或L為後綴,則表示它是一個長整型數;若以字母UL為後級,則表示它是一個無符號長整型數
 
整型常量的類型同它的形式、值和後辍有關。如果它沒有後綴且是十進制表示,則其類型很可能是int,long int或unsigned long int;如果它沒有後綴且是八進制或+六進制表示,則其類型很可能是int,unsigned int,long int,unsigned long int;如果它的後緩為u或U,則其類型很可能是unsigned int,ungigned long int;果它的後緩為l或L,則其類型很可能是unsigned int,ungigned long int
 
C中的整型常量默認都是int類型的常量,但如果一個整數太大以至於無法用int類型表示時,也將被當作long類型處理。
 
無符號常量以字母u或U結尾。後綴ul或UL表示是 unsigned long類型,通常用在八進制或十進制常量後面來標示最高位到底是符號位還是數字位,而用在十進制後也是一樣。
 
沒有後綴的浮點數常量為double類型,後綴f或F表示float類型,而後綴l或L則是表示long double類型
 
八進制使用0開頭,十六進制使用0X開頭。
 
0XFF=255       char
0XFFFF=65535   short
0XFFFFFFFF=-1  int
如果十六進制常量位數不達到整型int所占位數時,常量首位被看作數字位,而非符號位,如果超過int,則按long來處理
 
unsigned short a=0xFFFF ,則a=65535,但如果去掉unsigned修飾符後,a=-1,這也從另一方面驗證了“整型常量默認都是int類型的常量”
    unsignedshort a1 = 0xFFFF;
    short a2 = 0xFFFF;
    printf("%d \n", a1);//65535
    printf("%d \n", a2);//-1
    printf("%d \n", 0xFFFF);//65535
 
    unsignedshort a3 = -1;
    short a4 = -1;            
    printf("%d \n", a3);//65535
    printf("%d \n", a4);//-1
    printf("%d \n", -1u);//-1
 
在C中可以將大的數據類型賦給小的數據類型(比如將long賦值給short類型的變量),不像Java那樣需要強轉:否則非法。
 
 
當把較長的整數轉換為較短的整數或char類型時,超出的高位部分將被丟棄。如將一個float類型賦值給一個int類型變量時,小數部分將被截取掉;但當把double類型賦值給float類型時,是進行四捨五入還是截取這取決於具體實現。
 

算術類型提升與轉換規則


首先,如果任何一個操作數為 long double 類型,則另一個操作數轉換為 long double 類型。
否則,如果任何一個操作數為 double 類型,則將另一個操作數轉換為 double 類型。
否則,如果任何一個操作數為 float 類型,則將另一個操作數轉換為 float 類型。
否則,如果任何一個操作數為 unsigned long int 類型,則將另一個操作數轉換為 unsigned long int類型。
否則,如果一個操作數為 long int 類型且另一個操作數為 unsigned int 類型,則結果依賴於long int類型是否可以表示所有的unsigned int類型的值。如果可以,則將unsigned int類型的操作數轉換為long int;否則將兩個操作數都轉換為usigned long int。
否則,如果一個操作數為long int類型,則將另一個操作數轉換為long int類型。
否則,如果任何一個操作數為unsigned int類型,則將另一個操作數轉換為unsigned int類型。
否則,將兩個操作數都轉換成int類型。
 
注,表達式中float類型的操作數不會自動轉換成double類型(在沒有double類型操作數的情況下,與int類型不同)
 
假定int類型占有16位,long類型占32位,那麼,-1L>1UL,這是因為-1L將被提升為unsigned long類型,因而成為一個比較大正數。

void


void對象的(不存在的)值不能夠以任何方式使用,也不能被顯式或隱式地轉換為任一非空類型。因為空(void)表達式表示一個不存在的值,這樣的表達式只可以用在不需要值的地方
可以通過強制類型轉換將表達式轉換為void類型。

\000、\xhh


\000最大字符可表示為 \377,第一位不能大於3(在有三位的情況下),因為一旦大於,則表示的總位數會大於8位。注,也可只使用2位8進制位來表示,則此時第一位就可以使用大於3的數表示了,另外也可只有一位,比如空字符 \0。
\378此時表示兩個字符 \37 與 8
\xhh一樣,最多兩位,也可以只有一位十六進制。

ANSI C中所有轉義字符


\a   響鈴
\b   回退
\f    換頁
\n   換行
\r    回車
\t    橫向制表
\v   縱向制表
\\
\\?
\’
\”
\000
\xhh

\0


字符常量 ‘\0’ 表示值為0的字符,也就是空字符(null),但我們通常用 ‘\0’ 的形式代替 0 ,以強調某些表達式的字符屬性,但其數字值為0
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved