1. 程式人生 > >C語言學習筆記(五)—— 運算子、表示式和語句

C語言學習筆記(五)—— 運算子、表示式和語句

一、運算子

1、賦值運算子:=

        賦值表示式的目的是把值儲存到記憶體位置上,用於儲存值的資料區域統稱為資料物件,使用變數名是標識物件的一種方法。物件指的是實際的資料儲存,左值是用於標識和定位儲存位置的標籤,右值指的是能賦值給可修改左值的量。

void example1() {
	int i;
	i = 100; //將右邊的數值100賦值給左邊的變數
}

2、加減乘除運算子

void example2() {
	int i = 5, j = 3;
	printf("%d\n", i + j);//8
	printf("%d\n", i - j);//2
	printf("%d\n", i * j);//15
	printf("%d\n", i / j);//1 取模
	printf("%d\n", i % j);//2 取餘
	printf("%d\n", -i + j);//-2 符號運算子
}

3、sizeof運算子和size_t型別

        sizeof運算子以位元組為單位返回運算物件的大小,sizeof返回size_t型別的值,它是一個無符號整數。C語言中有一個typedef機制,它允許為現有型別建立別名,如下:

void example3() {
	double typedef haha; //為double建立一個haha的別名
	haha h = 20; //使用haha來宣告一個變數並賦值
	printf("%f\n", h); //20.000000

	size_t t = sizeof(int);//size_t就是個無符號整數型別的別名
	printf("%u\n", t);//4個位元組
}

4、遞增和遞減運算子

++出現在作用的變數前面被稱為字首模式,這種模式是變數先自增再參與其他運算(先自增再使用)

++出現在作用的變數後面被稱為字尾模式,這種模式是變數先參與其他運算再自增(先使用再自增)

void example4() {
	int a = 2, b = 2;
	int prefix, suffix;
	prefix = 10 * ++a; //prefix=30,a先自增再與10相乘,然後將結果賦值給prefix
	suffix = 10 * b++; //suffix=20,b先與10相乘並賦值給suffix,然後b再自增
	printf("prefix = %d ***** suffix = %d", prefix, suffix);//prefix = 30 ***** suffix = 20
}

遞減運算子的運算規則同遞增相同,只需要將++替換成--即可

二、表示式和語句

1、表示式

        表示式是由運算子和運算物件組成,運算物件可以是常量、變數或二者的結合。一些表示式由子表示式組成。每個表示式都有一個值,要獲得這個值,必須根據運算子優先順序規定的順序來執行操作。

void example5() {
	//一些常見的表示式,表示式都有一個值
	int i;
	i = -4 + 6;
	printf("%d\n", i); //2
	int j = 6;
	i = ++j;
	printf("%d\n", i); //7
	int a;
	i = a = 2 + 5;
	printf("%d\n", i); //7
	i = 5 > 3;
	printf("%d\n", i); //1
	i = 6 + (a = 2 + 3);
	printf("%d\n", i); //11
}

2、語句

        語句是C程式的基本構建塊,一條語句相當於一條完整的計算機指令,大部分語句都以 ; 結尾。

void example6() {
	int num; //這只是宣告,不是表示式語句。宣告建立了名稱和型別,併為其分配記憶體位置
	//num = 5 //它只是一個表示式
	num = 5; //這是一個語句

	//下面是一個簡單的迴圈語句(迭代語句)
	int a = 0;
	while (++num < 10)
		a += num;
	printf("%d", a); //0+6+7+8+9=30
}

三、型別轉換與強制型別轉換

1、型別轉換

① 當型別轉換出現在表示式時,無論是unsigned還是signed的char和short都會被自動轉換成int,如有必要會被轉換成unsigned int;

② 涉及兩種型別的運算,兩個值會被分別轉換成兩種型別的更高級別;

③ 型別的級別從高到低依次是:long double、double、float、unsigned long long、long long、unsigned long 、long、unsigned int、int,當long和int的大小相同時,unsigned int比long的級別高;

④ 在賦值表示式語句中,計算的最終結果會被轉換成被賦值變數的型別,這個過程可能會導致型別升級或降級;

⑤ 當作為函式引數傳遞時,char和short被轉換成int,float被轉換成double

2、待賦值的值與目標型別不匹配時

① 目標型別是無符號整型,且待賦的值是整數時,額外的位將被忽略;

② 目標型別是一個有符號整型,且待賦的值是整數,結果因實現而異;

③ 目標型別是一個整型,且待賦的值是浮點數,該行為是未定義的;

3、強制型別轉換

        在某個變數的前面放置用圓括號括起來的型別名,該型別名即是希望轉換成的目標型別,圓括號和它括起來的型別名構成了強制型別轉換運算子。

四、帶引數的函式

void example7();
int main(void) { //使用void關鍵字表明此函式不接受任何引數
	example7(10);//函式呼叫傳遞的值為實際引數,這裡函式呼叫把實際值10傳遞給函式
	return 0;
}

void example7(int n) {//宣告引數,建立形式引數的變數,表明此函式接受一個int型別的引數
	printf("%d", n + 10);//20
}

五、關係運算符與真假值

1、常見的關係運算符

小於:<    小於或等於:<=    等於:==    大於或等於:>=    大於:>    不等於:!=

2、真假值

對於C而言,表示式為真的值是1,表示式為假的值是0

void example8() {
	int a, b;
	a = (10 > 2);
	printf("%d\n", a);//1
	b = (10 < 2);
	printf("%d\n", b);//0
}

3、_Bool型別

        _Bool型別的值只能儲存1(真)和0(假),如果把其他非零的數值賦給_Bool型別的變數,該變數會被設定為1,這反映了C語言把所有非零的值都視為真。

void example9() {
	_Bool b;
	b = 3;
	printf("%d\n", b);	//1
	b = -1;
	printf("%d\n", b);	//1
	b = 0;
	printf("%d\n", b);	//0

	int i = 5, j = 0;
	while (i -= 1) {//i=i-1,當i為0時終止迴圈
		j += i;//j=j+i
	}
	printf("%d", j);//4+3+2+1=10
}

六、其他賦值運算子

+=    例:i +=j,就是i = i + j,如果i = 1,j = 2,則i +=j 運算結果是i = 3

-=  *=  /=  %= 等運算子與+=一致