做网站怎么改关键词,利用渗透的网站做寄生虫,王老吉网站建设水平优点,小果seo实战培训课程目录
C概念
C发展史
C关键字#xff08;C98#xff09;
命名空间
命名空间的定义
命名空间的使用
C中的输入输出
缺省参数
缺省参数的概念
缺省参数的分类
函数重载
函数重载概念
函数重载实现
引用
引用的概念
引用的特性
常引用
引用的使用场景…目录
C概念
C发展史
C关键字C98
命名空间
命名空间的定义
命名空间的使用
C中的输入输出
缺省参数
缺省参数的概念
缺省参数的分类
函数重载
函数重载概念
函数重载实现
引用
引用的概念
引用的特性
常引用
引用的使用场景
引用做参数
引用做返回值
引用和指针的区别
内联函数
内联函数的概念
内联函数的特性
auto关键字
auto简介
auto的使用细则
auto不能推导的场景
基于范围的for循环(C11)
范围for的语法
范围for的使用条件
指针空值nullptr(C11)
C11中的指针空值 C概念 C语言是结构化和模块化的语言适合处理较小规模的程序。对于复杂的问题规模较大的程序需要高度的抽象和建模时C语言则不合适。为了解决软件危机20世纪80年代计算机界提出了OOP(object oriented programming面向对象) 思想支持面向对象的程序设计语言应运而生。 1982年Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念发明了一种新的程序语言。为了表达该语言与C语言的渊源关系命名为C。因此C是基于C语言而产生的它既可以进行C语言的过程化程序设计又可以进行以抽象数据类型为特点的基于对象的程序设计还可以进行面向对象的程序设计。
C发展史 1979年贝尔实验室的本贾尼等人试图分析unix内核的时候试图将内核模块化于是在C语言的基础上进行扩展增加了类的机制完成了一个可以运行的预处理程序称之为C with classes。 语言的发展也是随着时代的进步在逐步递进的让我们来看看C的历史版本
阶段内容C with classes类及派生类、公有和私有成员、类的构造析构、友元、内联函数、赋值运算符重载等C1.0添加虚函数概念函数和运算符重载引用、常量等C2.0更加完善支持面向对象新增保护成员、多重继承、对象的初始化、抽象类、静态成员以及const成员函数C3.0进一步完善引入模板解决多重继承产生的二义性问题和相应构造和析构的处理C98C标准第一个版本绝大多数编译器都支持得到了国际标准化组织ISO和美国标准化协会认可以模板方式重写C标准库引入了STL标准模板库C03C标准第二个版本语言特性无大改变主要∶修订错误、减少多异性C05C标准委员会发布了一份计数报告Technical ReportTR1正式更名C0x即∶计划在本世纪第一个10年的某个时间发布C11增加了许多特性使得C更像一种新语言比如∶正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、标准线程库等C14对C11的扩展主要是修复C11中漏洞以及改进比如∶泛型的lambda表达式auto的返回值类型推导二进制字面常量等C17在C11上做了一些小幅改进增加了19个新特性比如∶static_assert的文本信息可选Fold表达式用于可变的模板if和switch语句中的初始化器等
C还在不断地向后发展...
C关键字C98 C中总共63个关键字包括了C语言中32个关键字。 命名空间 在C/C中变量、函数和后面要学到的类都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。
命名空间的定义 定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接一对{}即可{}中即为命名空间的成员。
//命名空间的普通定义
namespace N1 //N1为命名空间的名称
{//在命名空间中既可以定义变量也可以定义函数int a;int Add(int x, int y){return x y;}
}
//命名空间的嵌套定义
namespace N1 //定义一个名为N1的命名空间
{int a;int b;namespace N2 //嵌套定义另一个名为N2的命名空间{int c;int d;}
}
命名空间的使用 C为了防止命名冲突把自己库里面的东西都定义在一个std的命名空间中要使用标准库里面的东西有三种方式 1、指定命名空间–麻烦每个地方都要指定但也是最规范的方式。
int c 100;
namespace N
{int a 10;int b 20;int Add(int left, int right){return left right;}int Sub(int left, int right){return left - right;}
}2、把std整个展开相当于库里面的东西全部到全局域里面去了使用起来方便但是可能会有与自己命名空间定义的冲突规范工程中不推荐这种日常练习可以用这种。
using namespace std;3、对部分常用的库里面的东西展开-针对1和2的折中方案项目中也经常使用
using std::cout;
using std::endl;
int main()
{printf(%d\n, N::a);printf(%d\n, N::b);printf(%d\n, N::Add(1, 2));printf(%d\n, N::Sub(1, 2));int c 10;printf(%d\n, c); //局部变量优先所以c为10printf(%d\n, ::c); //指定访问左边域空白表示全局域
}C中的输入输出 1、使用cout标准输出(控制台)和cin标准输入(键盘)时必须包含 iostream 头文件以及std标准命名空间。 注意早期标准库将所有功能在全局域中实现声明在.h后缀的头文件中使用时只需包含对应头文件即可后来将其实现在std命名空间下为了和C头文件区分也为了正确使用命名空间规定C头文件不带.h旧编译器(vc 6.0)中还支持iostream.h格式后续编译器已不支持因此推荐使用std的方式。 2、使用C输入输出更方便不需增加数据格式控制比如整形–%d字符–%c。 3、ostream 类型全局对象istream 类型全局对象 endl全局的换行符号。
struct Person
{char name[10];int age;
};
int main()
{std::cout bit education ;std::cout bit education std::endl;//cout与cin对比C语言printf\scanf 来说可以自动识别类型(函数重载运算符重载)int a 10;int* p a;printf(%d,%p\n, a, p);std::cout a , p std::endl;std::cin a;printf(%d\n, a);char str[100];std::cin str; //cin不用,因为引用std::cout str std::endl;struct Person P { uzi, 23 }; //格式化输出printf比cout好printf(name:%s age:%d\n, P.name, P.age);std::cout name: P.name age: P.age \n;
}缺省参数
缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时如果没有指定实参则采用该默认值否则使用指定的实参。
#include iostream
using namespace std;
void Print(int a 0)
{cout a endl;
}
int main()
{Print();//没有指定实参使用参数的默认值打印0Print(10);//指定了实参使用指定的实参打印10return 0;
}缺省参数的分类
半缺省参数 void testFunc3(int a, int b 10, int c 20)
{cout a a endl;cout b b endl;cout c c endl;
}全缺省参数 void testFunc2(int a 10, int b 20, int c 30)
{cout a a endl;cout b b endl;cout c c endl;
}正常参数 void testFunc1(int a 0)
{std::cout a std::endl;
}int main()
{testFunc1(10);testFunc2();testFunc3(1);return 0;
}注意 半缺省参数必须从右往左依次来给出不能间隔着给缺省参数不能在函数声明和定义中同时出现缺省值必须是常量或者全局变量C语言不支持编译器不支持 函数重载
函数重载概念 是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同常用来处理实现功能类似数据类型不同的问题。
函数重载实现
int Add(int left, int right)
{return left right;
}
double Add(double left, double right)
{return left right;
}
int main()
{cout Add(10, 20) endl;cout Add(10.5, 20.0) endl;//fun();return 0;
}注意(特别重要): 缺省参数缺省参数符合重载的定义但如果调用的时候编译器不识别函数重载调用哪个函数所以分情况讨论。
void fun(int a, int b, int c 10)
{}
void fun(int a, int b)
{}函数命名规则–C支持重载C不支持 为什么C支持函数重载而C语言不支持函数重载呢 一个程序要运行起来需要经历以下几个阶段预处理、编译、汇编、链接。 在C中 函数名 Mangling名称修饰C编译器使用函数名和参数类型来生成一个唯一的函数标识符这个过程称为名称修饰或编译器编码。即便两个函数名字相同只要它们的参数类型、个数或者顺序不同编译器就会生成不同的内部表示即不同的函数名这样就可以在链接阶段区分它们实现函数重载。 更强大的类型系统C作为一个面向对象的语言拥有更复杂的类型系统支持多态等特性函数重载是其支持多态性的一个重要方面。 而在C语言中 简单的函数命名规则C语言的编译器在编译时函数名不包含参数类型信息。对于C编译器来说函数名必须是唯一的如果有两个函数名字相同无论参数列表是否一致都会导致编译错误因为编译器无法根据参数列表来区分它们。 设计哲学C语言的设计哲学倾向于简洁和直接它没有引入函数重载这样的特性以保持语言的简单性和紧凑性。 引用
引用的概念 引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。 其使用的基本形式为类型 引用变量名(对象名) 引用实体。
int main()
{int a 10;int b a;//给变量a去了一个别名叫bcout a a endl;//a打印结果为10cout b b endl;//b打印结果也是10b 20;//改变b也就是改变了acout a a endl;//a打印结果为20cout b b endl;//b打印结果也是为20return 0;
}注引用类型必须和引用实体是同种类型。
引用的特性
1、引用在定义时必须初始化
正确示例int a 10;
int b a;//引用在定义时必须初始化
错误示例int c 10;
int d;//定义时未初始化
d c;
2、 一个变量可以有多个引用
int a 10;
int b a;
int c a;
int d a;此时b、c、d都是变量a的引用。
3、引用一旦引用了一个实体就不能再引用其他实体
int a 10;
int b a;
此时b已经是a的引用了b不能再引用其他实体。如果你写下以下代码想让b转而引用另一个变量c
int a 10;
int b a;
int c 20;
b c;//你的想法让b转而引用c但该代码并没有随你的意该代码的意思是将b引用的实体赋值为c也就是将变量a的内容改成了20。
常引用 上面提到引用类型必须和引用实体是同种类型的。但是仅仅是同种类型还不能保证能够引用成功我们若用一个普通引用类型去引用其对应的类型但该类型被const所修饰那么引用将不会成功。
int main()
{const int a 10;//int ra a; //该语句编译时会出错a为常量const int ra a;//正确//int b 10; //该语句编译时会出错10为常量const int b 10;//正确return 0;
}我们可以将被const修饰了的类型理解为安全的类型因为其不能被修改。我们若将一个安全的类型交给一个不安全的类型可被修改那么将不会成功。
引用的使用场景
引用做参数 还记得C语言中的交换函数学习C语言的时候经常用交换函数来说明传值和传址的区别。现在我们学习了引用可以不用指针作为形参了
//交换函数
void Swap(int a, int b)
{int tmp a;a b;b tmp;
}因为在这里a和b是传入实参的引用我们将a和b的值交换就相当于将传入的两个实参交换了。
引用做返回值 当然引用也能做返回值但是要特别注意我们返回的数据不能是函数内部创建的普通局部变量因为在函数内部定义的普通的局部变量会随着函数调用的结束而被销毁。我们返回的数据必须是被static修饰或者是动态开辟的或者是全局变量等不会随着函数调用的结束而被销毁的数据。
int Add(int a, int b)
{static int c a b;return c;
}注意如果函数返回时出了函数作用域返回对象还未还给系统则可以使用引用返回如果已经还给系统了则必须使用传值返回。
引用和指针的区别 引用和指针在C中都是用来存储其他变量的地址但它们之间存在几个关键的区别 别名与独立实体 引用是一个已存在变量的别名也就是说一旦引用被初始化为某个变量它就是那个变量的另一个名字对引用的操作实际上就是对原始变量的操作。 指针是一个独立的实体它存储了一个内存地址的值该地址指向另一个变量。使用指针时你需要通过解引用操作(*)来访问目标变量的内容。 初始化 引用必须在声明时被初始化并且一旦初始化后就不能改变引用的对象。它必须被初始化为一个已存在的对象。 指针可以在声明时初始化也可以稍后初始化。它可以被初始化为nullptr或者任何合法对象的地址并且在生命周期内可以改变指向其他对象。 空值 引用不允许为NULL或未定义总是必须关联到合法的存储位置。 指针可以指向NULL这使得指针可以用来表示“没有对象”。 sizeof操作 引用sizeof引用得到的是被引用对象的大小因为它只是别名。 指针sizeof指针得到的是指针本身的大小不论它指向什么类型的对象。 可变性 引用一旦引用被初始化它就不能重新绑定到另一个对象。 指针可以改变指针的值让它指向不同的对象。 操作符行为 对于**或--**运算符如果应用于指针它们会改变指针自身的值使其指向下一个或前一个内存位置如果应用于引用则是对引用所指对象的值进行增减操作。 使用场景 引用通常用于函数参数传递、返回值以及提供更安全和方便的访问方式。 指针提供了更多的灵活性特别是在动态内存管理、数据结构实现和低级别编程中。 内联函数
内联函数的概念 以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数压栈的开销内联函数的使用可以提升程序的运行效率。 我们可以通过观察调用普通函数和内联函数的汇编代码来进一步查看其优势
int Add(int a, int b)
{return a b;
}
int main()
{int ret Add(1, 2);return 0;
}下图左是以上代码的汇编代码下图右是函数Add加上inline后的汇编代码 内联函数的特性 1、inline是一种以空间换时间的做法省了去调用函数的额外开销。由于内联函数会在调用的位置展开所以代码很长或者有递归的函数不适宜作为内联函数。频繁调用的小函数建议定义成内联函数。 2、inline对于编译器而言只是一个建议编译器会自动优化如果定义为inline的函数体内有递归等编译器优化时会忽略掉内联。 3、inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址了链接就会找不到。
auto关键字
auto简介 在早期的C/C中auto的含义是使用auto修饰的变量是具有自动存储器的局部变量但遗憾的是一直没有人去使用它。 在C11中标准委员会赋予了auto全新的含义auto不再是一个存储类型指示符而是作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。
#include iostream
using namespace std;
double Fun()
{return 3.14;
}
int main()
{int a 10;auto b a;auto c A;auto d Fun();//打印变量b,c,d的类型cout typeid(b).name() endl;//打印结果为intcout typeid(c).name() endl;//打印结果为charcout typeid(d).name() endl;//打印结果为doublereturn 0;
}注意使用auto变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明的“占位符”编译器在编译期会将auto替换为变量实际的类型。
auto的使用细则
1、auto与指针和引用结合起来使用 用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时必须加。
#include iostream
using namespace std;
int main()
{int a 10;auto b a; //自动推导出b的类型为int*auto* c a; //自动推导出c的类型为int*auto d a; //自动推导出d的类型为int//打印变量b,c,d的类型cout typeid(b).name() endl;//打印结果为int*cout typeid(c).name() endl;//打印结果为int*cout typeid(d).name() endl;//打印结果为intreturn 0;
}注意用auto声明引用时必须加否则创建的只是与实体类型相同的普通变量。
2、在同一行定义多个变量 当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。
int main()
{auto a 1, b 2; //正确auto c 3, d 4.0; //编译器报错“auto”必须始终推导为同一类型return 0;
}auto不能推导的场景
1、auto不能作为函数的参数 以下代码编译失败auto不能作为形参类型因为编译器无法对x的实际类型进行推导。
void TestAuto(auto x)
{ }2、auto不能直接用来声明数组
int main()
{int a[] { 1, 2, 3 };auto b[] { 4, 5, 6 };//errorreturn 0;
}基于范围的for循环(C11)
范围for的语法 若是在C98中我们要遍历一个数组可以按照以下方式
int arr[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//将数组元素值全部乘以2
for (int i 0; i sizeof(arr) / sizeof(arr[0]); i)
{arr[i] * 2;
}
//打印数组中的所有元素
for (int i 0; i sizeof(arr) / sizeof(arr[0]); i)
{cout arr[i] ;
}
cout endl;以上方式也是我们C语言中所用的遍历数组的方式但对于一个有范围的集合而言循环是多余的有时还容易犯错。因此C11中引入了基于范围的for循环。for循环后的括号由冒号分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围。
int arr[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//将数组元素值全部乘以2
for (auto e : arr)
{e * 2;
}
//打印数组中的所有元素
for (auto e : arr)
{cout e ;
}
cout endl;注意与普通循环类似可用continue来结束本次循环也可以用break来跳出整个循环。
范围for的使用条件
1、for循环迭代的范围必须是确定的 对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供begin和end的方法begin和end就是for循环迭代的范围。
2、迭代的对象要实现和操作 这是关于迭代器的问题大家先了解一下。
指针空值nullptr(C11) 在良好的C/C编程习惯中在声明一个变量的同时最好给该变量一个合适的初始值否则可能会出现不可预料的错误。比如未初始化的指针如果一个指针没有合法的指向我们基本都是按如下方式对其进行初始化
int* p1 NULL;
int* p2 0;NULL其实是一个宏在传统的C头文件(stddef.h)中可以看到如下代码
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else /* __cplusplus */
#define NULL ((void *)0)
#endif /* __cplusplus */
#endif /* NULL */可以看到NULL可能被定义为字面常量0也可能被定义为无类型指针(void*)的常量。但是不论采取何种定义在使用空值的指针时都不可避免的会遇到一些麻烦例如
#include iostream
using namespace std;
void Fun(int p)
{cout Fun(int) endl;
}
void Fun(int* p)
{cout Fun(int*) endl;
}
int main()
{Fun(0); //打印结果为 Fun(int)Fun(NULL); //打印结果为 Fun(int)Fun((int*)NULL); //打印结果为 Fun(int*)return 0;
}程序本意本意是想通过Fun(NULL)调用指针版本的Fun(int* p)函数但是由于NULL被定义为0Fun(NULL)最终调用的是Fun(int p)函数。
注在C98中字面常量0既可以是一个整型数字也可以是无类型的指针(void*)常量但编译器默认情况下将其看成是一个整型常量如果要将其按照指针方式来使用必须对其进行强制转换。
C11中的指针空值 对于C98中的问题C11引入了关键字nullptr。
注意 1、在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为关键字引入的。 2、在C11中sizeof(nullptr)与sizeof((void*)0)所占的字节数相同。 3、为了提高代码的健壮性在后序表示指针空值时建议最好使用nullptr。 文章转载自: http://www.morning.bqts.cn.gov.cn.bqts.cn http://www.morning.plqkz.cn.gov.cn.plqkz.cn http://www.morning.fpngg.cn.gov.cn.fpngg.cn http://www.morning.hpprx.cn.gov.cn.hpprx.cn http://www.morning.irqlul.cn.gov.cn.irqlul.cn http://www.morning.sqqkr.cn.gov.cn.sqqkr.cn http://www.morning.kcsx.cn.gov.cn.kcsx.cn http://www.morning.xhhzn.cn.gov.cn.xhhzn.cn http://www.morning.krtky.cn.gov.cn.krtky.cn http://www.morning.yjprj.cn.gov.cn.yjprj.cn http://www.morning.mxnhq.cn.gov.cn.mxnhq.cn http://www.morning.mhrzd.cn.gov.cn.mhrzd.cn http://www.morning.tpnxj.cn.gov.cn.tpnxj.cn http://www.morning.nfccq.cn.gov.cn.nfccq.cn http://www.morning.prhfc.cn.gov.cn.prhfc.cn http://www.morning.jyfrz.cn.gov.cn.jyfrz.cn http://www.morning.fmjzl.cn.gov.cn.fmjzl.cn http://www.morning.jwskq.cn.gov.cn.jwskq.cn http://www.morning.wfttq.cn.gov.cn.wfttq.cn http://www.morning.rkdzm.cn.gov.cn.rkdzm.cn http://www.morning.fwlch.cn.gov.cn.fwlch.cn http://www.morning.nqxdg.cn.gov.cn.nqxdg.cn http://www.morning.srndk.cn.gov.cn.srndk.cn http://www.morning.pzwfw.cn.gov.cn.pzwfw.cn http://www.morning.ysnbq.cn.gov.cn.ysnbq.cn http://www.morning.rqzyz.cn.gov.cn.rqzyz.cn http://www.morning.lbqt.cn.gov.cn.lbqt.cn http://www.morning.spkw.cn.gov.cn.spkw.cn http://www.morning.ypdmr.cn.gov.cn.ypdmr.cn http://www.morning.hnmbq.cn.gov.cn.hnmbq.cn http://www.morning.kcbml.cn.gov.cn.kcbml.cn http://www.morning.dfrenti.com.gov.cn.dfrenti.com http://www.morning.lpskm.cn.gov.cn.lpskm.cn http://www.morning.ggnkt.cn.gov.cn.ggnkt.cn http://www.morning.tbqxh.cn.gov.cn.tbqxh.cn http://www.morning.rkzk.cn.gov.cn.rkzk.cn http://www.morning.fkcjs.cn.gov.cn.fkcjs.cn http://www.morning.zylrk.cn.gov.cn.zylrk.cn http://www.morning.ywndg.cn.gov.cn.ywndg.cn http://www.morning.lkkgq.cn.gov.cn.lkkgq.cn http://www.morning.burpgr.cn.gov.cn.burpgr.cn http://www.morning.lzttq.cn.gov.cn.lzttq.cn http://www.morning.krnzm.cn.gov.cn.krnzm.cn http://www.morning.ailvturv.com.gov.cn.ailvturv.com http://www.morning.mpmtz.cn.gov.cn.mpmtz.cn http://www.morning.rbnj.cn.gov.cn.rbnj.cn http://www.morning.sdamsm.com.gov.cn.sdamsm.com http://www.morning.rlqml.cn.gov.cn.rlqml.cn http://www.morning.hwbmn.cn.gov.cn.hwbmn.cn http://www.morning.tgmfg.cn.gov.cn.tgmfg.cn http://www.morning.trhrk.cn.gov.cn.trhrk.cn http://www.morning.ftmzy.cn.gov.cn.ftmzy.cn http://www.morning.ljygq.cn.gov.cn.ljygq.cn http://www.morning.lbxhy.cn.gov.cn.lbxhy.cn http://www.morning.tthmg.cn.gov.cn.tthmg.cn http://www.morning.rhmt.cn.gov.cn.rhmt.cn http://www.morning.zdzgf.cn.gov.cn.zdzgf.cn http://www.morning.wcft.cn.gov.cn.wcft.cn http://www.morning.txysr.cn.gov.cn.txysr.cn http://www.morning.mlwhd.cn.gov.cn.mlwhd.cn http://www.morning.wcft.cn.gov.cn.wcft.cn http://www.morning.pyxwn.cn.gov.cn.pyxwn.cn http://www.morning.wgqtj.cn.gov.cn.wgqtj.cn http://www.morning.fxzw.cn.gov.cn.fxzw.cn http://www.morning.ysbhj.cn.gov.cn.ysbhj.cn http://www.morning.tkxr.cn.gov.cn.tkxr.cn http://www.morning.prplf.cn.gov.cn.prplf.cn http://www.morning.jntcr.cn.gov.cn.jntcr.cn http://www.morning.mqldj.cn.gov.cn.mqldj.cn http://www.morning.lxqyf.cn.gov.cn.lxqyf.cn http://www.morning.hksxq.cn.gov.cn.hksxq.cn http://www.morning.fengnue.com.gov.cn.fengnue.com http://www.morning.dddcfr.cn.gov.cn.dddcfr.cn http://www.morning.qrksj.cn.gov.cn.qrksj.cn http://www.morning.czrcf.cn.gov.cn.czrcf.cn http://www.morning.wpcfh.cn.gov.cn.wpcfh.cn http://www.morning.zypnt.cn.gov.cn.zypnt.cn http://www.morning.rmryl.cn.gov.cn.rmryl.cn http://www.morning.rryny.cn.gov.cn.rryny.cn http://www.morning.tlbdy.cn.gov.cn.tlbdy.cn