在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言的進階操作實例講解

Wildesbeast ? 來源:網(wǎng)絡(luò)整理 ? 作者:佚名 ? 2020-10-17 11:00 ? 次閱讀

#include“xxx.c”

1、操作一波

咱們先體驗一波#include“xxx.c”文件能不能用:

參考demo:

1//FileName :main

2#include 《stdio.h》

3#include 《stdlib.h》

4

5/***************************

6* .c文件聲明區(qū)域

7**************************/

8#include “module1.c”

9#include “module2.c”

10

11/***************************

12* Fuction: main

13* Author :(最后一個bug)

14**************************/

15int main(int argc, char *argv[]) {

16

17Fuction1;

18Fuction2;

19printf( “歡迎關(guān)注公眾號:最后一個bugn”);

20return0;

21}

1//FileName: Module1.c

2#include《stdio.h》

3/***************************

4* Fuction: Fuction1

5* Author :(最后一個bug)

6**************************/

7voidFuction1

8{

9printf( “Run Fuction1n”);

10}

1//FileName: Module2.c

2#include《stdio.h》

3/***************************

4* Fuction: Fuction2

5* Author :(最后一個bug)

6**************************/

7voidFuction2

8{

9printf( “Run Fuction2n”);

10}

輸出結(jié)果:

分析一下:

看來這波操作可行,似乎還省去了.h文件,之前bug菌說過,分析.h文件的時候直接把.h文件在對應(yīng)的.c文件中的位置處展開然后進一步分析即可,其實這.c文件也是如此,接著往下看。

參考demo:

1//FileName :main

2#include 《stdio.h》

3#include 《stdlib.h》

4

5char * cBug1 = “bugNo1”; //這里是位置1

6char * cBug2 = “bugNo2”;

7/***************************

8* .c文件聲明區(qū)域

9**************************/

10#include “module1.c”

11#include “module2.c”

12

13//char * cBug1 = “bugNo1”;//這里是位置2

14//char * cBug2 = “bugNo2”;

15

16/***************************

17* Fuction: main

18* Author :(最后一個bug)

19**************************/

20int main(int argc, char *argv[]) {

21

22Fuction1;

23Fuction2;

24printf( “歡迎關(guān)注公眾號:最后一個bugn”);

25return0;

26}

1//FileName: Module2.c

2#include《stdio.h》

3/***************************

4* Fuction: Fuction1

5* Author :(最后一個bug)

6**************************/

7voidFuction1

8{

9printf( “Run Fuction1n”);

10printf( “%sn”,cBug1);

11}

1//FileName: Module2.c

2#include《stdio.h》

3/***************************

4* Fuction: Fuction2

5* Author :(最后一個bug)

6**************************/

7voidFuction2

8{

9printf( “Run Fuction2n”);

10printf( “%sn”,cBug2);

11}

輸出結(jié)果:

分析一下:

我們在位置1進行兩個變量的定義,成功編譯運行得到如上的結(jié)果,符合我們的預(yù)期,然而當(dāng)我們?nèi)サ粑恢?進行位置2的定義,程序卻無法進行編譯,看來跟我們預(yù)期在編譯過程中直接展開.c文件是一致的。

2、有什么用?

這種方式在bug菌的編碼歷史長河中一般只在兩種情況下用到:

1、維護毫無設(shè)計的代碼

有些歷史悠久的項目經(jīng)過了N多位大佬的蹂躪,說實在的代碼結(jié)構(gòu)上已經(jīng)非常可怕了,往往每個源文件內(nèi)容非常之長,為了保持代碼原樣,會采用#include“xxx.c”把這幾的相關(guān)文件嵌入進去,也便于自己后期維護。

2、測試代碼

在前期進行軟件調(diào)試的時候可能自己會在不同的文件中安插不同測試功能函數(shù),通過這樣方法可以方便的引入和剔除。

比如說你需要對源文件中的一些靜態(tài)變量進行相關(guān)的監(jiān)控處理,然而又不想在本文件中增加測試代碼,于是便可以在#include“xxx.c”中進行測試函數(shù)的編寫來供使用,比如 :

1//FileName :main

2#include 《stdio.h》

3#include 《stdlib.h》

