程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言筆記1--類型、運算符與表達式

C語言筆記1--類型、運算符與表達式

編輯:關於C語言

C語言筆記1--類型、運算符與表達式




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。

 七、類型轉換
當一個運算符的幾個操作數類型不同時,就需要通過一些規則把它們轉換為某種共同的類型。
一般來說,自動轉換是指把“比較窄的”操作數轉換為“比較寬的”操作數,並且不丟失信息的轉換。
1、由於 char 類型就是較小的整型,因此在算術表達式中可以自由的使用 char 類型的變量,字符型都將被轉換為整型。
/* 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;
	
}

表達式 s[i] - '0' 能夠計算出s[i]中存儲的字符所對應的數字值,因為ASCII 碼表字符都是相連的。
2、C語言中,很多情況下會進行隱式的算術類型轉換。
一般來說,如果二元運算符的兩個操作具有不同的類型,那麼在進行運算之前先要把“較低”的類型提升為“較高”的類型。
規則:
如果其中一個操作數的類型為long double,則將另一個操作數轉換為long double類型。
如果其中一個操作數的類型為double,則將另一個操作數轉換為double類型。
如果其中一個操作數的類型為float,則將另一個操作數轉換為float類型。
如果其中一個操作數的類型為long,則將另一個操作數轉換為long類型。
將char與short類型的操作數轉換為int類型。 注:一般來說,數學操作使用雙精度double類型的變量。
3、賦值時也要進行類型轉換,賦值運算符右邊的值需要轉換為左邊變量的類型,左邊變量的類型即賦值表達結果的類型。
4、任何表達式中都可以使用一個稱為強制類型轉換的一元運算符強制進行顯式類型轉換。
(類型名)表達式;

八、自增與自減運算符
C語言提供了兩個用於變量遞增與遞減的特殊運算符,自增運算符++使其操作數遞增1; 自減運算符--其操作數遞減1。 ++與--這兩個運算符特殊的地方主要表現在:它們既可以用作前綴運算符(用在變量前面,如++n),也可以用作後綴運算符(用在變量後面,如n++),在這兩種情況下,其效果都是將變量n的值加1。但是,它們之間有一點不同,表達式++n現將n的值遞增1,然後再使用變量n的值,而表達式n++則是先使用變量n的值,然後再將n的值遞增1。
/* strcat函數:將字符串拼接*/
void strcat(char s[], char t[])
{
	int i = 0;
	int j = 0;
	
	while(s[i] != '\0')
	{
		i++;
	}
	
	while((s[i++] = t[j++]) != '\0')  /*拷貝*/
	{
		;
	}
	
}

注:自增與自減運算符只能作用於變量。
九、按位運算符
C語言提供了6個位操作運算符,這些運算符只能作用於整型操作數,即只能作用於帶符號或無符號的char、short、int、long。
& 按位與(AND)
| 按位或(OR)
^ 按位異或(XOR)
<< 左移
>> 右移
~ 按位求反(一元運算符) 1、按位與運算符&經常用於屏蔽某些二進制位。
2、按位或運算符|經常用於將某些二進制位置為1。
3、按位異或運算符^當兩個操作數的對應位不同時將該位設置為1,否則,將該位設置為0。
4、位移運算符<<與>>分別用於將運算的左操作數左移與右移,移動的位數則由右操作數指定(右操作數的值必須是非負值)。
5、一元運算符~用於求整數的二進制反碼,即分別將操作數各二進制位上的1變為0,0變為1。
十、賦值運算符與表達式
在賦值表達式中,如果表達式左邊的變量 重復出現在表達式的右邊。
如:
i = i + 2;
則可以縮寫成:
i += 2; +=稱為賦值運算符。
大多數二元運算符(即有左右兩個操作數的運算符,比如+)都有一個相應的賦值運算op=,其中,op可以是下面這些運算符之一:
+ - * / % << >> & ^ | 注:在所有的這類表達式中,賦值表達式的類型是它的左操作數的類型,其值是賦值操作完成後的值。
十一、條件表達式
條件表達式(使用三元運算符“? : ”) expr1 ? expr2 : expr3 ; 在表達式中,首先計算 expr1,如果其值不等於0(為真),則計算expr2 的值,並以該值作為條件表達式的值,否則計算expr3的值,並以該值作為條件表達式的值。
z = (a > b) ? a : b; /*z = max(a,b)*/ 注: expr2 與expr3中只能有一個表達式被計算。  

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