从C到C++的从零开始学编程第一步步:了解C和C++在语法上的不同

C/C++深层探索_百度百科
声明:百科词条人人可编辑,词条创建和修改均免费,绝不存在官方及代理商付费代编,请勿上当受骗。
C/C++深层探索
《C/C++深层探索》是2002年人民邮电出版社出版的图书,作者是姚新颜。
C/C++深层探索内容介绍
《C/C++ 深层探索》试图通过近50节的内容带领读者从各个方面去把握C/C++的语法、语义,并通过分析C/C++编译器生成的汇编代码,使读者明白C/C++的某些底层实现,从而更加深入地理解C/C++的概念、规则和不足。
《C/C++ 深层探索》没有面面俱到地讲述如何使用C/C++语言编程,而是深入剖析了C/C++语言的历史变化、各项特性及底层实现。《C/C++ 深层探索》试图引领读者不仅在C/C++语言的范围内学习,而且更侧重于从汇编语言的角度、从编译程序和链接程序的角度去了解、分析C/C++语言。通过《C/C++ 深层探索》,希望读者不仅能看清C语言的现在,还会知道C语言的过去,及以把握C语言的未来。
《C/C++ 深层探索》适合已经初步掌握了C/C++的语法,希望从一个更深的层次去了解C/C++的读者。
C/C++深层探索作品目录
Part I 1  00 预备知识 3  01 C/C++语言的发展简史 9  02 关于字节顺序 15  03 调用函数、栈 19  04 变量的可见范围与生存期 27  05 变量的声明和定义 33  06 编译和链接 41  07 外部变量的链接性质 45  08 静态内部变量 51  09 函数的声明和定义(上) 55  10 函数的声明和定义(下) 65  11 函数的链接性质 73
.豆瓣读书[引用日期]C与C++之异同
我的图书馆
C与C++之异同
C与C++之异同C++在任何地方均可宣告变数输出入方式改用cin与cout#include方式不加上.h名称空间(namespace)C++存在预设的类别与物件参考(reference)inline函数函式预设参数函式重载(overloading)1-3C与C++之异同C++之动态记忆体配置使用new/deleteC++提供例外处理新的转型方法新的资料型态bool1-4基本概念语法-所有C语言中之指令在C++ 均可使用-C++为物件导向(object oriented)之程式语言档名-C语言的副档名为.c,而C++的副档名为.cpp注解-在C语言中注解系以/* 为开始,以*/为结束-在C++中//之後一整行均为注解1-5宣告变数C只能在区块开始时宣告变数-例:for (i=1;i&=5; i++){}C++ 可在程式任何地方宣告变数-例:for (int i=0;i< i++)string[i]=string2[i];-例:c=a+b;x=a-b;1-6输入与输出在C中常用的输出入指令为printf与scanf-在使用时需要#include -printf与scanf 在做变数输出入时必须搭配格式使用在C++中常用的输出入指令为cout与cin-在使用时需要#include -新的C++语法为#include 搭配namespace std使用-cout与cin在输出时直接照输出入顺序使用在C++中只需#include 则printf与scanf等C语言函数亦可使用1-7C++之输出: cout在C++中的输出使用cout,不必考虑变数的型态.直接在cout後面加入&&再写上欲输出之值.若有多个值要输出则连续用&&加上欲输出值即可-例:cout && "value";cout &&cout && "Value" &<x;cout &&"Value" && x &&"\n";cout && "Value" && x && ‘\n‘;cout && "Value" &<xx 再写上欲输出之值.-例:cin &&若有多个值要输出则连续用&&加上欲输出值即可,且变数间使用空白做隔开-例:cin && x &&1-9C++之输入: cin输入一整行至一字串中-cin.getline(字串,输入字串的最大长度)-cin.getline(str,80);从键盘输入单一字元-ch=cin.get();1-10Program Hello// This program outputs the message //// Hello!//// to the screen#include int main() {cout &&"Hello!"&&return 0;}1-11名称空间(namespace)namespace用途在於区分同名称之变数与函式,使其均可存在并使用语法namespace 名称空间名称{变数与函式之宣告}namespace与类别写法相类似但不需在最後加上分号1-12名称空间的使用定义於名称空间之变数与函式一定要经过using 才可使用.若不使用using则需直接指定名称空间之使用-using namespace 名称空间名称单独using 一个变数或函式using 名称空间:: 变数名称;using 名称空间:: 函式名称;1-13名称空间同时使用之问题同时using 多个namespace 时其变数与函式不可重复-例:namespace X{void f(){ cout&&" In X::f()\n";}}namespace Y{void f(){ cout&&" In Y::f()\n";}} 不可在程式中同时使用using namespace X; 与using namespace Y;1-14名称空间的例子#include namespace X{void f(){cout&&" In X::f()\n";}void g(){cout&&" In X::g()\n";}}namespace Y{void f(){cout&&" In Y::f()\n";}}using namespace Y // 使用名称Yusing X::g; // 单独usingvoid main(){f(); // 使用Y当中的f()g(); X::g(); // 直接指定}1-15cin / cout 之四种写法写法1:不使用namespace 的观念#include cout &&"Hello\n";写法2:使用namespace std#include cout &&"Hello\n";1-16cin / cout 之四种写法写法3:只using cin 和cout#include using std::using std::using std::cout &&"Hello\n";写法4:直接使用std::cin 与std::cout#include std::cout && "Hello\n";1-17C++提供之类别与参数C++语言本身提供内定之类别与物件-类别-字串类别string-输入档案类别ifstream-输出档案类别ofstream-物件-输出物件cout-输入物件cin-错误讯息输出物件cerr1-18字串类别C++语言本身提供内定之类别与物件-类别-字串类别string-输入档案类别ifstream-输出档案类别ofstream-物件-输出物件cout-输入物件cin-错误讯息输出物件cerr1-19档案类别档案类别(使用时必须#include )-输入档之档案类别ifstream-输出档之档案类别ofstream档案使用之顺序-宣告物件ifstream afile("test.txt"); -开档afile.open(); -读写资料afile &&-关档afile.close();由ifstream与ofstream 宣告之物件可直接使用&&与&& 做输出入1-20参考(Reference)宣告为参考时并不多占记忆体,只是与原有之变数占同一块记忆体.参考所宣告的只是一个名称,必须设定初值为现有之变数参考的语法-type & identifier1=identifier2;-则identifier1与identifier2表相同的变数,有相同之记忆体位置例:int a,b; int&alt=a; // alt 为a 之参考alt=b; // 等於做a=b 的动作alt++; // 等於做a++ 的动作1-21参数传递方式程式语言的参数传递方式有-传值呼叫(call by value)-传址呼叫(call by address)-传参考呼叫(call by reference)C语言提供传值呼叫与传址呼叫,而C++则多了传参考呼叫1-22传值呼叫(call by value)传值呼叫(call by value)-以「拷贝」的方式,主程式内的物件资料与副程式内的物件资料分占不同的记忆体缺点-传递速度慢-需要较多的记忆体空间1-23传值呼叫之实例(两数交换)#include void swap(int, int); // 传值呼叫void main() {int i=7, j=-3;swap(i,j);cout && "i = " && i && // 将输出i=7&& "j = " && j && // 将输出j=-3,两者未交换}void swap(int a, int b) { // 传值呼叫t =a =b =}1-24传址呼叫(call by address)传址呼叫(call by address)-以类别物件指标来传递物件,主程式内的物件资料与副程式内的物件资料占同一块的记忆体优点-传递速度快-不占记忆体空间缺点-语法较为复杂1-25传址呼叫之实例(两数交换)#include void swap(int*, int*); // 传址呼叫void main() {int i=7, j=-3;swap(&i,&j);// 传入i 与j 的位址cout && "i = " && i && // 将输出i=-3&& "j = " && j && // 将输出j=7,成功地做数值交换}void swap(int *a, int *b) { // 传址呼叫t = *a;*a = *b;*b =}1-26传参考呼叫(call by reference)传参考呼叫(call by reference)-与传址呼叫(call by address)一样,主程式内的物件资料与副程式内的物件资料占同一块的记忆体传优点-传递速度快-不占记忆体空间问题-副程式中可以将主程式中的变数值改掉-解决方式: 在副程式的参数列加const宣告1-27传参考呼叫之实例(两数交换)#include void swap(int&, int&); // 传参考呼叫void main() {int i=7, j=-3;swap(i,j);cout && "i = " && i && // 将输出i=-3&& "j = " && j && // 将输出j=7 ,成功地做数值交换}void swap(int &a, int &b) { // 传参考呼叫t =a =b =}1-28回传值之处理一般的函数若有回传值,则会在函数呼叫处理完後於呼叫处产生一个看不见的暂时变数-函式int add(int x, int y) { return x+y; }-呼叫方式-型态1:add(a,b);//将暂时变数丢弃-型态2:printf("gcd=%d\n",add(a,b));//将暂时变数印出来-型态3:c=add(a,b);//将暂时变数拷贝到c1-29回传型态为参考回传值型态为参考时,於呼叫并不会产生额外的变数,而是使用回传指令return 後的记忆体回传值型态为参考时,return 不能使用当地变数与常数回传值为参考时,可写在等号之左边例:int& mydata(int data[], int n){return data[n];}则可写mydata(5)=2;1-30回传型态为参考之实例#include int& access_data(int a[], int n){return a[n-1];}void main(){int data[]={10,20,30,40,50};cout && "The fourth data is "&<access_data(data,4)<<access_data(data,1)=100;for (int i=0; i&5; i++)cout&&"data["&<i<<"]="<<data[i]<<必须改定义为#define sq(x) (x)*(x)1-32inline函式为解决#define 定义函式的缺点,在C++中可使用inline 指令定义函数inline传回值型态函式名称(参数列){// 函数内容}C++在程式中遇到呼叫inline函式时,会去检查其内的参数型态与个数,并以列内函数展开inline函式的优点: 执行速度比一般函式快,缺点: 无法像一般函数精简执行档长度1-33inline 函式之实例#include inline void swap(int&, int&); // 定义swap 函式为inline 函式void main() {int i=7, j=-3;swap(i,j);cout &&"i = "&& i && endl&&"j = "&& j &&}void swap(int& a, int& b) {t =a =b =}1-34参数预设值在C++中,函数之参数可以有预设值.但只有在参数列的尾部才可使用.如此一来,可以改变传入参数的个数,毋需对每一个输入参数做设定例:void abc(float k, int j, int i=5)// 对void xyz(float k=1,int j, int i) // 错void err_use(float k, int j=2, int i) // 错则abc(5,3) 与abc(2,4,1) 均可使用1-35函式预设参数之实例#include void fo( int val, float f = 12.6, // f 的预设值为12.6char c = ‘\n‘, // c 的预设值为‘\n‘string msg = "Error" ) // msg 的预设值为"Eerror"{}void main() {fo( 14, 48.3f, ‘\t‘, "OK" );fo( 14, 48.3f, ‘\t‘ );fo( 14, 48.3f );fo( 14 );}1-36函式预设参数之实例(4个以下整数之相加)#include int add( int x, int y= 0, int z = 0, int w=0) {return x+y+z+w;}int main() {cout && " addition of 8,6,4,15 is "&<add( 8, 6, 4,15 );cout && " addition of 8,6,4 is "&& add( 8, 6, 4);cout && " addition of 8,6 is "&& add( 8, 6);cout && " addition of 8 is "&& add(8);return 0;}1-37重载(overloading)C++允许同一个名称的函数可拥有不同的参数型态,由呼叫处之函式输入参数型态决定执行哪一个函式对於同一名称之函式必须使得呼叫该函式者能唯一决定1-38重载之实例(找最大值)#include #include int imax(int a, int b, int c=-INT_MAX, int d=-INT_MAX){int max_one=(a&b) a:b;max_one=(max_one&c) max_one:c;max_one=(max_one&d) max_one:d;return max_}int imax(int a[],int n){ // 计算阵列中最大的元素int max_one=a[0];for (int i=1; imax_one) max_one=a[i];return max_}1-39重载之实例(找最大值)void main(){int x=120, y=500, z=320, w=2000;cout &&"Max of (x,y,z)="&& imax(x,y,z)&<cout &&"Max of (x,y,z,w)="&& imax(x,y,z,w)&<int a[]={100, 200, 350, 140, 20};cout &&"Max of array a="&& imax(a,5)&<}1-40动态记忆体配置(dynamic memory allocation)动态记忆体配置提供程式设计者依所需求取得与释回系统之记忆体在C中可使用的动态记忆体函数-配置函式malloc, calloc, realloc(重新配置)-释回函式free-使用动态记忆体之函数时需加入#include 在C++中可使用的动态记忆体函数-配置new-释回delete1-41new 的用法new 可以从自由记忆体中分配一定量之记忆体,用法如下:-用法一:记忆体指标= new 资料型态;用於配置一个资料型态大小的记忆体例: float *buf= // 配置1个单精准度浮点数-用法二:记忆体指标= new 资料型态[阵列数目] ;用於配置数个资料型态大小的记忆体例:int*p;p=new int[20]; // 配置20个整数1-42delete 的用法delete 可以释放一块由new所配置之记忆体,用法如下-用法一:delete 记忆体指标;用於释回一个资料型态大小的记忆体float * // 释回buf=new float 的记忆体-用法二: delete [] 记忆体指标;用於释回数个资料型态大小的记忆体int *p;delete[] //释回p=new float[] 的记忆体1-43new与malloc的差别malloc 与new 对於基本资料型态(如int, char, double, float)之配置,用途相同,仅语法不同malloc 与free 为C之动态记忆体配置指令,在使用时不会去执行建构(constructor )与解构(destructor)new 与delete 为C++之动态记忆体配置指令,在使用时会去执行建构(constructor )与解构(destructor)new 与delete 指令对於阵列之配置或释回,会依据所配置或释回之阵列元素个数而决定其建构(construdctor)或解构子(destructor)之执行次数值1-44例外处理(exception handling)程式在执行时,常会遇到一些问题使程式无法往下执行例外发生的情况有-开启一个不存在的档案-系统记忆体不够使用-读写档案时硬碟毁损-算术运算产生overflow或underflow1-45例外处理的语法语法try{/* 要检查的exception */}catch(例外之情形){/* 处理例外的方法*/}throw之用法-丢出一个例外参数出来,让catch 去取得1-46例外处理之实例(配置动态记忆体)#include void main(){int *p;try{p=}catch (bad_alloc){cerr&& "Memory allocation\n";exit(1);}}1-47函式中之例外在函式中要将例外往外丢,可在函数prototype中的参数後面加上throw-例: double hmean(double a, double b) throw (char *);往外丢出多个例外-例: double multierr(double z) throw(char *,double);不丢出例外-例: double simple(double z) throw();可丢出例外,亦可不丢-例: double simple(double z);1-48例外处理之实例(调和平均数)#include double hmean(double a, double b);int main(){double x, y,cout && x && y) {try { z = hmean(x,y); } catch (char * s) {cout && s && "\n";cout && "Enter a new pair of numbers: ";} cout && "Harmonic mean of " && x && " and " && y&& " is " && z && "\n";cout && "Enter next set of numbers : ";}1-49例外处理之实例(调和平均数)cout && "Bye!\n";return 0;}double hmean(double a, double b){if (a == -b)throw "bad arguments: a = -b not allowed";// 在函式中丢出例外事件return 2.0 * a * b / (a + b);}1-50转型C++中提供两种型态转换的方式-第一种: C语言之标准型态-语法: (type) expression-例:y=(double)x; //将x转换成double型式传给y-第二种: 函数形式-语法: type(expression)-例:y=double(x); //将x转换成double型式传给y1-51新的转型方式C++提供四种新的转型方式-static_cast-dynamic_cast-const_cast-reinterpret_cast1-52static_caststatic_cast 於编译时作转型动作,dynamic_cast 於执行时作转型动作语法static_cast(object to convert)例int z = 3;float x = static_cast(z);1-53const_castconst_cast 能够改变const 属性例const int* find(int val, const int t[], int n){for (int i=0; i<n; i++)if (t[i]==val) return &t[i];return 0;}主程式int* int a[]={2,4,6};p=const_cast(find(4,a,3));1-54reinterpret_castreinterpret_cast 不理会记忆体之资料型态,直接依记忆体内容做转型例:int *p;a=reinterpret_cast(p);1-55新的资料型态bool传统C语言使用整数(int) 来代表布林值.当整数不等於0时,布林值为『真』;等於0时布林值为『伪』C++ 提供新的资料型态bool来代表布林值.使用bool较int节省记忆体bool使用保留字true 代表为『真』,使用保留字false代表布林值为『伪』bool 变数做输出时,无法直接输出true或false值,而用1或0做取代1-56使用bool 之实例#include void main(){bool a[5]; // visual c, 1 bool = 1 byteint b[5]; // visual c , 1 int =4 bytea[0]= // 直接设成truea[1]= // 直接设成falsecout&&x;a[2]=(x&5); // 判断而决定为true 或falsefor (int i=0; i&3; i++) {if (a[i]) cout && "a["&&i&&"] is True, ";else cout&&"False, ";cout &<a[i]<<}1-57使用bool 之实例// 整数变数b[0]=100; // 0 trueb[1]=0; // =0 false b[2]=(x&5);for (i=0; i&3; i++){if (b[i]) cout && "b["&&i&&"] is True, ";else cout&&"False, ";cout&<b[i]<<}}
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢&&&&C++语言是C语言的扩展。你把C源码的扩展名改成cpp通常都可以直接编译。从语法上看,C语言是C++语言的子集,个别地方除外。这篇日志专门收集C和C++语法上的不同,指出C和C++的极个别不兼容的地方,让大家在后可以尽快写出正确的C++代码。这篇日志需要众牛过目并补充。系统保留字&&&&C++多出了很多功能,因此系统保留字比C更多。如果你的C源码中的变量名或函数名正好是C++的系统保留字,此时将不能通过C++的编译。void*类型赋值&&&&在C++中你不能把void*类型直接赋值给其它任何类型。下面这句代码在C中可以通过编译,但在C++中则不能通过编译。你需要使用类型转换后再赋值。int *x = malloc(sizeof(int) * 10);&&&&指针的初始化和释放&&&&在C语言中,对指针的初始化和释放通常这样写:int *x = malloc( sizeof(int) );int *x_array = malloc( sizeof(int) * 10 );free( x );free( x_array );&&&&但在C++中,这些操作通常使用new和del&#101;te运算符完成:int *x =int *x_array = new int[10];del&#101;del&#101;te[] x_结构的声明&&&&C语言中声明结构变量需要在结构名前面加一个struct。在C++中那个struct可以省略。&&&&也就是说,在C语言中你需要这样写:struct date{&&&&&&&&&&&&};&&&&但在C++中,你可以写成这样:struct date{&&&&&&&&&&&&};函数声明与调用&&&&C++中严格禁止先调用后声明。你可以把函数声明写在前面或使用向前引用。下面的程序代码在C中是合法的,但是在C++中无法通过编译。#include &stdio.h&int main(){&&&&printfDomain();&&&&return 0;}int printfDomain(){&&&&printf(&#&#34;);}bool类型&&&&C语言中使用bool类型需要包含stdbool.h文件。C++本身提供了bool类型。主程序返回值&&&&C语言中,你需要在主函数结束前加一句return 0。C++中主函数自动返回0,因此你可以不写return 0。放心,不写return 0在编译时连个警告都没有。C++的新特性&&&&这不属于本文的讨论范围。这是我们以后着重要讨论的东西。如果你不急着用C++的新特性,了解上面的东西后你就已经可以写出正确的C++程序了。做人要厚道转贴请注明出处
本文已收录于以下专栏:
相关文章推荐
夏令营之后自己感觉有点累了,所以九月份推免只申请了清软的硕士。当时我申请的时候有两个选择,一个是计算机系的硕士,一个是清软的硕士。计算机系的硕士名额要比清软多不少,当时问了一些学长的意见,学长告诉我虽...
我又干牛B事了!这个周末无聊,突发奇想,把C++的教材狠狠折腾了一番。两天忙活之后,手上便多了一件颇有些感觉的艺术品。第一次做书雕艺术,能搞到这种程度我已经很满意了~&#160;一些制作过程中的照片:抢楼得书雕...
人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..
1、标识符:
C可用的标识符为数字、大小写字母、下划线,不能以数字开头;
Java可用的标识符除了C的三种以外,多一种美元符号($),同样不能以数字开头。
2、关键字:
C中的关键...
一、NSLog函数
&#160; &#160;1.前面我们讲到了NSLog这个函数,它与C语言中的printf很类似,会在控制端口输出显示结果。但是NSLog传递进去的格式化字符是NSString对象,而printf函数...
Android安全进阶第一步,了解IDA的基本用法。为以后android安全加固做准备
本人现在是一名C++开发人员,在业余的时间学习了java。在此简单的总结了一些C++与java一些基本语法的区别。希望能够给大家一些参考,也方便自己日后复习。
1.C++中成员变量和...
1:调用基类构造函数:
C#public subclassname(object arg): base(arg)
subclassname(System...
转自(from /dc10101/archive//865556.html),比较有意思
在C语言中,static...
Objective-C是一种通用、高级、面向对象的编程语言。它扩展了标准的ANSIC编程语言,将Smalltalk式的消息传递机制加入到ANSIC中。
&#160;&#160;&#160;&#160;&#160;&#160; &#160;Objective-C最大的特...
【疑问】关于const常量的实现机制在C和C++中的不同
int&#160;main()
&#160;&#160;const&#160;int&#160;a=7;
&#160;&#160;int&#160;*b=(int&#160;*)&a;
他的最新文章
讲师:汪剑
讲师:陈守元
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)C/C++语言(73)
语法区别:
C:使用printf、scanf、 gets、puts等
C&#43;&#43;:使用cin、cout
&&&&&& C&#43;&#43;使用cin和cout有三个突出优点:
&&&&&& 1、简单安全: 根据操作对象自适应的,只需要使用&&或者&&就可以搞定一切
&&&&&& 2、支持用户自定义类型的流操作: 需要重载&&运算符
注意事项:
&&&&&& 1、要使用头文件iostream。cout和cin并不是C&#43;&#43;语言中提供的语句,它们是iostream类的对象,故使用的时候必须加上头文件iostream,又因为cout是std名字空间中定义的全局对象,在main函数执行前就已经构造好了,只管用就是,而不用在定义对象等操作。
&&&&&& 2、二者效率不同。至于printf和cout那个快,根据数据不同,会有不同的结果。但是百度上说做ZOJ时,使用cout会有超时的情况,这个要注意。
&&&&&& 3、不同类的输入输出语句不能混合使用。cin和cout搭配使用,printf和scanf搭配使用。因为运行机制不同,混合使用可能会出问题。
&常用语法:
&&&&&&&cin&&变量/指针;
&&&&&& 1、数据流向谁就指向谁。(记忆)(键盘-&内存)
&&&&&& 2、变量可以是一个也可以是多个,数据之间可以使用空&#26684;、Tab或回车分开
&&&&&&&&&&&&& cin&&a&&b
&&&&&&&cout&&变量/常量(各种类型常量);
&&&&&& 1、& 数据流向谁就指向谁。(内存-&显示器)
&&&&&& 2、& 变量可以是一个、多个、也可以是表达式
&&&&&&&&&&&& cout&&a&&b&&a&#43;b;
&&&&&&&&&&&& cout&&
典型问题:&
原因:printf不使用缓冲,输入时直接输出到终端,但是cout使用流,有缓冲输出,总是在强制刷新或程序结束后才能显示结果。
cout & & &abc & & & 等价于 cout & & &abc\n &;cout & &&(flush使立即强迫缓冲输出)
endl相当于输出回车后,再强迫缓冲输出,包含flush的作用。
通过cout分步执行可以看到,执行cout&& &B\n &时(这里没使用endl或刷新)无内容立即输出,一直到程序而执行cout&& &B&&&时有结果输出。
则cout分步执行时,到程序结束时或使用endl才输出结果到屏幕 而 printf每步运行都有结果输出,有利于调试。
因此,调试的时候,语句中含有cout & & &abc &这种的时候,要加上endl或改成 printf 语句。
FROM:&http://blog.csdn.net/insistgogo/article/details/6587824
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2063393次
积分:20582
积分:20582
排名:第400名
原创:13篇
转载:1743篇
评论:195条
(4)(29)(38)(19)(11)(1)(5)(5)(102)(43)(1)(1)(52)(73)(113)(42)(137)(118)(174)(175)(61)(120)(54)(28)(40)(8)(1)(18)(12)(15)(11)(3)(6)(29)(6)(1)(1)(1)(2)(1)(14)(16)(14)(1)(8)(15)(26)(22)(19)(14)(38)(7)(1)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 第一步要从里面开始漫 的文章

 

随机推荐