4

5staticint a = 5;

6/***************************

7* .c文件聲明區(qū)域

8**************************/

9#include “module1.c”

10

11/***************************

12* Fuction: main

13* Author :(最后一個bug)

14**************************/

15int main(int argc, char *argv[]) {

16

17Fuction1;

18printf( “main %dn”,a);

19printf( “歡迎關(guān)注公眾號:最后一個bugn”);

20return0;

21}

1//FileName: Module2.c

2#include《stdio.h》

3/***************************

4* Fuction: Fuction1

5* Author :(最后一個bug)

6**************************/

7voidFuction1

8{

9printf( “Run Fuction1n”);

10printf( “Fuction1 %dn”,a);

11}

注意了!!

那么之前有小伙伴說 : “ static的作用域僅僅在對應(yīng)的文件中 ”,通過上面的多個.c文件使用靜態(tài)a變量,那么這位小伙伴表述就不那么貼切了!

3、技術(shù)總結(jié)

大家在正常的開發(fā)過程中bug菌還是不建議使用#include“xxx.c”,因為在我們程序的設(shè)計過程中,.h文件就是一種外部的引用接口,而.c是對應(yīng)的內(nèi)部實現(xiàn),如果濫用#include“xxx.c”有可能造成函數(shù)等等的重復(fù)定義,同時也對調(diào)試相關(guān)程序帶來一些困擾,當(dāng)然如果游刃有余就沒啥問題的啦。

不過對于喜歡寫長文件的小伙伴來說卻是是福音,把一個長的.c文件分成多個.c文件,這樣至少可以把不知道這種用法的同事面前秀一秀!

void

1、簡單認(rèn)識一下void

void在大部分小伙伴的程序中都只是用于函數(shù)無參數(shù)傳入,或者無類型返回。然而我們平時所定義的變量都會有具體的類型,int,float,char等等,那是否有void類型的變量呢?大家可以動手實驗一下,答案是:不行,編譯會出錯。

上圖很明顯編譯器不允許定義void類型的變量,變量都是需要占用一定內(nèi)存的,既然void表示無類型,編譯器自然也就不知道該為其分配多大的內(nèi)存,于是造成編譯失敗。

雖然void不能直接修飾變量,但是其可以用于修飾指針的指向即無類型指針void*,無類型指針那就有意義了,無類型指針不是一定要指向無類型數(shù)據(jù),而是可以指向任意類型的數(shù)據(jù)。

2、void * 基本操作

大家其實在使用動態(tài)內(nèi)存分配的使用就已經(jīng)遇到了void *的使用,來我們一起看看如下幾個標(biāo)準(zhǔn)函數(shù)的原型定義:

上面這些函數(shù)都是與內(nèi)存操作有關(guān)的函數(shù),可能一些小伙伴使用過也不一定知道每個參數(shù)的具體類型是什么,這些void*部分的形參所傳入的實參都是不需要進行強制類型轉(zhuǎn)化的,所以根本就不需要關(guān)注傳入指針?biāo)赶虻木唧w類型,然而函數(shù)所返回的void *一般都需要通過強制類型轉(zhuǎn)化為對應(yīng)的具體類型,除非你最后所傳遞的變量也是void*類型。

參考void*用法:

1#include 《stdio.h》

2#include 《stdlib.h》

3#include 《malloc.h》

4

5#define NUM 10

6/*************************************

7* Fuction:了解一下void*的使用

8* Author : (最后一個bug)

9*************************************/

10int main(int argc, char *argv[]) {

11int *p1 = (int *)malloc(NUM*sizeof(int));

12int *p2 = (int *)malloc(NUM*sizeof(int));

13int i = 0;

14

15//初始化p1

16for(i = 0;i 《 NUM;i++)

17{

18*(p1+i) = i;

19}

20//進行內(nèi)存copy

21memcpy(p2,p1,NUM*sizeof(int));

22

23//輸出另外一個分配的內(nèi)存

24for(i = 0;i 《 NUM;i++)

25{

26printf( “%d,”,*(p2+i));

27}

28//釋放內(nèi)存

29free(p1);

30free(p2);

31return0;

32}

運行結(jié)果:

