1. 程式人生 > >C語言學習筆記1

C語言學習筆記1

C語言學習筆記

逗號表示式

例:設a和b為整型變數,執行語句b=(a=2+3,a*4),a+5;後,a和b的值為?
答案: a = 5, b = 20

	note:
				1、逗號表示式形如:表示式1, 表示式2, ... , 表示式n。
				2、整個逗號表示式的值為最後一個表示式的值。
				3、逗號表示式可以和賦值表示式等結合。	
				4、逗號表示式的優先順序最低。
				5、逗號表示式的運算順序從左到右(沒有其它運算時,例如:括號、賦值)。

解釋:
1、2 + 3, 2 * 4, 2 + 5 為逗號表示式。

2、2 + 3, 2 * 4, 2 + 5這個表示式的值為最後一個表示式的值:2 + 5 = 7。

3、a = 2 + 3, a * 4, a + 5,逗號表示式與賦值表示式的結合。

4、b = (a = 2 + 3, a * 4), a + 5
這句逗號表示式中結合了賦值運算和運算優先順序,其中“括號” > “賦值” > “逗號”。

運算步驟為:

A、 先計算(a = 2 + 3, a * 4),括號裡面是一個逗號表示式,賦值運算的
優先順序高於逗號運算子,則先執行 a = 2 + 3,得出 a = 5;由於逗號表
達式的值是最後一個表示式的值,所以b = a * 4 = 20。

B、 這個逗號表示式b = (a = 2 + 3, a * 4), a + 5已經完成了b = (a = 2 + 3, a * 4)的
計算,接下來計算 a + 5,結果為10。所以整個逗號表示式最終的結果為10。
如果把上面表示式改成這樣:c = (b = (a = 2 + 3, a * 4), a + 5),結果c = 10

使用sizeof對 結構體大小計算

例:
struct st
{
int a;
char b;
int c;
long d;
char e;
};
struct st stud;

使用sizeof計算上面結構體的大小。
已知:char佔1個位元組、int佔4個位元組、long佔8個位元組。

結構體大小的計算遵循兩個原則:
1、每個成員的偏移量都必須是當前成員所佔記憶體大小的整數倍如果不是編譯器會在成員之
間加上填充位元組。
2、當所有成員大小計算完畢後,編譯器判斷當前結構體大小是否是結構體中最寬的成員變
量大小的整數倍 如果不是會在最後一個成員後做位元組填充。

			note:
				1、偏移量是指成員實際地址與結構體首地址的的差值。
				2、第一個成員的偏移量為0。
				3、0是所有值的整數倍。
				4、結構體大小:最後一個成員的偏移量 + 最後一個成員的大小 + 末尾的填充位元組數。

現在計算結構體stud的大小:
1、第一個成員 int a :
偏移量: 0, 所佔位元組大小:4
解釋: 偏移量0 是 是變數a所佔位元組大小 4 的整數倍。

2、第二個成員 char b:
偏移量:0 + 4 = 4,所佔位元組大小:1
解釋: 偏移量 4 是 所佔位元組大小 1的整數倍

3、第三個成員 int c:
偏移量:4 + 1 = 5,所佔位元組大小:4
解釋: 偏移量5不是所佔位元組大小的整數倍,所以編輯器自動補上3個空子節使其
當前偏移量:8 是所佔位元組大小:4的整數倍。

4、第四個成員 long d:
偏移量 :8 + 4 = 12, 所佔位元組大小: 8
解釋:偏移量 12 不是所佔位元組大小8的整數倍,所以編輯器自動補上 6 個空子節使其
當前偏移量為:16 是所佔位元組大小 8 的整數倍。

5、第五個成員char e:
偏移量:16 + 8 = 24, 所佔位元組大小:1
解釋: 偏移量24 是所佔位元組大小 1 的整數倍。

6、結構體大小:
最後一個成員的偏移量 + 最後一個成員所佔位元組的大小 = 24 + 1 = 25
25不是結構體成員中最寬位元組 8 (long d)的整數倍,所以編輯器自動補上
7個空子節,最後結構體大小:25 + 末尾填充位元組數 = 25 + 7 = 32。

小知識點

1、 關係運算符的執行結果為“真”或“假”。
關係運算符的優先順序高於賦值運算子。

2、字元’\ddd’表示三位八進位制,其中數字大小不能超過8。
字元’\xhh’表示兩位十六進位制數。