【C 語言】結構體相關 的 函式 指標 陣列
.
作者 : 萬境絕塵
.
結構體概述 : 結構體是 多個 變數的集合, 變數的型別可以不同;
-- 可進行的操作 : 結構體可以進行 拷貝 賦值操作, 可以作為 函式引數 和 函式返回值;
1. 結構體的基本使用
結構體宣告 : struct 結構標記 {結構成員} 普通變數;
-- 結構體示例 :
struct student
{
char *name;
int age;
};
-- 結構標記 : struct 後面的 student 是結構標記, 這個標記 可寫 可不寫, 其作用是 為結構命名, 結構標記可以代表 {} 中的宣告的所有的成員變數;
-- 結構成員 : 在 {} 中定義的變數就是結構成員;
-- 普通變數 : 在宣告結構體的時候後面可以加上若干普通變數, 相當於定義結構體變數;
結構體變數宣告 : 可以在定義的時候宣告變數, 也可以在定義完結構體使用 結構標記 宣告變數;
-- 定義結構體時宣告變數 : 這種宣告變數的方式可以不用 結構標記, 變數名寫在 花括號 後面, 用頭號隔開;
struct student
{
char *name;
int age;
} s1, s2, s3;
-- 使用結構標記宣告 : 結構標記 student 代表了花括號的宣告, 是 結構體的簡寫, 可以使用結構標記代替花括號中的內容;
struct student s4, s5, s6;
結構體記憶體分配
結構體變數初始化 :
-- 宣告結構體的時候初始化 : struct student s1 = {"Tom", 12} ; 注意 初值表中必須時結構體對應型別的常量表達式;
-- 宣告之後初始化 : 結構體變數名.成員名 可以訪問結構體中的成員變數, s1.name = "Tom"; s2.age = 12;
結構體巢狀 : 結構體中的成員變數可以是 結構體變數;
struct student { char *name; int age; } s1; struct class { struct student s1; struct student s2; } c1;
結構體程式碼示例 :
/*************************************************************************
> File Name: base_struct.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014年03月24日 星期一 10時49分46秒
************************************************************************/
#include<stdio.h>
int main(int argc, char **argv)
{
/*
* 宣告結構體 同時宣告變數s1
*/
struct student
{
char *name;
int age;
} s1;
/*
* 結構體巢狀
*/
struct class
{
struct student s1;
struct student s2;
} c1;
struct student s2 = {"Tom", 12};/*只有宣告的時候才能對結構體初始化才能使用花括號賦值*/
struct class c2 = {{"Jack", 13}, {"Pig", 15}};
s1.name = "Hack"; /*變數聲明後對結構體賦值只能一個一個賦值*/
s1.age = 14;
//s1 = {"fuck", 1}; /*只有在初始化的時候才能使用 花括號初始化結構體變數*/
c1.s1.name = "CJ";
c1.s1.age = 21;
c1.s2.name = "KW";
c1.s2.age = 22;
/*訪問結構體中的變數, 使用 . 進行訪問*/
printf("s1 : name = %s, age = %d \n", s1.name, s1.age);
printf("s2 : name = %s, age = %d \n", s2.name, s2.age);
printf("c1 : s1 : name = %s, age = %d ; s2 : name = %s, age = %d \n", c1.s1.name, c1.s1.age, c1.s1.name, c1.s2.age);
printf("c2 : s1 : name = %s, age = %d ; s2 : name = %s, age = %d \n", c2.s1.name, c2.s1.age, c2.s1.name, c2.s2.age);
return 0;
}
執行結果 :
[email protected]:~/code/c/struct$ gcc base_struct.c
[email protected]:~/code/c/struct$ ./a.out
s1 : name = Hack, age = 14
s2 : name = Tom, age = 12
c1 : s1 : name = CJ, age = 21 ; s2 : name = CJ, age = 22
c2 : s1 : name = Jack, age = 13 ; s2 : name = Jack, age = 15
2. 結構體與函式
結構體的合法操作 :
-- 整體複製 : 結構體可以複製;
-- 整體賦值 : 宣告結構體的時候可以整體賦值, 在其它情況下不可以;
-- & 取地址 : 使用 & 運算子獲取 結構體地址;
-- 訪問成員 : 使用 結構體變數名.成員變數名 可以訪問成員變數;
函式傳遞結構體方法 :
-- 傳遞結構體成員 : 將結構體拆開, 將其中的成員變數分別傳入;
struct class create_class(struct student s2, struct student s3)
{
struct class c1 = {s2, s3};
return c1;
}
-- 傳遞結構體 : 將整個結構體當做引數傳入, 這種情況和傳遞其它型別引數一樣, 都是通過值傳遞的;
struct class create_class(struct student s2, struct student s3)
{
struct class c1 = {s2, s3};
return c1;
}
-- 傳遞結構體指標 : 傳遞結構體的指標, 訪問形式如下;
/*
* 傳入一個結構體指標
* 通過指標訪問結構體的方法 :
* (*結構體指標變數).成員變數 訪問;
* 結構體指標變數 -> 成員變數 訪問;
*/
void printf_struct_pointer(struct student *s)
{
printf("student : (*s).name = %s, (*s).age = %d \n", (*s).name, (*s).age);
printf("student : s->name = %s, s->age = %d \n", s->name, s->age);
}
結構體指標訪問 :
-- 示例 : 定義一個結構體指標;
struct student
{
char *name;
int age;
}*p;
-- "." 和 "->"優先順序 : 這兩個運算子都是從左到右運算, 都是右結合; "." 和 "->" 優先順序比 "*" , "++" 優先順序要高; 這兩個運算子 與 () [] 是四個優先順序最高的運算子;
-- ++p->age 分析 : 是對結構體中的 age 進行自增操作;
-- *p->name 分析 : 獲取 結構體中的 name 字串的值(注意不是指標|地址);
-- *p++->name 分析 : 先獲取 name 字串的值, 再將p自增;
結構體函式示例 :
/*************************************************************************
> File Name: method_struct.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014年03月24日 星期一 14時46分16秒
************************************************************************/
#include<stdio.h>
/*宣告一個結構體型別, 其成員變數是普通變數*/
struct student
{
char *name;
int age;
};
/*宣告一個結構體型別, 其成員變數是結構體*/
struct class
{
struct student s1;
struct student s2;
};
/*
* 傳遞 2 個結構體的成員變數
* 在函式中建立結構體並返回
*/
struct student create_student(char *name, int age)
{
struct student s1 = {name, age};
return s1;
}
/*
* 傳遞 2 個結構體變數
*/
struct class create_class(struct student s2, struct student s3)
{
struct class c1 = {s2, s3};
return c1;
}
/*
* 傳入一個結構體指標
* 通過指標訪問結構體的方法 :
* (*結構體指標變數).成員變數 訪問;
* 結構體指標變數 -> 成員變數 訪問;
*/
void printf_struct_pointer(struct student *s)
{
printf("student : (*s).name = %s, (*s).age = %d \n", (*s).name, (*s).age);
printf("student : s->name = %s, s->age = %d \n", s->name, s->age);
}
int main(int argc, char **argv)
{
/*使用函式獲取一個結構體, 傳入結構體的值*/
struct student s1 = create_student("Tom", 11);
printf("student : name = %s, age = %d \n", s1.name, s1.age);
/*建立一個成員變數是結構體的結構體, 並列印結構體資料*/
struct class c1 = create_class(create_student("Jack", 12), create_student("CJ", 13));
printf("c1 : s1 : name = %s, age = %d ; s2 : name = %s, age = %d \n", c1.s1.name, c1.s1.age, c1.s2.name, c1.s2.age);
/*宣告結構體指標*/
struct student *p = &s1;
printf_struct_pointer(p);
return 0;
}
執行結果 :
[email protected]:~/code/c/struct$ gcc method_struct.c
[email protected]:~/code/c/struct$ ./a.out
student : name = Tom, age = 11
c1 : s1 : name = Jack, age = 12 ; s2 : name = CJ, age = 13
student : (*s).name = Tom, (*s).age = 11
student : s->name = Tom, s->age = 11
3. 結構體陣列
(1) 結構體陣列宣告初始化
宣告結構體陣列 :
-- 宣告結構體的時候宣告結構體陣列 : 格式為 : struct 結構標記 {} 陣列名[];
-- 使用結構標記宣告結構體陣列 : 格式為 : struct 結構標記 陣列名[];
結構體陣列宣告初始化 :
-- 逐個元素初始化 : 陣列名[] = {{結構體1}, {結構體2}};
-- 總體初始化 : 陣列名[] = {常量1, 常量2 ...};
結構體初始化 :
/*************************************************************************
> File Name: array_struct.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014年03月24日 星期一 16時40分15秒
************************************************************************/
#include<stdio.h>
/*
* 宣告結構體
* 同時也宣告結構體型別陣列
* 為陣列初始化
* 直接將每個結構體成員的值依次列出即可
*/
struct student
{
char *name;
int age;
} team1[] =
{
"Tom", 12,
"Jack", 13
};
int main(int argc, char **argv)
{
int i;
/*將每個結構體初始化, 賦值, 每個結構體初始化內容使用 花括號括起來*/
struct student team2[] = {{"CJ", 34}, {"KI", 32}};
for(i = 0; i < 2; i++)
{
printf("team1 : team1[i].name = %s, team1[i].age = %d \n", team1[i].name, team1[i].age);
}
for(i = 0; i < 2; i++)
{
printf("team2 : team2[i].name = %s, team2[i].age = %d \n", team2[i].name, team2[i].age);
}
return 0;
}
執行結果 :
[email protected]:~/code/c/struct$ gcc array_struct.c
[email protected]:~/code/c/struct$ ./a.out
team1 : team1[i].name = Tom, team1[i].age = 12
team1 : team1[i].name = Jack, team1[i].age = 13
team2 : team2[i].name = CJ, team2[i].age = 34
team2 : team2[i].name = KI, team2[i].age = 32
(2) 結構體陣列示例程式
需求 : 實現一個統計 C 語言關鍵字出現次數;
程式碼 :
/*************************************************************************
> File Name: word_count.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014年03月24日 星期一 17時12分32秒
************************************************************************/
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define MAXWORD 10
/*
* 定義結構體型別 key
* 該型別結構體中儲存一個 字串(關鍵字) 和 int 資料(關鍵字出現次數)
* 同時宣告一個結構體陣列
* 對結構體陣列進行初始化
*
*
*/
struct key
{
char *word;
int count;
}key_count[] =
{
"auto", 0,
"break", 0,
"case", 0,
"char", 0,
"const", 0,
"continue", 0,
"default", 0,
"void", 0,
"volatitle", 0,
"while", 0
};
int main(int argc, char **argv)
{
int n;
char word[MAXWORD];
/*迴圈接收字串, 如果字串與結構體陣列中匹配, 結構體的count ++*/
while(getword(word, MAXWORD) != EOF)
if(isalpha(word[0]))
if((n = binsearch(word, key_count, 10)) >= 0)
key_count[n].count++;
/*列印大於0的關鍵字 及 個數*/
for (n = 0; n < 10; n ++)
if(key_count[n].count > 0)
printf("%2d %s\n", key_count[n].count, key_count[n].word);
return 0;
}
/*
* 重要api解析 :
* int getc(FILE *stream) 從標準輸入流中讀取字元
* int ungetc(int c, FILE *stream) 將字元退回到標準輸入流中
* int isspace(int c) 判斷字元是否是 空格 '\f' '\r' '\n' '\t' '\v'
* int isalpha(int c) 判斷是否是字母
*/
int getword(char *word, int lim)
{
int c, getc(FILE*), ungetc(int, FILE*);
char *wp = word;
/*過濾空格, 如果輸入的不是 空, 就繼續向下執行*/
while(isspace(c = getc(stdin)));
/*如果輸入的不是結束符, 那麼 wp指標, 先取值, 之後地址自增*/
if(c != EOF)
*wp++ = c;
/*如果輸入的不是字母, 直接返回, 關鍵字裡面沒有數字開頭的*/
if(!isalpha(c))
{
*wp = '\0';
return c;
}
/*
* 迴圈條件 a. 接收的最大字元個數 lim, 每讀取一個字元, 該變數自減
* 當該變數自減為0時停止迴圈接收字串
* 迴圈條件 b. 當讀取到的字元 不是 字母 或者數字的時候, 停止迴圈
*/
for(; --lim > 0; wp++)
{
if(!isalnum(*wp = getc(stdin)))
{
ungetc(*wp, stdin);
break;
}
}
*wp = '\0';
return word[0];
}
/*
* 引數解析 : word 是要查詢的字串 tab 字串陣列 n 字串大小
*/
int binsearch(char *word, struct key tab[], int n)
{
/*
* cond 判斷 查詢的字串 是在mid 座標之前 (<0) 之後(>0) 或者就是mid座標
*
* 如果查詢的不是正好中間的變數符合, 就返回 -1 失敗
*/
int cond, low, high, mid;
low = 0;
high = n - 1;
/*
* 要找的值的下標在low 和 high之間
* mid 是 low 和 high 的中值
* 如果 word 小於中值下標 將比較範圍 縮小
*/
while(low <= high)
{
mid = (low + high) / 2;
if((cond = strcmp(word, tab[mid].word)) < 0)
high = mid - 1;
else if(cond > 0)
low = mid + 1;
else
return mid;
}
return -1;
}
執行結果 :
[[email protected] struct]# gcc word_count.c
[[email protected] struct]# ./a.out
auto
break
break
char
1 auto
2 break
1 char
巨集定義方法 : 獲取結構體陣列大小;
-- sizeof 方法 : sizeof (物件) | sizeof (型別名稱) 可以獲取物件 或者 型別佔用的儲存空間, 其返回值是 size_t 型別的, 定義在stddef.h 標頭檔案中;
-- 使用型別測量 :
#define KEYS (sizeof(key_count) / sizeof(struct key))
-- 使用物件測量 : #define KEYS (sizeof(key_count) / sizeof(struct key_count[0])
4. 指向結構體指標
(1) 使用指標方式實現上面的關鍵字統計程式
使用指標進行二分查詢 :
-- 使用下標找中值 : 在之前找中值時通過 mid = (low + high)方法, 這樣做可行是因為 low 從0開始的;
-- 如果是指標情況 : mid low high 都是指標, 那麼就不能使用上面的那種方法了, 使用 mid = low + (high - low) / 2;.
-- 指標操作情況的 high 和 low : 其中 low 是首元素的 首地址, high 是 尾元素的尾地址, 只有這樣 它們的差的 0.5 倍才是準確的中值的首地址;
指標指向陣列注意點 : 不要生成非法的指標, 指標不能指向陣列之外的元素;
-- &key_count[-1] : 這個指標時非法的;
-- &key_count[n] : 對陣列的最後一個元素後面的第一個元素進行 & 運算時合法的, 其它操作都是非法的;
示例程式 :
/*************************************************************************
> File Name: pointer_struct.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: Tue 25 Mar 2014 12:31:08 AM CST
************************************************************************/
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define MAXWORD 20
/*計算結構體陣列的大小*/
#define KEYS (int)(sizeof(key_count) / sizeof(struct key))
struct key
{
char *word;
int count;
} key_count[] =
{
"auto", 0,
"break", 0,
"case", 0,
"char", 0,
"const", 0
};
int getword(char *, int);
struct key *binsearch(char*, struct key*, int);
int main(int argc, char **argv)
{
char word[MAXWORD];
struct key *p; /*存放查詢方法返回的結構體指標, 該指標指向陣列中查詢到元素的下標*/
while(getword(word, MAXWORD) != EOF)
if(isalpha(word[0]))
if((p = binsearch(word, key_count, KEYS)) != NULL)
p->count++;
for(p = key_count; p < key_count + KEYS; p++)
if(p->count > 0)
printf("%2d %s \n", p->count, p->word);
return 0;
}
/*
* 沒有迴圈控制變數的 for 迴圈, 在內部通過條件 break
*/
int getword(char *word, int max)
{
int c, getc(FILE*), ungetc(int, FILE*);
char *wp = word;
/*處理第一個字元, 第一個字元不是 空 不是 EOF 再進行下面的操作*/
while(isspace(c = getc(stdin)));
if(c != EOF)
*wp++ = c;
if(!isalpha(c))
{
*wp = '\0';
return c;
}
/*迴圈接收字串, 字串接收到非識別符號 或者 到達個數上限停止迴圈*/
for(; --max > 0; wp++)
if(!isalnum(*wp = getc(stdin)))
{
ungetc(*wp, stdin);
break;
}
*wp = '\0';
return word[0];
}
/*
* 注意點 :
* 取兩個地址的中值 : 一個數組n個元素, 其中值計算 是由 首元素的首地址 和 尾元素的尾地址計算的
* 二分查詢 :
* 如果要把區間前移, 那麼就需要將尾地址設定為 中間元素前一個元素的尾地址, 即中間元素的首地址
* 如果要把區間後移, 那麼就需要將首地址設定為 中間元素後一個元素的首地址, 即中間元素 + 1 的地址
*
* 指向結構體陣列的指標 :
* struct key tab * 是指向結構體陣列指標, 該指標可以操作結構體陣列
*/
struct key *binsearch(char *word, struct key *tab, int n)
{
int cond;
struct key *low = &tab[0]; /*0元素的首地址*/
struct key *high = &tab[n]; /*尾元素的尾地址*/
struct key *mid;
while(low < high)
{
/*計算中間值的地址*/
mid = low + (high - low) / 2;
if((cond = strcmp(word, mid->word)) < 0)
high = mid; /*mid 是 中間元素前一個元素的尾地址*/
else if(cond > 0)
low = mid + 1; /*這裡low要成為mid後一個元素的首地址*/
else
return mid;
}
return NULL;
}
執行結果 :
[email protected]:~/code/c/struct$ gcc pointer_struct.c
[email protected]:~/code/c/struct$ ./a.out
auto
case
auto
break
2 auto
1 break
1 case
(2) 結構體大小討論
結構體陣列指標算術運算 : struct key *p = word_count; 指標 p 指向 結構體陣列, 如果 p + 1 , 結果是 p 地址 加上 結構體所佔記憶體大小;
結構體大小 : 結構體的大小不是完全等於各個成員的長度之和, 物件之間有對齊要求;
-- 空穴 : 物件間對齊, 會產生空穴, 佔有空間, 但是不儲存資料;
示例 : 結構體中由一個 char 和 int , 佔用的空間卻是 8個位元組, 它們的和是 5個位元組;
/*************************************************************************
> File Name: memory_struct.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014年03月25日 星期二 12時55分45秒
************************************************************************/
#include<stdio.h>
struct word
{
char c;
int i;
};
int main(int argc, char **argv)
{
printf("sizeof(struct word) = %d \n", sizeof(struct word));
return 0;
}
執行結果 :
[email protected]:~/code/c/struct$ gcc memory_struct.c
[email protected]:~/code/c/struct$ ./a.out
sizeof(word) = 8
.
作者 : 萬境絕塵
.
相關推薦
【C 語言】結構體相關 的 函式 指標 陣列
.作者 : 萬境絕塵.結構體概述 : 結構體是 多個 變數的集合, 變數的型別可以不同;-- 可進行的操作 : 結構體可以進行 拷貝 賦值操作, 可以作為 函式引數 和 函式返回值;1. 結構體的基本使用結構體宣告 : struct 結構標記 {結構成員} 普通變數;-- 結
【C語言】結構體
1.結構體 a.概念:結構是一些值得集合,這些值成為成員變數。結構的每個成員可以是不同型別的變數。 b.宣告: eg宣告一個學生資訊的結構體。 struct Stu { char name[20]; short int age;
【C語言】結構體包含指向自己的指標
執行環境:VC6.0 例子程式:tets.c ************************************************************************************************* #include <stdio.h> struct x
【C語言】結構體、聯合,記憶體對齊規則總結
一、結構體 1.1什麼是結構體 在C語言中,結構體是一種資料結構,是C提供的聚合型別(C提供了兩種聚合型別:陣列和結構)的一種。結構體與陣列的區別是:陣列是相同型別的集合,而結構體可能具有不同的型別。 結構體也可以被宣告為變數,陣列或者指標等,用以實現較複雜的
【C語言】結構體,列舉,聯合
一.結構體型別建立 結構體是一些值的集合,這些值稱為成員變數。結構體的每一個成員可以是不同型別的變數。 1.結構體的宣告 struct tag { member-list; }variable-list; 舉例: 描述一個學生 struct Stu { &
【C語言】malloc()和free()函式的講解以及相關記憶體洩漏問題
1、函式原型及說明: void *malloc(long NumBytes):該函式分配了NumBytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回一個空指標(NULL)。 關於分配失敗的原因,應該有多種,比如說空間不足就是一種。 void free(void *FirstByte): 該
【C語言】第三章-函式-2
第2節 函式呼叫 函式呼叫一般有兩種方式,一種是形參不會影響實參的傳值呼叫,另一種是形參會影響實參的傳址呼叫。 傳值呼叫 傳值呼叫是將實參的值傳入函式體中,傳入的不過是實參的副本,不會改變實參。這個在上一節已經講過其中的原因正式因為C語言副本傳參的這個特
黑馬程式設計師——C語言基礎——結構體相關練習
今天整理了C語言基礎學習過程中對結構體的一些知識,下面是程式碼片段: #include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) { //定義
【C語言】模擬實現strchr函式.即在一個字串中查詢一個字元第一次出現的位置並返回
//模擬實現strchr函式.即在一個字串中查詢一個字元第一次出現的位置並返回 #include <stdio.h> //#include <string.h> #includ
【C語言】標準庫字串函式整理
strcmp 字串比較 函式原型 extern int strcmp(const char *s1,const char *s2); 說明 C/C++函式,比較兩個字串 設這兩個字串為str1,str2, 若str1==str2,則返回零; 若str1<
【C語言】 使用回撥函式實現氣泡排序
實現功能:既能排序整型數,也可以排序字串 程式碼如下: #include <stdio.h> #include <string.h> int int_cmp(const v
【c語言】模擬實現strchr函式,功能:在一個字串中查詢一個字元第一次出現的位置,如果沒有出現返回NULL
// 模擬實現strchr函式,功能:在一個字串中查詢一個字元第一次出現的位置,如果沒有出現返回NULL #include <stdio.h> #include <assert.h> char const* my_strchr(char cons
【c語言】模擬實現strcat函式
簡介:strcat函式是連線兩個字串。例如:有char *str1 = “abcd”,char *str2 = “efg”,strcat (str1,str2)可以將efg連線到abcd後面,結果是abcdefg,並且存放在str1中。 函式原型:extern
【c語言】實現翻轉字串函式reverse_string
函式reverse_string(char * string) 實現:將引數字串中的字元反向排列。 要求:不能使用C函式庫中的字串操作函式。 #include <stdio.h> #in
【C語言】用遞迴函式是實現函式功能的幾個例子
1.問題描述:寫一個遞迴函式DigitSum(n),輸入一個非負整數,返回組成它的數字之和。例如,呼叫DigitSum(1729),則應該返回1+7+2+9,它的和是19。 思路:這個題比較類似於求拆分整數,一個一個輸出。這個題多得一步是在拆分後,將這些數字加
【c語言】帶你真正走進指標的世界——陣列與指標的關係(一)
每天下課之後,都感覺老師上課在神仙程式設計,我們一群凡人在底下面無表情地走神,前一秒還是在講加減乘除的基本用法,後一秒就變成了指標陣列、陣列指標、結構體指標和N級指標的性質以及運用............(真是令人頭禿 —^—) ——————
【c語言】帶你真正走進指標的世界——那些一不小心就會出現的BUG
Let's &nbs
【c語言】帶你真正走進指標的世界——指標的特性
當你看到這篇文章時,請忘掉你之前對指標的所有認知,什麼地址什麼的統統忘掉。
C++類 給結構體成員 函式指標 賦值
myStruct標頭檔案 myStruct.h class CMyClass; struct { int nFlag; void (CMyClass::*myinit)(int n); void (CMyClass::*myopen)(int n,void* arg)
【C語言】讓你不再害怕指標——C指標詳解(經典,非常詳細)
前言:複雜型別說明 要了解指標,多多少少會出現一些比較複雜的型別,所以我先介紹一下如何完全理解一個複雜型別,要理解複雜型別其實很簡單,一個型別裡會出現很多運算子,他們也像普通的表示式一樣,有優先順序,其優先順序和運算優先順序一樣,所以我總結了一下其原則:從變數名處起,根