3、使用void * 實現(xiàn)無類型數(shù)據(jù)封裝

為了保持文章的完整性,也許這里才是作者最想跟大家介紹的,void*既然如此的靈活一定大有用處,如果僅僅只是用來簡單的傳遞參數(shù)似乎有點大材小用,我們得把其用到上層的軟件設(shè)計上來。

在一些項目中經(jīng)常看到有小伙伴把數(shù)據(jù)類型轉(zhuǎn)來轉(zhuǎn)去,甚至有時候為了一個數(shù)據(jù)類型的變化還得重新寫一個僅僅數(shù)據(jù)類型不同的函數(shù),這樣的代碼上萬行代碼指日可待,按下面我們以一個例子來跟大家介紹一種辦法能夠減少數(shù)據(jù)類型變化所帶來的程序重復(fù)代碼的增加。

參考實例:

1#include 《stdio.h》

2#include 《stdlib.h》

3/**********************************

4* Fuction : add

5* descir : 加法的相關(guān)數(shù)據(jù)及處理辦法

6* Author : (最后一個bug)

7**********************************/

8typedef struct _tag_Add

9{

10int a;

11int b;

12int result;

13}sAdd;

14

15voidAdd( void*param

16{

17sAdd *p = (sAdd *) param;

18p-》result = p-》a + p-》b;

19}

20/**********************************

21* Fuction : add

22* descir : 乘法的相關(guān)數(shù)據(jù)及處理辦法

23* Author : (最后一個bug)

24**********************************/

25typedef struct _tag_Mul

26{

27float a;

28float b;

29float result;

30}sMul;

31

32voidMul( void*param)

33{

34sMul *p = (sMul *) param;

35p-》result = p-》a * p-》b;

36}

37

38/*************************************

39* Fuction : sCal

40* descir : 公共的調(diào)用接口

41* Author : (最后一個bug)

42************************************/

43voidsCal( void*param, void*fuc)

44{

45(( void(*)( void*))fuc)(param);

46}

47

48/**********************************

49* Fuction : main

50* descir : 應(yīng)用接口實例

51* Author : (最后一個bug)

52**********************************/

53int main( void)

54{

55sAdd stAdd;

56sMul stMul;

57

58//數(shù)據(jù)初始化

59stAdd.a = 10;

60stAdd.b = 20;

61

62stMul.a = 5;

63stMul.b = 5;

64//接口直接用

65sCal(&stAdd,Add);

66sCal(&stMul,Mul);

67//對應(yīng)的輸出

68printf( “a + b = %dn”,stAdd.result);

69printf( “a * b = %fn”,stMul.result);

70printf( “公眾號:最后一個bugn”);

71return0;

72}

運行結(jié)果:

分析一下:

上面的例子可能還是無法完全彰顯void*的強悍之處了,不過其主要的作用就是為了隱藏數(shù)據(jù)類型,大家也可以理解為一種數(shù)據(jù)類型的抽象處理,這也是面向?qū)ο?a href="http://m.xsypw.cn/v/tag/1315/" target="_blank">編程的一種體現(xiàn)。

4、技術(shù)總結(jié)

大家一定要記得對于一些編程技巧一定要嘗試著去使用,可能達到項目目標(biāo)的方式有很多種,但是一些好的設(shè)計不僅僅會讓你的代碼增色不少,同時也會讓同事們覺得你是一個喜歡專研技術(shù)的人。

“ 逗號表達式 ”

1、先來一個逗號表達式例子

一個逗號表達式的實例:

1#include 《stdio.h》

2#include 《stdlib.h》

3/******************************************

4* Fuction: Main

5* Descir : 測試一個逗號表達式

6* Author :(最后一個bug)

7*****************************************/

8int main(int argc, char *argv[]) {

9int Val = 1;

10

11Val = ++Val,Val+ 10,Val* 10; //逗號表達式

12

13printf( “Val = %d”,Val);

14

15return0;

16}

分析一下:

大家首先可以自己算一下最后輸出的結(jié)果,然后再去看下面的答案,其實對于逗號表達式的語法規(guī)則并不是很難,主要是大家在平時的開發(fā)中使用得比較少,一旦經(jīng)常不使用就容易淡忘。

