C99之后可以用const int來表示常量,初始化后不能再被賦值。

整數(shù)和整數(shù)運(yùn)算只會(huì)得到整數(shù)。當(dāng)有浮點(diǎn)數(shù)參與運(yùn)算的時(shí)候,就會(huì)變成浮點(diǎn)數(shù)。
整數(shù)用int(輸入輸出都是%d),浮點(diǎn)數(shù)double(輸入%lf,輸出%f)。
運(yùn)算符優(yōu)先級(jí):
| 優(yōu)先級(jí) | 運(yùn)算符號(hào) | 運(yùn)算意義 | 結(jié)合關(guān)系 |
|---|---|---|---|
| 1 | + - | 正、負(fù) | 自右向左 |
| 2 | * / % | 乘、除、取余 | 自左向右 |
| 3 | + - | 加、減 | 自左向右 |
| 4 | = | 賦值 | 自右向左 |
=賦值語句,也是運(yùn)算,也是有結(jié)果的。
比如a=b=6在C語言中,自右向左運(yùn)算a=(b=6),意義是:b=6的結(jié)果是6,再賦給a。
雖然可以“嵌套式賦值”(比如int c = 1 + (b=a)),但不建議這么做。
調(diào)試運(yùn)行的時(shí)候,下一步和單步進(jìn)入,是有區(qū)別的。
復(fù)合賦值運(yùn)算符:+=、-=、*=、/=。
遞增遞減運(yùn)算符:++、–。
| 表達(dá)式 | 運(yùn)算 | 表達(dá)式的值 |
|---|---|---|
| count++ | 給count加1 | count原來的值 |
| ++count | 給count加1 | count+1的值 |
| count- - | 給count減1 | count原來的值 |
| - -count | 給count減1 | count-1的值 |
scanf("%d,%d"),scanf("%d %d"),scanf("%d, %d")、scanf("%d %d\n")這四種方式是不同的。scanf()函數(shù)用于接收輸入進(jìn)來的東西,返回值是接收了幾個(gè)東西。
對于空格和回車,會(huì)等待后續(xù)輸入。
對于其他非%d數(shù)據(jù),scanf()函數(shù)接收失敗,返回成功接收的個(gè)數(shù),但會(huì)繼續(xù)執(zhí)行下一條語句。
%x為16進(jìn)制的輸入或輸出,%o為8進(jìn)制的輸入或輸出。
取余運(yùn)算的應(yīng)用:number%10運(yùn)算可提取出number的個(gè)位數(shù)字。
輾轉(zhuǎn)相除法、判斷素?cái)?shù)等,都用到了取余符號(hào)。
關(guān)系運(yùn)算(<、<=、>、>=、==、!=):自左向右運(yùn)算,且==和!=的運(yùn)算級(jí)低。
語句a==b==6,實(shí)際上就是判斷1==6,最終結(jié)果是0。
語句6>5>4,實(shí)際上就是判斷1>4,最終結(jié)果是0。
if語句中,if(條件){語句},注意分號(hào)和大括號(hào)。
switch語句中,case只是入口。如果不break,語句會(huì)繼續(xù)執(zhí)行。
do…while循環(huán),while括號(hào)里的都是循環(huán)的條件(雖和直覺不符。但和while循環(huán)保持了一致)。
continue和break的差別,continue跳出當(dāng)前循環(huán),break跳出整個(gè)循環(huán)。
goto語句在多層循環(huán)嵌套時(shí)候使用,其他場合不建議使用。
sizeof()函數(shù)是靜態(tài)函數(shù),比如sizeof(a++)語句編譯后,a++不執(zhí)行。
&&與運(yùn)算會(huì)屏蔽0后的語句、||或運(yùn)算會(huì)屏蔽1后的語句。
補(bǔ)碼=反碼+1。
浮點(diǎn)數(shù)是有精度的。判斷兩個(gè)浮點(diǎn)數(shù)是否相等,應(yīng)采用fabs(f1-f2)<=1e-12。
char型變量其實(shí)是一種特殊的int類型:int a = 49和char c ='A',
按照%d輸出時(shí),輸出的都是49,
按照%c輸出時(shí),輸出的都是'1'。
綜上,a+'a'-'A'或a+'A'-'a'就可以進(jìn)行大小寫轉(zhuǎn)換。
逗號(hào)運(yùn)算符,,主要是用在for語句里用。
C語言調(diào)用函數(shù)時(shí),是值傳遞。
本地變量、局部變量:定義在大括號(hào)(塊)里。
生存期、作用域:大括號(hào)(塊)里。
塊里定義的變量,塊外無效。
塊外定義的便令,塊里也有效。
如果塊里定義了與塊外同名變量,屏蔽掉塊外的變量。
同一個(gè)c文件里,函數(shù)聲明和定義的頭,必須一致,否則會(huì)編譯出錯(cuò)。
f(a,b)和f( (a,b) )不一樣,前者傳了2個(gè)參數(shù),后者傳了1個(gè)參數(shù)。
函數(shù)里面可以聲明另一個(gè)函數(shù),但不能定義另一個(gè)函數(shù)。
C99之前,數(shù)組元素?cái)?shù)量必須是編譯時(shí)刻確定了的字面量。
數(shù)組一旦創(chuàng)建,長度固定。
數(shù)組創(chuàng)建后,最好要初始化。數(shù)組的訪問,不能越界(即超過大下標(biāo))。
數(shù)組的集成初始化:int a[]={1,2,3,4,5,6};。int a[]={[1]=2,4,[5]=6};。
數(shù)組長度算法:sizeof(a)/sizeof(a[0]);。
數(shù)組變量不能互相賦值:int b[] = a;這種寫法是錯(cuò)誤的。只能遍歷數(shù)組,每個(gè)元素依次賦值。
數(shù)組作為參數(shù)傳入函數(shù)時(shí),應(yīng)把數(shù)組長度一同傳入。
原因:數(shù)組作為參數(shù)時(shí),傳入的只是地址。
unix系統(tǒng)下,可以使用man sqrt命令,查閱sqrt函數(shù)。
求素?cái)?shù)的方法:方法一 順序往下挑選、方法二 剔除已有素?cái)?shù)的倍數(shù)。
二維數(shù)組,列數(shù)不可以省略,行數(shù)可以。int a[][5] = {{1,2,3,4,5},{6,7,8,9,0}};。
運(yùn)算符&:對變量取地址,不能是表達(dá)式,如&(i+p)或&(i++)等做法是錯(cuò)誤的。
printf()函數(shù)里用%p來輸出地址。
對于一個(gè)數(shù)組a[]來說,a和&a和&a[0]都是相同的,都是a的首地址。
作為參數(shù)的指針,在函數(shù)里面可以通過這個(gè)指針訪問外面這個(gè)i。
如果只是傳值,那么調(diào)用的函數(shù)無法改變外面的i。
但是傳了i的地址,那么就能對地址里面的東西進(jìn)行改動(dòng),也就是把i進(jìn)行改動(dòng)。
賦值號(hào)的左邊不一定是個(gè)變量,也有可能是個(gè)運(yùn)算表達(dá)式的結(jié)果,這就叫左值。*p就是p取內(nèi)容的運(yùn)算,但是可以被賦值,所以*p是左值。a[0]就是a取0位置內(nèi)容的運(yùn)算,但是可以被賦值,所以a[0]是左值。
指針的應(yīng)用,使得被調(diào)用的函數(shù)能夠更改原來函數(shù)的變量!
一般情況下,函數(shù)使用return返回運(yùn)行狀態(tài),使用指針返回值。
指針必須進(jìn)行初始化,即指向某個(gè)變量的地址。否則將會(huì)是一個(gè)“野指針”,很危險(xiǎn)。
傳數(shù)組,實(shí)際上就是在傳地址。所以說,被調(diào)用的函數(shù)可以改外部函數(shù)的數(shù)組元素!
但sizeof(a)在內(nèi)外卻不等,因?yàn)橥饷娴?code>sizeof(a)求的是整個(gè)數(shù)組地址所占長度,里面的sizeof(a)求的是首地址的長度。
數(shù)組變量本身表達(dá)地址,因此int *p = a;無需用&來取地址。
數(shù)組名就是地址指針,因此a等價(jià)于&a[0]。[]運(yùn)算符可以對數(shù)組做,也可以對指針做:p[0]等價(jià)于a[0]。*運(yùn)算符也可以對數(shù)組做:*a。
實(shí)質(zhì):數(shù)組就是常量指針,所以不能被賦值。int a[]等價(jià)于int * const a。
指針與const
int i;
const int* p1 = &i; // *p1是const,即不能通過*p1修改i
int const* p2 = &i; // *p2是const,即不能通過*p2修改i
int *const p3 = &i; // p3是const,即p3只能指向i,等價(jià)于數(shù)組void f(const int* x);,表示f()不會(huì)改動(dòng)傳來的指針的指向的值。
const數(shù)組:const int a[]={1,2,3,4,5,6,},這樣的話,內(nèi)部的函數(shù)不會(huì)修改外部數(shù)組了。
指針p、q可以遞增/遞減,即進(jìn)行p++、p--、p-q運(yùn)算。p=p+1,實(shí)際上指的是,將p指到下一個(gè)單元。
而數(shù)組實(shí)際上就是特殊的指針,因此:*p等價(jià)于a[0],*(p+1)等價(jià)于a[1]。
*p++:取出p的東西,順便把指針向后移動(dòng)一次。舉例:
for( int i=0; i< sizeof(a)/sizeof(a[0]) ; i++ ){printf("%d\n",a[i]);
}
// 可以改寫成:
char *p = a[];
while( *p != -1 ){printf("%d\n", *p++);
}指針是可以比較的,比如數(shù)組中的單元的地址就是線性遞增的。
不建議使用0地址,但可以初始化為NULL。
類型不同的指針不能互相賦值。除非進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
void*表示不知道指向什么東西的指針。經(jīng)常在比較底層的情況下應(yīng)用到。
在C99之前(ANSI C)時(shí),如何用變量定義數(shù)組的大小呢?
使用stdlib.h中的函數(shù)malloc()。int *a = (int*) malloc(n*sizeof(int));
原因:malloc()函數(shù)申請到的是一塊(void*)類型的地址空間,以字節(jié)為單位,需要強(qiáng)制類型轉(zhuǎn)化為(int*)。
接下來,把a當(dāng)作數(shù)組來用。如a[0]。
最后,用了malloc()就要釋放掉,即free(a)。
但是系統(tǒng)空間是有限的,malloc()不一定總能成功的申請到需要的空間。malloc()返回值為1代表申請成功,返回值為0代表申請失敗。
free()函數(shù)只能釋放掉malloc()來的地址。
常見問題:
(1)malloc了沒free,會(huì)導(dǎo)致運(yùn)行內(nèi)存逐漸下降。
(2)free過了再去free。
(3)地址變了,直接去free。
字符串以'\0'結(jié)束,但它不是字符串的一部分。計(jì)算這個(gè)字符串長度的時(shí)候不包括這個(gè)'\0'。
字符串以數(shù)組形式存在,以指針形式訪問。
因此,可以通過遍歷數(shù)組的方式來遍歷字符串。
對字符串進(jìn)行操作時(shí),需要#include。
字符串的定義形式:
由雙引號(hào)括起來的東西Hello,叫字符串的字面量.
字符數(shù)組長度為6,因?yàn)榻Y(jié)尾還有'\0'。
char *str = "Hello";
char word[] = "Hello";
char line[10] = "Hello";char *s = "Hello, world!"中:
這種寫法,會(huì)把"Hello, world!"寫在常量空間里,實(shí)際上s是const char *s,不允許寫入操作,賦值只能靠初始化。s是個(gè)指針,初始化為指向一個(gè)字符串常量。
試圖對s所指的字符串做寫入會(huì)導(dǎo)致嚴(yán)重后果。
char s[] = "Hello, world!"中:
這種寫法,會(huì)把"Hello, world!"寫在變量空間里。
在程序運(yùn)行結(jié)束后,會(huì)被自動(dòng)回收。
這兩種寫法如何選擇?
數(shù)組形式:作為本地變量,空間自動(dòng)回收。
指針形式:只讀、處理參數(shù)、動(dòng)態(tài)分配空間。
如果要處理一個(gè)字符串,用數(shù)組。
如果要構(gòu)造一個(gè)字符串,用指針。
char*不一定是字符串,它本意是“指向char型單個(gè)變量的指針”。
符串賦值,實(shí)質(zhì)上是讓指針s指向了指針t所指的字符串,任何對s的操作就是對t做的,因?yàn)閷τ谧址x值符號(hào)賦的是地址。
char *t = "Hello";
char *s;
s = t;使用scanf()來讀字符串時(shí),讀到空格、tab、回車為止。scanf("%7s",string);表示讀入字符串最多7位。
常見錯(cuò)誤:
char * string;
scanf("%s", string);
// 指針string很有可能指向了一個(gè)危險(xiǎn)的地方。
// 改正方法:
// 1. 賦初值,但以后無法更改
// 2. 數(shù)組形式定義字符串變量
char buffer[100] = "";
// 這是一個(gè)空字符串,buffer[0]=='\0'
char buffer[] = "";
// 這個(gè)數(shù)組長度只有1,放不下任何東西char **a,char a[][10],char *a[],這三者是不同的。char **a:表示a是一個(gè)指針,指向另一個(gè)指針,那個(gè)指針指向一個(gè)字符(串)char a[][10]:表示a是一個(gè)二維數(shù)組變量,每一個(gè)元素都是一個(gè)含有10個(gè)元素的一維數(shù)組。char *a[]:表示a是一個(gè)存放指針的一維數(shù)組,每個(gè)指針都指向一個(gè)char型變量。
main(int argc, char const *argv[])
這里的*argv[]表示:main()函數(shù)調(diào)用的參數(shù)。
常常在命令行中使用到。
int putchar(int c)函數(shù):返回寫了幾個(gè)字符,EOF(-1)表示寫失敗。
int getchar(void)函數(shù):返回類型是int,是為了返回EOF(-1)。
windows環(huán)境下Ctrl+Z表示輸入結(jié)束;Unix環(huán)境下Ctrl+D表示輸入結(jié)束。
通過下面的例子,可以感受到 shell 的存在和工作機(jī)制。
輸入設(shè)備和用戶程序之間有緩沖區(qū),這個(gè)緩沖區(qū)會(huì)在不同編譯環(huán)境下有不同的工作機(jī)制。
另外,搭建 VScode的 C++ 開發(fā)環(huán)境時(shí),win 下使用 powershell 作為終端,ubuntu下默認(rèn)的終端。
這二者對于cout函數(shù)的處理是不一樣的。
前者cout輸出不一定要有endl,后者cout輸出一定要有endl才會(huì)輸出。
int main( int argc, char const *argv[])
{int ch;
while ( ( ch = getchar() ) != EOF ){putchar( ch ) ;
}
printf("EOF\n");
return 0;
// getchar() 是用 int 型變量來接收 char。
// putchar() 是把 int 型變量輸出為 char。
// 這段代碼,輸入什么就輸出什么
// 按下Ctrl+C會(huì)停止程序
// 輸入Ctrl+Z會(huì)輸出EOF
}字符串頭文件string.h里常用的函數(shù):strlen():
形式:size_t strlen(const char *s
功能:返回s的字符串長度(不包括結(jié)尾的\0)
備注:一般情況下,等于sizeof()-1。
字符串頭文件string.h里常用的函數(shù):strcmp():
形式:int strcmp(const char *s1, const char *s2)
功能:比較兩個(gè)字符串并返回0、正數(shù)、負(fù)數(shù)。0表示相等,正數(shù)表示s1大,負(fù)數(shù)表示s2大
比較原則:從第一個(gè)字符開始比較,相同則繼續(xù),不同則相減。任一串讀完則跳出。
備注:s1==s2是warning而非error,因?yàn)?code>s1==s2比較的是地址,而非字符串內(nèi)容。
字符串頭文件string.h里常用的函數(shù):strcpy():
形式:char *strcpy(char *restrict dst, const char *restrict src):
功能:把src的字符串拷貝到dst,并返回dst(最后的\0也拷貝)
備注:restrict表示這兩個(gè)字符串在存儲(chǔ)上不能重疊。
復(fù)制字符串的套路:
char *dst = (char*)malloc (strlen(src)+1);
// 不能用sizeof,src還有可能是指針、數(shù)組
// malloc后最后要free
strcpy(dst,src);字符串頭文件string.h里常用的函數(shù):strcat():
形式:char *strcat(char *restrict s1, const char *restrict s2)
功能:把s2拷貝到s1后面,接成一個(gè)長的字符串,返回s1
原理:把s2的第一個(gè)char寫在s1的\0的位置
備注:s1必須有足夠的空間
strcpy()和strcat()的安全問題:如果目的地沒有足夠空間會(huì)產(chǎn)生安全問題。
因此,盡量使用安全版本。char *strcpy(char *restrict dst, const char *restrict src, size_t n)char *strcat(char *restrict s1, const char *restrict s2, size_t n)int strcmp(const char *s1, const char *s2, size_t n)
其中,strcmp()函數(shù)的n表示,只比較前n個(gè)字符。
字符串中找字符函數(shù)strchr(),分為從左和從右兩個(gè)版本。
利用字符串找字符函數(shù),可以截取字符串中的某段。
字符串中找字符串函數(shù)strstr(),分為不忽略和忽略大小寫兩個(gè)版本。
enum COLOR {RED, YELLOW, BLUE, NumCOLOR};enum COLOR,實(shí)際上就是int,可以用%d進(jìn)行輸出。enum COLOR {RED=1, YELLOW, BLUE=5};結(jié)構(gòu)體聲明、定義一個(gè)結(jié)構(gòu)體變量時(shí),最好放在main()函數(shù)外邊。
結(jié)尾一定要記得寫分號(hào);
// 方式一:先聲明,在定義。結(jié)構(gòu)體類型名:struct date。
struct date{int month;
int day;
};
struct date today, tommorow;
// 方式二:直接定義。結(jié)構(gòu)體類型沒有名字。
struct{int month;
int day;
} today, tommorow;
//方式三:同時(shí)聲明和定義變量。結(jié)構(gòu)體類型名:struct date。
struct date{int month;
int day;
} today, tommorow;結(jié)構(gòu)變量的初始化:struct date today = {.month=4, .day=19}
結(jié)構(gòu)變量的訪問:today.month
結(jié)構(gòu)變量的賦值:
方式一(成員分別賦值):today = (struct date){4, 19};
方式二(變量整體賦值):today = tomorrow;
結(jié)構(gòu)變量的名字就是變量本身,并非地址(與數(shù)組和字符串不同)。
因此對結(jié)構(gòu)變量取地址,&today。
當(dāng)然也可以對結(jié)構(gòu)變量的成員取地址,&today.month
結(jié)構(gòu)體是可以作為函數(shù)參數(shù)、返回值的。
結(jié)構(gòu)體不能直接printf和scanf,但可以自己做類似的函數(shù)。
編寫時(shí),最好使用指針方式。
指向結(jié)構(gòu)體的指針,最好使用->:
struct date *ptoday = &today;
(*ptoday).month = 12;
ptoday->month = 12;視頻11.2 結(jié)構(gòu)與函數(shù)在15分22秒處的例子,把結(jié)構(gòu)體指針做為參數(shù),又把結(jié)構(gòu)體指針作為函數(shù)返回值。因此各個(gè)函數(shù)之間可以互相調(diào)用、賦值。
結(jié)構(gòu)體中有數(shù)組:直接套就行了。
數(shù)組中有結(jié)構(gòu)體:直接套就行了。
結(jié)構(gòu)體中有結(jié)構(gòu)體:直接套就行了。
但注意:成員是變量時(shí)用.,成員是指針時(shí)用->。
普通的數(shù)據(jù)類型:typedef int Length;
定義結(jié)構(gòu)體:
typedef struct ADate{int month;
int day;
} Date;
// 或者省略`ADate`:
typedef struct{int month;
int day;
} Date;
// 定義變量時(shí),可以直接寫
Date today = {4, 19};表面上看起來和struct一樣,但實(shí)際上所有成員占用相同的內(nèi)存空間。
如果發(fā)生重疊,會(huì)“沖掉”原來的值。
union AnElt{int i;
char c[4];
} elt1;
// 當(dāng)然此處也可以用typedef
elt1.c[0] = 'a';
elt1.i = 0xDEADBEEF;
// 此時(shí),后填寫的`i`會(huì)把先填寫的`c`沖掉本例中union的作用:查看int變量中每個(gè)字節(jié)的情況。
當(dāng)然,x86的CPU采用小端形式進(jìn)行存儲(chǔ)數(shù)據(jù)。
因此,如果對上邊的c數(shù)組進(jìn)行遍歷讀取的話,會(huì)得到:c[0]等于0xEF,c[1]等于0xBE,c[2]等于0xAD,c[3]等于0xDE。
定義在函數(shù)外邊的變量,就是全局變量。
字符串__func__,輸出時(shí)自動(dòng)變?yōu)楫?dāng)前函數(shù)名。
int main(){printf("%s", __func__);
return 0;
}全局變量在沒有初始化時(shí),會(huì)得到0值(指針得到NULL)。
全局變量必須使用已知值來初始化。
不能將一個(gè)全局變量賦值給另一個(gè)全局變量。
本地變量會(huì)屏蔽外部的全局變量。
靜態(tài)本地變量,本質(zhì)上就是全局變量。
原因:在程序進(jìn)行編譯時(shí),緊挨著放在放在同一塊區(qū)域中。static int i = 1;
函數(shù)第二次被調(diào)用時(shí)會(huì)保留函數(shù)第一次執(zhí)行后的值。
總結(jié):
本地變量:本地作用域,本地生存期。
全局變量:全局作用域,全局生存期。
靜態(tài)本地變量:本地作用域,全局生存期。
函數(shù)返回指針,不能返回本地變量的地址。
過多使用全局變量和靜態(tài)本地變量,在多線程時(shí)是不安全的。
因此,應(yīng)盡量不要使用全局變量和靜態(tài)本地變量。
#開頭的那一行。#define PI 3.14159,其中PI是宏的名字,3.14159是宏的值。#define:只是文本的替換,經(jīng)常需要加括號(hào)()。#define:可以使用//進(jìn)行注釋。#define:可以定義沒有值的宏。__DATE__、__TIME__等等。#define cube(x) ((x)*(x)*(x))。#define MIN(a,b) ((a)>(b)?(b),(a));。將各個(gè)函數(shù)分開放在不同的(.c)文件中。
編譯(compile):對單個(gè)源代碼文件的編譯。
構(gòu)建(build):對整個(gè)項(xiàng)目做鏈接。
如果沒有頭文件(.h),編譯器遇到main()里陌生的函數(shù)會(huì)亂猜。
因此,頭文件里包括了函數(shù)的聲明,用來作為不同源文件之間的橋梁。
#include用來插入對應(yīng)的頭文件中的文本內(nèi)容。
#include后的<>用于自帶頭文件,""用于用戶頭文件。
一般來說,任何c文件都有對應(yīng)的h文件。
頭文件中還包括了,在源文件中的全局變量的聲明。extern int AllVariable;
頭文件中,建議只放聲明。
同一個(gè)編譯單元里,同名的結(jié)構(gòu)不能被重復(fù)聲明。
因此,有標(biāo)準(zhǔn)頭文件結(jié)構(gòu)。
#ifnedf _MAX_H_
#define _MAX_H_
#endif你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站題目:【C++筆記】1.C語言復(fù)習(xí)-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://chinadenli.net/article10/edddo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、域名注冊、商城網(wǎng)站、企業(yè)網(wǎng)站制作、面包屑導(dǎo)航、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容