• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            C++查缺補漏4,趕緊的

            Posted on 2012-04-05 14:54 RTY 閱讀(823) 評論(0)  編輯 收藏 引用 所屬分類: 編程常識C/C++轉載隨筆

            請說出const與#define 相比,有何優點?
            答案:
            1) const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤。
                  2) 有些集成化的調試工具可以對const 常量進行調試,但是不能對宏常量進行調試。

            在8086 匯編下,邏輯地址和物理地址是怎樣轉換的?(Intel)
            答案:通用寄存器給出的地址,是段內偏移地址,相應段寄存器地址*10H+通用寄存器內地址,就得到了真正要訪問的地址。

            當一個類A 中沒有生命任何成員變量與成員函數,這時sizeof(A)的值是多少,如果不是零,請解釋一下編譯器為什么沒有讓它為零。(Autodesk)
            答案:肯定不是零。舉個反例,如果是零的話,聲明一個class A[10]對象數組,而每一個對象占用的空間是零,這時就沒辦法區分A[0],A[1]…了。

             描述內存分配方式以及它們的區別?
            1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量
            2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集。
            3) 從堆上分配亦稱動態內存分配。程序在運行的時候用malloc 或new 申請任意多少的內存,程序員自己負責在何時用free 或delete 釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但問題也最多。

             main 函數執行以前,還會執行什么代碼?
            答案:全局對象的構造函數會在main 函數之前執行。

             C++是不是類型安全的?
            答案:不是。兩個不同類型的指針之間可以強制轉換(用reinterpret cast)。C#是類型安全的。

             

            有哪幾種情況只能用intialization list 而不能用assignment?

             

            答案:當類中含有const、reference 成員變量;基類的構造函數都需要初始化表。

            define DOUBLE(x) x+x ,i = 5*DOUBLE(5); i 是多少?
            答案:i 為30

            New delete 與malloc free 的聯系與區別?
            答案:都是在堆(heap)上進行動態的內存操作。用malloc函數需要指定內存分配的字節數并且不能初始化對象,new 會自動調用對象的構造函數。delete 會調用對象的destructor,而free 不會調用對象的destructor.

             

            1、寫一個“標準”宏,這個宏輸入兩個參數并返回較小的一個。
            .#define Min(X, Y) ((X)>(Y)?(Y):(X))//結尾沒有;
            2、嵌入式系統中經常要用到無限循環,你怎么用C編寫死循環。
            while(1){}或者for(;;)
            3、關鍵字static的作用是什么?
            定義靜態變量
            4、關鍵字const有什么含意?
            表示常量不可以修改的變量。
            5、關鍵字volatile有什么含意?并舉出三個不同的例子?
            提示編譯器對象的值可能在編譯器未監測到的情況下改變。

             


            int (*s[10])(int) 表示的是什么啊
            int (*s[10])(int) 函數指針數組,每個指針指向一個int func(int param)的函數。

             


            1.有以下表達式:
            int a=248; b=4;int const c=21;const int *d=&a;
            int *const e=&b;int const *f const =&a;
            請問下列表達式哪些會被編譯器禁止?為什么?
            *c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
            *c 這是個什么東東,禁止
            *d 說了是const, 禁止
            e = &a 說了是const 禁止
            const *f const =&a; 禁止
            2.交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;
            有兩種解法, 一種用算術算法, 一種用^(異或)
            a = a + b;
            b = a - b;
            a = a - b; 
            or
            a = a^b;// 只能對int,char..
            b = a^b;
            a = a^b;
            or
            a ^= b ^= a;
            3.c和c++中的struct有什么不同?
            c和c++中struct的主要區別是c中的struct不可以含有成員函數,而c++中的struct可以。c++中struct和class的主要區別在于默認的存取權限不同,struct默認為public,而class默認為private
            4.#i nclude <stdio.h>
            #i nclude <stdlib.h>
            void getmemory(char *p)
            {
                p=(char *) malloc(100);
                strcpy(p,"hello world");
            }
            int main( )
            {
                char *str=NULL;
                getmemory(str);
                printf("%s/n",str);
                free(str);
                return 0;
               }
            程序崩潰,getmemory中的malloc 不能返回動態內存, free()對str操作很危險
            5.char szstr[10];
            strcpy(szstr,"0123456789");
            產生什么結果?為什么?
            長度不一樣,會造成非法的OS
            6.列舉幾種進程的同步機制,并比較其優缺點。
               原子操作 
            信號量機制
               自旋鎖
               管程,會合,分布式系統

             

            7.進程之間通信的途徑
            共享存儲系統
            消息傳遞系統
            管道:以文件系統為基礎
            11.進程死鎖的原因
            資源競爭及進程推進順序非法
            12.死鎖的4個必要條件
            互斥、請求保持、不可剝奪、環路
            13.死鎖的處理
            鴕鳥策略、預防策略、避免策略、檢測與解除死鎖
            15.   操作系統中進程調度策略有哪幾種?
            FCFS(先來先服務),優先級,時間片輪轉,多級反饋
            8.類的靜態成員和非靜態成員有何區別?
            類的靜態成員每個類只有一個,非靜態成員每個對象一個
            9.純虛函數如何定義?使用時應注意什么?
            virtual void f()=0;
            是接口,子類必須要實現
            10.數組和鏈表的區別
            數組:數據順序存儲,固定大小
            連表:數據可以隨機存儲,大小可動態改變

             

            12.ISO的七層模型是什么?tcp/udp是屬于哪一層?tcp/udp有何優缺點?
            應用層
            表示層
            會話層
            運輸層
            網絡層
            物理鏈路層
            物理層
            tcp /udp屬于運輸層
            TCP 服務提供了數據流傳輸、可靠性、有效流控制、全雙工操作和多路復用技術等。
            與 TCP 不同, UDP 并不提供對 IP 協議的可靠機制、流控制以及錯誤恢復功能等。由于 UDP 比較簡單, UDP 頭包含很少的字節,比 TCP 負載消耗少。
            tcp: 提供穩定的傳輸服務,有流量控制,缺點是包頭大,冗余性不好
            udp: 不提供穩定的服務,包頭小,開銷小  

             


            1:(void *)ptr 和 (*(void**))ptr的結果是否相同?其中ptr為同一個指針
            .(void *)ptr 和 (*(void**))ptr值是相同的
            2:int main()
               {
                int x=3;
                printf("%d",x);
                return 1;
               
               }
            問函數既然不會被其它函數調用,為什么要返回1?
            mian中,c標準認為0表示成功,非0表示錯誤。具體的值是某中具體出錯信息

             


            1,要對絕對地址0x100000賦值,我們可以用
            (unsigned int*)0x100000 = 1234;
            那么要是想讓程序跳轉到絕對地址是0x100000去執行,應該怎么做?
            *((void (*)( ))0x100000 ) ( );
            首先要將0x100000強制轉換成函數指針,即:
            (void (*)())0x100000
            然后再調用它:
            *((void (*)())0x100000)();
            用typedef可以看得更直觀些:
            typedef void(*)() voidFuncPtr;
            *((voidFuncPtr)0x100000)();
            2,已知一個數組table,用一個宏定義,求出數據的元素個數
            #define NTBL
            #define NTBL (sizeof(table)/sizeof(table[0]))

             

            面試題: 線程與進程的區別和聯系? 線程是否具有相同的堆棧? dll是否有獨立的堆棧?
            進程是死的,只是一些資源的集合,真正的程序執行都是線程來完成的,程序啟動的時候操作系統就幫你創建了一個主線程。

             

            每個線程有自己的堆棧。
            DLL中有沒有獨立的堆棧,這個問題不好回答,或者說這個問題本身是否有問題。因為DLL中的代碼是被某些線程所執行,只有線程擁有堆棧,如果DLL中的代碼是EXE中的線程所調用,那么這個時候是不是說這個DLL沒有自己獨立的堆棧?如果DLL中的代碼是由DLL自己創建的線程所執行,那么是不是說DLL有獨立的堆棧?

             

            以上講的是堆棧,如果對于堆來說,每個DLL有自己的堆,所以如果是從DLL中動態分配的內存,最好是從DLL中刪除,如果你從DLL中分配內存,然后在EXE中,或者另外一個DLL中刪除,很有可能導致程序崩潰

             


            unsigned short A = 10;
            printf("~A = %u\n", ~A);

             

            char c=128; 
            printf("c=%d\n",c);

             

            輸出多少?并分析過程
            第一題,~A =0xfffffff5,int值 為-11,但輸出的是uint。所以輸出4294967285
            第二題,c=0x10,輸出的是int,最高位為1,是負數,所以它的值就是0x00的補碼就是128,所以輸出-128。
            這兩道題都是在考察二進制向int或uint轉換時的最高位處理。

             

            分析下面的程序:
            void GetMemory(char **p,int num)
            {
                *p=(char *)malloc(num);
                
            }        
            int main()
            {
                char *str=NULL;
                
                GetMemory(&str,100);
                
                strcpy(str,"hello");
                
                free(str);
                
                if(str!=NULL)
                {
                    strcpy(str,"world");
                }    
                    
                printf("\n str is %s",str);
                getchar();
            }    
            問輸出結果是什么?希望大家能說說原因,先謝謝了
            輸出str is world。
            free 只是釋放的str指向的內存空間,它本身的值還是存在的.
            所以free之后,有一個好的習慣就是將str=NULL.
            此時str指向空間的內存已被回收,如果輸出語句之前還存在分配空間的操作的話,這段存儲空間是可能被重新分配給其他變量的,
            盡管這段程序確實是存在大大的問題(上面各位已經說得很清楚了),但是通常會打印出world來。
            這是因為,進程中的內存管理一般不是由操作系統完成的,而是由庫函數自己完成的。
            當你malloc一塊內存的時候,管理庫向操作系統申請一塊空間(可能會比你申請的大一些),然后在這塊空間中記錄一些管理信息(一般是在你申請的內存前面一點),并將可用內存的地址返回。但是釋放內存的時候,管理庫通常都不會將內存還給操作系統,因此你是可以繼續訪問這塊地址的,只不過。。。。。。。。樓上都說過了,最好別這么干。

             

            char a[10],strlen(a)為什么等于15?運行的結果

             

            #i nclude "stdio.h"
            #i nclude "string.h"

             

            void main()
            {

             

            char aa[10];
            printf("%d",strlen(aa));
            }

             

            sizeof()和初不初始化,沒有關系;
            strlen()和初始化有關。

             


            char (*str)[20];/*str是一個數組指針,即指向數組的指針.*/
            char *str[20];/*str是一個指針數組,其元素為指針型數據.*/

             

            long a=0x801010;
            a+5=?
            0x801010用二進制表示為:“1000 0000 0001 0000 0001 0000”,十進制的值為8392720,再加上5就是8392725羅

             

            1)給定結構struct A 
            {
                   char t:4;
                   char k:4;
                   unsigned short i:8;
                   unsigned long m;
            };問sizeof(A) = ?
            給定結構struct A 
            {
                   char t:4; 4位
                   char k:4; 4位
                   unsigned short i:8; 8位      
                   unsigned long m; // 偏移2字節保證4字節對齊
            }; // 共8字節
            2)下面的函數實現在一個數上加一個數,有什么錯誤?請改正。
            int add_n ( int n )
            {
                static int i = 100;
                i += n;
                return i;
            }
            當你第二次調用時得不到正確的結果,難道你寫個函數就是為了調用一次?問題就出在 static上?

             


            // 幫忙分析一下
            #i nclude<iostream.h>
            #i nclude <string.h>
            #i nclude <malloc.h>
            #i nclude <stdio.h>
            #i nclude <stdlib.h>
            #i nclude <memory.h>
            typedef struct AA
            {
                    int b1:5;
                    int b2:2;
            }AA;
            void main()
            {
                    AA aa;
                    char cc[100];
                     strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
                   memcpy(&aa,cc,sizeof(AA));
                    cout << aa.b1 <<endl;
                    cout << aa.b2 <<endl;
            }
            答案是 -16和1
            首先sizeof(AA)的大小為4,b1和b2分別占5bit和2bit.
            經過strcpy和memcpy后,aa的4個字節所存放的值是:
            0,1,2,3的ASC碼,即00110000,00110001,00110010,00110011
            所以,最后一步:顯示的是這4個字節的前5位,和之后的2位
            分別為:10000,和01
            因為int是有正負之分  所以:答案是-16和1

             

            求函數返回值,輸入x=9999; 
            int func ( x )

                int countx = 0; 
                while ( x ) 
                { 
                    countx ++; 
                    x = x&(x-1); 
                } 
                return countx; 

            結果呢?
            知道了這是統計9999的二進制數值中有多少個1的函數,且有
            9999=9×1024+512+256+15

             

            9×1024中含有1的個數為2;
            512中含有1的個數為1;
            256中含有1的個數為1;
            15中含有1的個數為4;
            故共有1的個數為8,結果為8。
            1000 - 1 = 0111,正好是原數取反。這就是原理。
            用這種方法來求1的個數是很效率很高的。
            不必去一個一個地移位。循環次數最少。

             

            int a,b,c 請寫函數實現C=a+b ,不可以改變數據類型,如將c改為long int,關鍵是如何處理溢出問題
            bool add (int a, int b,int *c)
            {
            *c=a+b;
            return (a>0 && b>0 &&(*c<a || *c<b) || (a<0 && b<0 &&(*c>a || *c>b)));
            }

             


            分析:
            struct bit 
            {   int a:3; 
                int b:2; 
                int c:3; 
            }; 
            int main() 

            bit s; 
            char *c=(char*)&s; 
               cout<<sizeof(bit)<<endl;
            *c=0x99;
               cout << s.a <<endl <<s.b<<endl<<s.c<<endl; 
                 int a=-1;
               printf("%x",a);
            return 0; 

            輸出為什么是
            4
            1
            -1
            -4
            ffffffff
            因為0x99在內存中表示為 100 11 001 , a = 001, b = 11, c = 100
            當c為有符合數時, c = 100, 最高1為表示c為負數,負數在計算機用補碼表示,所以c = -4;同理 
            b = -1;
            當c為有符合數時, c = 100,即 c = 4,同理 b = 3

             


            位域 :   
            有些信息在存儲時,并不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,并使處理簡便,C語言又提供了一種數據結構,稱為“位域”或“位段”。所謂“位域”是把一個字節中的二進位劃分為幾個不同的區域, 并說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:     
            struct 位域結構名     
            { 位域列表 };    
            其中位域列表的形式為: 類型說明符 位域名:位域長度     
            例如:     
            struct bs    
            {    
            int a:8;    
            int b:2;    
            int c:6;    
            };    
            位域變量的說明與結構變量說明的方式相同。 可采用先定義后說明,同時定義說明或者直接說明這三種方式。例如:     
            struct bs    
            {    
            int a:8;    
            int b:2;    
            int c:6;    
            }data;    
            說明data為bs變量,共占兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對于位域的定義尚有以下幾點說明:   

             

            1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:     
            struct bs    
            {    
            unsigned a:4    
            unsigned :0 /*空域*/    
            unsigned b:4 /*從下一單元開始存放*/    
            unsigned c:4    
            }    
            在這個位域定義中,a占第一字節的4位,后4位填0表示不使用,b從第二字節開始,占用4位,c占用4位。   

             

            2. 由于位域不允許跨兩個字節,因此位域的長度不能大于一個字節的長度,也就是說不能超過8位二進位。   

             

            3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:     
            struct k    
            {    
            int a:1    
            int :2 /*該2位不能使用*/    
            int b:3    
            int c:2    
            };    
            從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。   

             

            二、位域的使用位域的使用和結構成員的使用相同,其一般形式為: 位域變量名•位域名 位域允許用各種格式輸出。    
            main(){    
            struct bs    
            {    
            unsigned a:1;    
            unsigned b:3;    
            unsigned c:4;    
            } bit,*pbit;    
            bit.a=1;    
            bit.b=7;    
            bit.c=15;    
            pri

             

            改錯:
            #i nclude <stdio.h>

             

            int main(void) {

             

                int **p;
                int arr[100];

             

                p = &arr;

             

                return 0;
            }
            解答:
            搞錯了,是指針類型不同,
            int **p; //二級指針
            &arr; //得到的是指向第一維為100的數組的指針
            #i nclude <stdio.h>
            int main(void) {
            int **p, *q;
            int arr[100];
            q = arr;
            p = &q;
            return 0;
            }

             


            下面這個程序執行后會有什么錯誤或者效果:
            #define MAX 255
            int main()
            {
               unsigned char A[MAX],i;//i被定義為unsigned char
               for (i=0;i<=MAX;i++)
                  A[i]=i;
            }
            解答:死循環加數組越界訪問(C/C++不進行數組越界檢查)
            MAX=255 
            數組A的下標范圍為:0..MAX-1,這是其一..
            其二.當i循環到255時,循環內執行:
            A[255]=255;
            這句本身沒有問題..但是返回for (i=0;i<=MAX;i++)語句時,
            由于unsigned char的取值范圍在(0..255),i++以后i又為0了..無限循環下去.

             

            struct name1{
               char str;
               short x;
               int   num;
            }

             

            struct name2{
               char str;
               int num;
               short x;
            }

             

            sizeof(struct name1)=8,sizeof(struct name2)=12
            在第二個結構中,為保證num按四個字節對齊,char后必須留出3字節的空間;同時為保證整個結構的自然對齊(這里是4字節對齊),在x后還要補齊2個字節,這樣就是12字節。

             

            intel:
            A.c 和B.c兩個c文件中使用了兩個相同名字的static變量,編譯的時候會不會有問題?這兩個static變量會保存到哪里(棧還是堆或者其他的)?
            static的全局變量,表明這個變量僅在本模塊中有意義,不會影響其他模塊。
            他們都放在數據區,但是編譯器對他們的命名是不同的。
            如果要使變量在其他模塊也有意義的話,需要使用extern關鍵字。

             

            struct s1
            {
            int i: 8;
            int j: 4;
            int a: 3;
            double b;
            };

             

            struct s2
            {
            int i: 8;
            int j: 4;
            double b;
            int a:3;
            };

             

            printf("sizeof(s1)= %d\n", sizeof(s1));
            printf("sizeof(s2)= %d\n", sizeof(s2));
            result: 16, 24
            第一個struct s1
            {
            int i: 8;
            int j: 4;
            int a: 3;
            double b;
            };
            理論上是這樣的,首先是i在相對0的位置,占8位一個字節,然后,j就在相對一個字節的位置,由于一個位置的字節數是4位的倍數,因此不用對齊,就放在那里了,然后是a,要在3位的倍數關系的位置上,因此要移一位,在15位的位置上放下,目前總共是18位,折算過來是2字節2位的樣子,由于double是8字節的,因此要在相對0要是8個字節的位置上放下,因此從18位開始到8個字節之間的位置被忽略,直接放在8字節的位置了,因此,總共是16字節。

             

            第二個最后會對照是不是結構體內最大數據的倍數,不是的話,會補成是最大數據的倍數

             

            上面是基本問題,接下來是編程問題:

             


            本人很弱,這幾個題也搞不定,特來求救:
            1)讀文件file1.txt的內容(例如):
            12
            34
            56
            輸出到file2.txt:
            56
            34
            12
            (逆序)
            2)輸出和為一個給定整數的所有組合
            例如n=5
            5=1+4;5=2+3(相加的數不能重復)
            則輸出
            1,4;2,3。
            望高手賜教!!

             

            第一題,注意可增長數組的應用.
            #i nclude <stdio.h>
            #i nclude <stdlib.h>

             

            int main(void)
            {
                     int MAX = 10;
            int *a = (int *)malloc(MAX * sizeof(int));
            int *b;
                
            FILE *fp1;
            FILE *fp2;

             

            fp1 = fopen("a.txt","r");
            if(fp1 == NULL)
            {printf("error1");
                exit(-1);
            }

             

                fp2 = fopen("b.txt","w");
            if(fp2 == NULL)
            {printf("error2");
                exit(-1);
            }

             

            int i = 0;
                int j = 0;

             

            while(fscanf(fp1,"%d",&a[i]) != EOF)
            {
            i++;
            j++;
            if(i >= MAX)
            {
            MAX = 2 * MAX;
            b = (int*)realloc(a,MAX * sizeof(int));
            if(b == NULL)
            {
            printf("error3");
            exit(-1);
            }
            a = b;
            }
            }

             

            for(;--j >= 0;)
               fprintf(fp2,"%d\n",a[j]);

             

            fclose(fp1);
            fclose(fp2);

             

            return 0;
            }

             

            第二題.
            #i nclude <stdio.h>

             

            int main(void)
            {
            unsigned long int i,j,k;

             

            printf("please input the number\n");
            scanf("%d",&i);
                if( i % 2 == 0)
                    j = i / 2;
            else
            j = i / 2 + 1;

             

            printf("The result is \n");
                for(k = 0; k < j; k++)
                 printf("%d = %d + %d\n",i,k,i - k);
            return 0;
            }

             

            #i nclude <stdio.h>
            void main()
            {
            unsigned long int a,i=1;
            scanf("%d",&a);
            if(a%2==0)
            {
                 for(i=1;i<a/2;i++)
                 printf("%d",a,a-i);
            }
            else
            for(i=1;i<=a/2;i++)
                    printf(" %d, %d",i,a-i);
            }

             

            兄弟,這樣的題目若是做不出來實在是有些不應該, 給你一個遞規反向輸出字符串的例子,可謂是反序的經典例程.

             

            void inverse(char *p)
            {
                if( *p = = '\0' ) 
            return;
                inverse( p+1 );
                printf( "%c", *p );
            }

             

            int main(int argc, char *argv[])
            {
                inverse("abc\0");

             

                return 0;
            }

             

            借簽了樓上的“遞規反向輸出”
            #i nclude <stdio.h>
            void test(FILE *fread, FILE *fwrite)
            {
                    char buf[1024] = {0};
                    if (!fgets(buf, sizeof(buf), fread))
            }



            国产成人综合久久久久久| 久久婷婷五月综合97色直播| 一本久久精品一区二区| 国产精品99久久久久久宅男| 俺来也俺去啦久久综合网| 欧洲精品久久久av无码电影| 亚洲精品tv久久久久久久久久| 久久伊人中文无码| 久久久午夜精品| 无码人妻精品一区二区三区久久| 久久久久亚洲AV片无码下载蜜桃| 18禁黄久久久AAA片| 日产精品99久久久久久| 人妻无码αv中文字幕久久| 久久人人爽爽爽人久久久| 久久99精品久久久久久hb无码| 久久久无码精品亚洲日韩按摩| AV无码久久久久不卡网站下载| 51久久夜色精品国产| 久久国产影院| 中文字幕日本人妻久久久免费| 久久久久人妻一区二区三区vr| 99久久久精品| 久久综合色区| 久久久久99精品成人片试看| 国产91久久精品一区二区| 久久久噜噜噜久久| 色偷偷偷久久伊人大杳蕉| 色综合久久最新中文字幕| 久久久这里只有精品加勒比| 国产国产成人精品久久| 日日狠狠久久偷偷色综合96蜜桃 | 91精品国产91久久综合| 日本免费一区二区久久人人澡| 久久亚洲国产精品五月天婷| 少妇高潮惨叫久久久久久| 999久久久免费国产精品播放| 久久精品桃花综合| 国内精品久久久久久野外| 久久亚洲AV无码精品色午夜 | 欧美午夜精品久久久久免费视|