逗號表達式的形式 :表達式1,表達式2,。..。..,表達式n

三點搞定:

逗號表達式從表達式1開始順序 從左向右 執(zhí)行;

其逗號表達式最后的值為 最后一個表達式的值 ;

逗號運算的 優(yōu)先級最低 ,也就說明與其他運算符結(jié)合使用的時候,在沒有括號的情況下逗號運算符最后才執(zhí)行。

上面例子的結(jié)果:

可能有部分小伙伴算出的結(jié)果是10,主要是沒有考慮其逗號表達式優(yōu)先級最低,所以第一賦值表達式優(yōu)先執(zhí)行。

2、“不怎么用”是不是就“沒有用”?

既然大家平時都用得不多,是不是這個逗號表達式就是多此一舉呢 ? C發(fā)展這么多年,如果真的沒有價值估計早就不存在了吧,所以還是要秉承著“存在即是合理”的態(tài)度看待逗號表達式。

大家在平時閱讀代碼的時候應(yīng)該都是按照從左至右,然后從上至下來的方式吧。基本上一個分號結(jié)束一行的書寫,由于電腦屏幕的限制,有效代碼暴露在人的視野中是有限的,同時人瞬間記憶時間也是有限的,如果在一個小小的屏幕上閱碼勢必會阻礙程序員的閱讀和理解,比如下面兩種書寫方式:

1/******************************************

2* Fuction: 非逗號表達式書寫

3* Descir :

4* Author :(最后一個bug)

5*****************************************/

6if(IsOk)

7{

8sOkProc;

9returnGetOkCode;

10}

11else

12{

13sNoProc;

14returnGetNoCode;

15}

16/******************************************

17* Fuction: 采用逗號表達式書寫

18* Descir :

19* Author :(最后一個bug)

20*****************************************/

21return(IsOk)?(sOkProc,GetOkCode):(sNoProc,GetNoCode);

分析一下:

上面是兩種代碼書寫方式,第一種占據(jù)了多行,而第二種進占據(jù)一行,這樣同樣 一個屏幕所容納的有效代碼第一種就明顯少于第二種方式 ,所以很多程序員都會選擇使用一種大長屏或者多屏進行開發(fā)。

第二種方式似乎很多小伙伴覺得代碼不夠美觀,也不便于維護,其實這僅僅只是一種習(xí)慣罷了,就好像編碼的時候 : 第一個大括號是否需要另外起一行,或者是使用==號一定要像 if( 1== b) 這樣把數(shù)據(jù)放左邊,當(dāng)你習(xí)慣了這種編碼風(fēng)格也會覺得用第二方式來得直接。

3、逗號表達式常用的地方

下面為大家介紹幾個用逗號表示式比較多的地方:

1、for循環(huán)中的處理

參考demo:

1#include 《stdio.h》

2#include 《stdlib.h》

3#define ROW_NUM ( 5)

4#define LINE_NUM ( 5)

5/******************************************

6* Fuction: Main

7* Descir :for 遍歷查找

8* Author :(最后一個bug)

9*****************************************/

10int main(int argc, char *argv[]) {

11int i = 0,j = 0;

12int Matrix[ROW_NUM][LINE_NUM] ={{ 1, 1, 1, 1, 1},

13{ 2, 2, 2, 2, 2},

14{ 3, 3, 3, 3, 3},

15{ 4, 4, 4, 4, 4},

16{ 5, 5, 5, 5, 5},

17};

18

19for(i = 0,j = 0;(i 《 ROW_NUM)&&(j 《 LINE_NUM);i++,j += 2)

20{

21printf( “Matrix[%d][%d] = %dn”,i,j,Matrix[i][j]);

22}

23printf( “公眾號:最后一個bugn”);

24return0;

25}

分析一下:

上面在for循環(huán)中遍歷相關(guān)數(shù)據(jù)幾比較常規(guī)的處理,也是逗號表達式經(jīng)常出現(xiàn)的地方,這樣的表現(xiàn)形式讓代碼更加簡單明了。

其結(jié)果如下:

2、弱化++處理

