C語言筆記1--類型、運算符與表達式
總論:
變量和常量是程序處理的兩種基本的數據對象。聲明語句說明變量的名字和類型,也可以指定變量的初值。運算符指定將要進行的操作。表達式則把變量與常量組合起來生成新的值。對象的類型決定該對象可取值的集合以及可以對該對象執行的操作。
一、變量與常量的名字
1、名字是由字母、下劃線和數字組成的序列,其第一個字符必須為字母;下劃線“_”被看做是字母,但一般不要以下劃線“_”開頭。
2、名字區分字母大小寫,變量名使用小寫字母。符號常量名全部使用大寫字母,單詞之間用下劃線分隔。
經驗:選擇的變量名要能夠盡量從字面上表達變量的用途。 局部變量一般使用較短的變量名(尤其是循環控制變量),外部變量使用較長的名字。
二、數據類型
C語言提供了下面4種基本數據類型:
char //字符型,占用一個字節 int //整型,通常反映了所用機器中整數的自然長度 float //單精度浮點型 double //雙精度浮點型
數據類型限定符:
1、short 和 long 兩個限定符用於限定整型;關鍵字 int 可以省略,通常也習慣於這麼做。
short sh; // short int sh; long counts; // long int counts;
2、類型限定符 signed 與 unsigned 只能用於限定 char 類型和任何整型。
3、long 限定符可以用於雙精度浮點型,long double 類型表示高精度浮點數。
三、常量
1、整型常量
類似於 120 的整數常量屬於 int 類型;
long 類型的常量以字母 l 或 L 結尾,如120680L;
無符號的常量以字母 u 或 U 結尾。
2、浮點數常量
浮點數常量中包含一個小數點(如 380.5)或一個指數(3.805e+2),也可以兩者都有。沒有後綴的浮點數常量為 double 類型。後綴 f 或 F 表示float 類型,而後綴 l 或 L 則表示 long double 類型。
注:整型數除了用十進制表示外,還可以用八進制或十六進制表示,前綴0表示八進制037(如十進制31) ,前綴0x 或 0X表示十六進制 0x1f(如十進制31)。
3、字符常量
一個字符常量是一個整數,書寫時將一個字符括在單引號中(如‘0’)。字符在機器字符集中的數值就是字符常量值,如‘0’在機器字符集中的數值是48,它與數字0沒關系; 再如'A'在機器字符集中的數值是65。
注:字符常量一般用來與其他字符進行比較,但也可以像其他整數一樣參與數值運算。字符常量‘\0’表示值為0的字符,也就是空字符(null)。我們通常用‘\0’的形式來代替0,以強調某些表達式的字符屬性,但其數字值為0。
4、字符串常量
字符串常量也叫字符串字面值,是用雙引號括起來的 0 個或多個字符組成的字符序列。
字符串常量就是字符數組,字符串的內部表示使用一個空字符‘\0’作為字符串的結尾。因此,存儲字符串的物理存儲單元數比括在雙引號中的字符數多一個。
注:C語言對字符串長度沒有限制,程序掃描到‘\0’結束符表示字符串完。字符串常量存儲靜態存儲區。
標准庫函數strlen(char *str)返回字符串 str 的長度( 即空值結束符之前字符數目)。
下面設計strlen函數的一個版本:
int strlen(const char s[]) { int i = 0; while (s[i] != '\0') { ++i; } return i; }
5、枚舉常量
枚舉是一個常量整型值的列表。
// 預留業務類型 enum RTBPUB_RESVYPE { RESVYPE_IB = 0, //綜合帳務 RESVYPE_OCE = 1, //在線計費 RESVYPE_HB = 2, //離線計費 RESVYPE_OCECHARGE = 5 //在線計費充值 };
(1) 枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號“ ,”隔開。
(2) RTBPUB_RESVYPE是一個標識符,可以看成這個集合的名字,是一個可選項,即是可有可無的項。
(3) 如果不給枚舉賦值,那麼第一個枚舉成員的默認值為整型的0,後續枚舉成員的值在前一個成員上加1。
(4) 可以設定枚舉成員的值,從而自定義某個范圍內的整數。
(5) 枚舉型是預處理指令#define的替代。
6、常量表達式
常量表達式是僅僅只包含常量的表達式,這種表達式在編譯時求值,而不是在運行時求值。
#define MAXLINE 1000 char g_szline[MAXLINE + 1];
四、聲明
變量都必須先聲明後使用,一個聲明指定一種變量類型。可以在聲明同時對變量進行初始化,在聲明中,如果變量名的後面緊跟一個等號以及一個表達式,該表達式就充當對變量進行初始化的初始化表達式。
int i = 0; int ilen = MAX + 100;
注:聲明語句說明變量的名字和類型,也可以指定變量的初值(初始化)。
任何變量的聲明都可以使用 const 限定符限定,該限定符指定變量的值不能被修改;對數組而言,const 限定符指定數組所有元素值都不能被修改。
const int PI = 3.14; const char msg[] = "00000"; int strlen ( const char s[]);
五、算術運算符
二元算術運算符包括:+,-,*,/,%(取模運算符)。
注:整數除法會截取結果中的小數部分。表達式 x % y 的結果是x除以y的余數,當x能被y整除時,其值為0,取模運算符%不能應用於float和double類型。
六、關系運算符和邏輯運算符
1、關系運算符包括下列幾個運算符:
> >= < <=
注:他們具有相同優先級。
有兩個等性運算符(特殊關系運算符) == != ,優先級僅次於關系運算符。
注:關系運算符的優先級比算術運算低。
2、邏輯運算包括下面兩個運算符:
&& ||
邏輯運算有些特殊的屬性,有 && 與 || 連接的表達式按從左到右的順序進行求值,並且,在知道結果值為真或為假後立即停止計算。
運算符&&的優先級比||的優先級高,但兩者都比關系運算符和等性運算符的優先級低。
注:根據定義,在關系表達式或邏輯表達式中,如果關系為真,則表達式的結果值的數值為1;如果為假,則結果值的數值為0。邏輯非運算符 ! 的作用是將非0操作數轉換為0,將操作數0轉換為1。
/* atoi函數:將字符串S轉換為相應的整型數*/ int atoi(const char s[]) { int i; int n = 0; for(i=0; s[i]>='0' && s[i]<='9'; i++) { n = 10 * n + (s[i] - '0'); } return n; }
(類型名)表達式;
/* strcat函數:將字符串拼接*/ void strcat(char s[], char t[]) { int i = 0; int j = 0; while(s[i] != '\0') { i++; } while((s[i++] = t[j++]) != '\0') /*拷貝*/ { ; } }