大家應(yīng)該都知道++在前先執(zhí)行自加,然后再進行相應(yīng)處理,而++在后則相反,那么我們可以使用逗號運算符優(yōu)先級最低的特點來弱化該問題,避免編碼出現(xiàn)bug。

參考Demo

1#include 《stdio.h》

2#include 《stdlib.h》

3/******************************************

4* Fuction: Main

5* Descir :弱化++前后問題

6* Author :(最后一個bug)

7*****************************************/

8int main(int argc, char *argv[]) {

9int i = 0;

10

11//1、常規(guī)操作

12i = 0;

13while(++i 《 3)

14{

15printf( “ i = %dn”,i);

16}

17printf( “*****************n”);

18

19i = 0;

20while(i++ 《 3)

21{

22printf(“ i= %dn”, i);

23}

24printf(“***************** n”);

25

26// 2、逗號表達式處理一下

27i= 0;

28while( i++, i《 3)

29{

30printf(“ i= %dn”, i);

31}

32printf(“***************** n”);

33

34i= 0;

35while( ++ i, i《 3)

36{

37printf(“ i= %dn”, i);

38}

39printf(“***************** n”);

40

41printf(“公眾號 :最后一個 bugn”);

42return0;

43}

44

分析一下:

當(dāng)使用逗號表達式以后,不管++在前還是在后,其都會自增加1,然后再進行右邊表達式的處理,這樣就不用擔(dān)心是不是多記了一次,導(dǎo)致各種問題。

運行結(jié)果:

3、更加精簡宏定義

參考demo

1#include 《stdio.h》

2#include 《stdlib.h》

3

4#define GET_INDEX(a ,b) ( a+= 2,a + b)

5/******************************************

6* Fuction: Main

7* Descir : 簡化宏

8* Author :(最后一個bug)

9*****************************************/

10int main(int argc, char *argv[]) {

11int i = 0,Val = 0;

12int Param1 = 0, Param2 = 0;

13int Matrix[ 5] ={ 5, 5, 5, 5, 5};

14

15printf( “ Matrix = %dn”,Matrix[GET_INDEX(Param1,Param2)]);

16printf( “公眾號:最后一個bugn”);

17return0;

18}

分析一下:

逗號表達式 最終還是一個表達式 ,所以它可以直接用在幾乎所有變量可以用的地方,這是和語句不同的。

所以逗號表達式左邊的表達式可以預(yù)先進行各種處理,其最右邊的表達式相當(dāng)于返回最后的結(jié)果,從而減少函數(shù)的封裝和調(diào)用。

4、技術(shù)總結(jié)

逗號表達式其實就是橫向編碼的一種方式,能夠讓程序員更好的利用一行的空間,使得代碼更加緊湊,所以使用逗號表達式并沒炫技,而是增強了代碼的靈活度,不過話說回來逗號表達式在C混亂編碼大賽上的使用頻度是非常之高的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    603

    瀏覽量

    34436
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7628

    瀏覽量

    139915
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4365

    瀏覽量

    63931
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    從設(shè)計實例講解單片機C語言高階編程

    本帖最后由 eehome 于 2013-1-5 10:02 編輯 從設(shè)計實例講解單片機C語言高階編程
    發(fā)表于 08-17 16:17

    C語言進階

    C語言進階見附件
    發(fā)表于 08-13 15:51

    設(shè)計實例講解單片機C語言高階編程書籍資料分享

    設(shè)計實例講解單片機C語言高階編程書籍資料分享
    發(fā)表于 12-29 14:32

    C語言進階書分享!

    挺好的。c語言進階.pdf (1.78 MB )
    發(fā)表于 10-16 02:44

    C語言實例解析精粹_曹衍龍

    C語言實例解析精粹(第2版)》主要講解C語言編程涉及的各類常見實例,共分8篇,以基礎(chǔ)篇數(shù)據(jù)結(jié)構(gòu)
    發(fā)表于 12-15 16:44 ?0次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言實例</b>解析精粹_曹衍龍

    單片機IO擴展(進階)程序集合【C語言

    單片機IO擴展(進階)程序集合【C語言】。
    發(fā)表于 01-06 11:04 ?23次下載

    C51語言的基礎(chǔ)知識點實例講解

    本文檔的主要內(nèi)容詳細(xì)介紹的是C51語言的18個基礎(chǔ)知識點實例講解包括了:C51控制語句和C51數(shù)
    發(fā)表于 06-04 17:52 ?12次下載
    <b class='flag-5'>C</b>51<b class='flag-5'>語言</b>的基礎(chǔ)知識點<b class='flag-5'>實例</b><b class='flag-5'>講解</b>

    使用C語言連接oracle數(shù)據(jù)庫的操作實例說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用C語言連接oracle數(shù)據(jù)庫的操作實例說明。
    發(fā)表于 11-01 17:29 ?0次下載
    使用<b class='flag-5'>C</b><b class='flag-5'>語言</b>連接oracle數(shù)據(jù)庫的<b class='flag-5'>操作</b><b class='flag-5'>實例</b>說明

    C語言進階學(xué)習(xí)課件資料合集

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語言進階學(xué)習(xí)課件資料合集包括了:第1節(jié)-數(shù)據(jù)的存儲,第2節(jié)-指針的進階,第3節(jié)-字符串+內(nèi)存函數(shù)的介紹,第4節(jié)-自定義類型詳解(結(jié)構(gòu)體+枚舉+聯(lián)合),第
    發(fā)表于 07-14 08:00 ?13次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>進階</b>學(xué)習(xí)課件資料合集

    C語言基礎(chǔ)知識講解

    C語言基礎(chǔ)知識講解
    發(fā)表于 05-19 17:39 ?15次下載

    OLED顯示模塊(原理講解、STM32實例操作

    OLED顯示模塊(原理講解、STM32實例操作
    發(fā)表于 11-30 14:51 ?74次下載
    OLED顯示模塊(原理<b class='flag-5'>講解</b>、STM32<b class='flag-5'>實例</b><b class='flag-5'>操作</b>)

    C語言進階】sprintf和snprintf的區(qū)別

    C語言進階】sprintf 和 snprintf 真的沒有區(qū)別嗎?
    的頭像 發(fā)表于 08-31 13:18 ?1.3w次閱讀

    C語言進階C語言指針的高階用法

    C語言進階C語言指針的高階用法
    的頭像 發(fā)表于 08-31 13:24 ?2622次閱讀

    C語言進階】利用assert高效排查你的C程序

    C語言進階】利用assert高效排查你的C程序
    的頭像 發(fā)表于 08-31 13:27 ?2383次閱讀

    C語言進階之嵌入式系統(tǒng)高級C語言編程

    電子發(fā)燒友網(wǎng)站提供《C語言進階之嵌入式系統(tǒng)高級C語言編程.rar》資料免費下載
    發(fā)表于 11-18 10:32 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>進階</b>之嵌入式系統(tǒng)高級<b class='flag-5'>C</b><b class='flag-5'>語言</b>編程
    主站蜘蛛池模板: 亚洲 欧美 日韩 丝袜 另类 | 国产普通话一二三道 | 色多多在线播放 | 在线观看一区二区三区四区 | 九九热免费在线观看 | 1024免费看片 | 国产亚洲视频在线播放大全 | 久久午夜国产片 | 最新在线网址 | 免费一级特黄特色大片在线观看看 | 亚洲一区二区免费在线观看 | 欧美黄色免费网站 | 美国色综合 | 久久人视频 | 中文字幕一区二区三区在线播放 | 黄色一级毛片在线观看 | 163黄页网又粗又长又舒服 | 久青草国产手机在线视频 | 国产汉服被啪福利在线观看 | 三级免费观看 | 亚洲午夜久久久精品影院 | 国产三片理论电影在线 | 久久久精品免费国产四虎 | 色伊伊| 深夜免费视频 | 操你啦在线播放 | 在线观看黄色x视频 | 加勒比精品视频 | 黄色顶级视频 | 在线免费观看你懂的 | 国产午夜精品不卡片 | 狠狠噜天天噜日日噜 | 神马午夜影院 | 天天色天天综合 | 99精品国产在热久久 | 天天操天天艹 | 久久成人国产精品免费 | 四虎影院在线免费 | 久久精品国产亚洲片 | 三级在线观看视频网站 | 亚洲最新在线 |