精华内容
参与话题
问答
  • c 标准和c++标准

    万次阅读 多人点赞 2018-08-29 10:16:49
    C语言的发展阶段 C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming...

    C语言的发展阶段

    C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。

    1. 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。
    2. 20世纪60年代,美国AT&T公司贝尔实验室(AT&T Bell Laboratory)的研究员Ken Thompson闲来无事,手痒难耐,想玩一个他自己编的,模拟在太阳系航行的电子游戏——Space Travel。他背着老板,找到了台空闲的机器——PDP-7。但这台机器没有操作系统,而游戏必须使用操作系统的一些功能,于是他着手为PDP-7开发操作系统。后来,这个操作系统被命名为——UNIX。
    3. 1970年,美国贝尔实验室的 Ken Thompson,以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。
    4. 1971年,同样酷爱Space Travel的Dennis M.Ritchie为了能早点儿玩上游戏,加入了Thompson的开发项目,合作开发UNIX。他的主要工作是改造B语言,使其更成熟。
    5. 1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
    6. 1973年初,C语言的主体完成。Thompson和Ritchie迫不及待地开始用它完全重写了UNIX。此时,编程的乐趣使他们已经完全忘记了那个"Space Travel",一门心思地投入到了UNIX和C语言的开发中。随着UNIX的发展,C语言自身也在不断地完善。直到今天,各种版本的UNIX内核和周边工具仍然使用C语言作为最主要的开发语言,其中还有不少继承Thompson和Ritchie之手的代码。
    7. 在开发中,他们还考虑把UNIX移植到其他类型的计算机上使用。C语言强大的移植性(Portability)在此显现。机器语言和汇编语言都不具有移植性,为x86开发的程序,不可能在Alpha,SPARC和ARM等机器上运行。而C语言程序则可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。
    8. 1977年,Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。

    C语言继续发展,在1982年,很多有识之士和美国国家标准协会为了使这个语言健康地发展下去,决定成立C标准委员会,建立C语言的标准。委员会由硬件厂商,编译器及其他软件工具生产商,软件设计师,顾问,学术界人士,C语言作者和应用程序员组成。1989年,ANSI发布了第一个完整的C语言标准——ANSI X3.159—1989,简称“C89”,不过人们也习惯称其为“ANSI C”。C89在1990年被国际标准组织ISO(International Organization for Standardization)一字不改地采纳,ISO官方给予的名称为:ISO/IEC 9899,所以ISO/IEC9899: 1990也通常被简称为“C90”。1999年,在做了一些必要的修正和完善后,ISO发布了新的C语言标准,命名为ISO/IEC 9899:1999,简称“C99”。 在2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899: 2011,简称为“C11”。

     

    C语言标准:

     

    K&R C

    起初,C语言没有官方标准。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。布莱恩·柯林汉(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本书,名叫《The C Programming Language》。这本书被 C语言开发者们称为K&R,很多年来被当作 C语言的非正式的标准说明。人们称这个版本的 C语言为K&R C。[3]

    K&R C主要介绍了以下特色:

    1. 结构体(struct)类型
    2. 长整数(long int)类型
    3. 无符号整数(unsigned int)类型
    4. 把运算符=+和=-改为+=和-=。因为=+和=-会使得编译器不知道使用者要处理i = -10还是i =- 10,使得处理上产生混淆。

    即使在后来ANSI C标准被提出的许多年后,K&R C仍然是许多编译器的最标准要求,许多老旧的编译器仍然运行K&R C的标准。

     

    ANSI C / C89标准

    1970到80年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本。

    1983年,美国国家标准协会(ANSI)成立了一个委员会X3J11,来制定 C语言标准。

    1989年,美国国家标准协会(ANSI)通过了C语言标准,被称为ANSI X3.159-1989 "Programming Language C"。因为这个标准是1989年通过的,所以一般简称C89标准。有些人也简称ANSI C,因为这个标准是美国国家标准协会(ANSI)发布的。

    1990年,国际标准化组织(ISO)和国际电工委员会(IEC)把C89标准定为C语言的国际标准,命名为ISO/IEC 9899:1990 - Programming languages -- C。因为此标准是在1990年发布的,所以有些人把简称作C90标准。不过大多数人依然称之为C89标准,因为此标准与ANSI C89标准完全等同。

    1994年,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C89标准修订版,名叫ISO/IEC 9899:1990/Cor 1:1994 ,有些人简称为C94标准

    1995年,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C89标准修订版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity ,有些人简称为C95标准

     

    C99标准

    1999年1月,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C语言的新标准,名叫ISO/IEC 9899:1999 - Programming languages -- C,简称C99标准。这是C语言的第二个官方标准

    在C99中包括的特性有:

    1. 增加了对编译器的限制,比如源程序每行要求至少支持到 4095 字节,变量名函数名的要求支持到 63 字节(extern 要求支持到 31)。
    2. 增强了预处理功能。例如:
    3. 宏支持取可变参数 #define Macro(...) __VA_ARGS__
    4. 使用宏的时候,允许省略参数,被省略的参数会被扩展成空串。
    5. 支持 // 开头的单行注释(这个特性实际上在C89的很多编译器上已经被支持了)
    6. 增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool
    7. 支持 long long, long double _Complex, float _Complex 等类型
    8. 支持不定长的数组,即数组长度可以在运行时决定,比如利用变量作为数组长度。声明时使用 int a[var] 的形式。不过考虑到效率和实现,不定长数组不能用在全局,或 struct 与 union 里。
    9. 变量声明不必放在语句块的开头,for 语句提倡写成 for(int i=0;i<100;++i) 的形式,即i 只在 for 语句块内部有效。
    10. 允许采用(type_name){xx,xx,xx} 类似于 C++ 的构造函数的形式构造匿名的结构体。
    11. 复合字面量:初始化结构的时候允许对特定的元素赋值,形式为:
    12. struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 };
    13. struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是对 .c,.d 赋值的
    14. 格式化字符串中,利用 \u 支持 unicode 的字符。
    15. 支持 16 进制的浮点数的描述。
    16. printf scanf 的格式化串增加了对 long long int 类型的支持。
    17. 浮点数的内部数据描述支持了新标准,可以使用 #pragma 编译器指令指定。
    18. 除了已有的 __line__ __file__ 以外,增加了 __func__ 得到当前的函数名。
    19. 允许编译器化简非常数的表达式。
    20. 修改了 /% 处理负数时的定义,这样可以给出明确的结果,例如在C89中-22 / 7 = -3, -22% 7 = -1,也可以-22 / 7= -4, -22% 7 = 6。 而C99中明确为 -22 / 7 = -3, -22% 7 = -1,只有一种结果。
    21. 取消了函数返回类型默认为 int 的规定。
    22. 允许 struct 定义的最后一个数组不指定其长度,写做 [](flexible array member)。
    23. const const int i 将被当作 const int i 处理。
    24. 增加和修改了一些标准头文件,比如定义 bool 的 <stdbool.h> ,定义一些标准长度的 int 的 <inttypes.h> ,定义复数的 <complex.h> ,定义宽字符的 <wctype.h> ,类似于泛型的数学函数 <tgmath.h>, 浮点数相关的 <fenv.h>。 在<stdarg.h> 增加了 va_copy 用于复制 ... 的参数。里增加了 struct tmx ,对 struct tm 做了扩展。
    25. 输入输出对宽字符以及长整数等做了相应的支持。

    但是各个公司对C99的支持所表现出来的兴趣不同。GCC和其它一些商业编译器支持C99的大部分特性微软和Borland却似乎对此不感兴趣。

     

    C11标准

    2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C语言的新标准,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C ,简称C11标准,原名C1X。这是C语言的第三个官方标准,也是C语言的最新标准。

    新的标准提高了对C++的兼容性,并增加了一些新的特性。这些新特性包括:

    1. 对齐处理(Alignment)的标准化(包括_Alignas标志符,alignof运算符, aligned_alloc函数以及<stdalign.h>头文件。
    2. _Noreturn 函数标记,类似于 gcc 的 __attribute__((noreturn))。
    3. _Generic 关键字。
    4. 多线程(Multithreading)支持,包括:
    5. _Thread_local存储类型标识符,<threads.h>头文件,里面包含了线程的创建和管理函数。
    6. _Atomic类型修饰符和<stdatomic.h>头文件。
    7. 增强的Unicode的支持。基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件<uchar.h>.
    8. 删除了 gets() 函数,使用一个新的更安全的函数gets_s()替代。
    9. 增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。
    10. 增加了更多浮点处理宏。
    11. 匿名结构体/联合体支持。这个在gcc早已存在,C11将其引入标准。
    12. 静态断言(static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。
    13. 新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。
    14. 新增 quick_exit() 函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作。

    来源: <http://baike.baidu.com/link?url=gNUFCCorwpgZJaNtM00nh6-3T7eI4OKI2fIQ1nKLpJx1A6Nu9Vlrm8uS7s9gQvJzVqRR0jYCO8_QNmU2fA5ic_>
     

     

     

    C++语言发展大概可以分为三个阶段:

    1. 第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;
    2. 第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;
    3. 第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。


    以下是C++发展年代列表:

    1. 在“C with Class”阶段,研制者在C语言的基础上加进去的特征主要有:类及派生类、共有和私有成员的区分、类的构造函数和析构函数、友元、内联函数、赋值运算符的重载等。
    2. 1985年公布的的C++语言1.0版的内容中又添加了一些重要特征:虚函数的概念、函数和运算符的重载、引用、常量(constant)等。
    3. 1989年推出的2.0版形成了更加完善的支持面向对象程序设计的C++语言,新增加的内容包括:类的保护成员、多重继承、对象的初始化与赋值的递归机制、抽象类、静态成员函数、const成员函数等。
    4. 1993年的C++语言3.0版本是C++语言的进一步完善,其中最重要的新特征是模板(template),此外解决了多重继承产生的二义性问题和相应的构造函数与析构函数的处理等。
    5. 1998年C++标准(ISO/IEC14882 Standard for the C++ Programming Language)得到了国际标准化组织(ISO)和美国标准化协会(ANSI)的批准,标准C++语言及其标准库更体现了C++语言设计的初衷。名字空间的概念、标准模板库(STL)中增加的标准容器类、通用算法类和字符串类型等使得C++语言更为实用。此后C++是具有国际标准的编程语言,该标准通常简称ANSI C++ISO C++ 98标准,以后每5年视实际需要更新一次标准。
    6. 后来又在2003年通过了C++标准第二版(ISO/IEC 14882:2003):这个新版本是一次技术性修订,对第一版进行了整理——修订错误、减少多义性等,但没有改变语言特性。这个版本常被称为C++03。[2]
    7. 此后,新的标准草案叫做C++ 0x。对于C++ 0x标准草案的最终国际投票已于2011年8月10日结束,并且所有国家都投出了赞成票,C++0x已经毫无疑义地成为正式国际标准。先前被临时命名为C++0x的新标准正式定名为ISO/IEC 14882:2011,简称ISO C++ 11标准。C++ 11标准将取代现行的C++标准C++98和C++03。国际标准化组织于2011年9月1日出版发布《ISO/IEC 14882:2011》,名称是:Information technology -- Programming languages -- C++ Edition: 3。

    来源: <http://baike.baidu.com/view/824.htm?fromtitle=c%2B%2B语言&fromid=4102088&type=syn>


    语言的发展是一个逐步递进的过程,C++ 是直接从 C 语言发展过来的,而 C 语言是从 B 语言发展过来的,B 语言是 BCPL 的一个解释性后代,BCPL 是 Basic CPL。其中最有趣的是 CPL 中 C 的由来,由于当时这个语言是剑桥大学和伦敦大学合作开发的,在伦敦的人员加入之前,C 表示剑桥,伦敦人员加入之后,C 表示 Combined 组合。还有一种非正式的说法,C 表示 Christopher,因为 Christopher 是 CPL 背后的主要动力。

    最初导致C++诞生的原因是在Bjarne博士等人试图去分析UNIX的内核的时候,这项工作开始于1979年4月,当时由于没有合适的工具能够有效的分析由于内核分布而造成的网络流量,以及怎样将内核模块化。同年10月,Bjarne博士完成了一个可以运行的预处理程序,称之为Cpre,它为C加上了类似Simula的类机制。在这个过程中,Bjarne博士开始思考是不是要开发一种新的语言,当时贝尔实验室对这个想法很感兴趣,就让Bjarne博士等人组成一个开发小组,专门进行研究。

    当时不是叫做C++,而是C with class,这是把它当作一种C语言的有效扩充。由于当时C语言在编程界居于老大的地位,要想发展一种新的语言,最强大的竞争对手就是C语言,所以当时有两个问题最受关注:C++要在运行时间、代码紧凑性和数据紧凑性方面能够与C语言相媲美,但是还要尽量避免在语言应用领域的限制。在这种情况下,一个很自然的想法就是让C++从C语言继承过来,但是我们的Bjarne博士更具有先见之明,他为了避免受到C语言的局限性,参考了很多的语言,例如:从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了//注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。

    来源: <http://c.biancheng.net/cpp/biancheng/view/1.html>

     

    C++语言标准:

    不是叫做C

    C++ 98 标准

    C++标准第一版,1998年发布。正式名称为ISO/IEC 14882:1998[18] 。

    绝大多数编译器都支持C++98标准。不过当时错误地引入了export关键字。由于技术上的实现难度,除了Comeau C++编译器export关键字以外,没有任何编译器支持export关键字。并且这个标准对现代的一些编译理念有相当的差距,有很多在高级语言都应当有的功能,它都没有。这也正是后来需要制定C++11标准的原因所在。

     

    C++ 03 标准

    C++标准第二版,2003年发布。正式名称为ISO/IEC 14882:2003[19] 。这个标准仅仅是C++98修订版,与C++98几乎一样,没做什么修改。仅仅是对C++98做了一些“勘误”,就连主流编译器(受C99标准影响)都已支持的long long都没有被加入C++03标准。

     

    C++ 11 标准

    C++标准第三版,2011年8月12日发布。正式名称为ISO/IEC 14882:2011[20] 。

    由C++标准委员会于2011年8月12日公布,并于2011年9月出版。2012年2月28日的国际标准草案(N3376)是最接近于现行标准的草案(编辑上的修正)。C++11包含了核心语言的新机能,并且拓展C++标准程序库,并且加入了大部分的C++ Technical Report 1程序库(数学上的特殊函数除外)。此次标准为C++98发布后13年来第一次重大修正。

    注意: C++11标准(ISO/IEC 14882:2011)与C11标准(ISO/IEC 9899:2011)是两个完全不同的标准,后者是C语言的标准。

     

    C++ 14 标准

    C++标准第四版,2014年8月18日发布。正式名称为ISO/IEC 14882:2014[21] 。

    2014年8月18日,ISO组织在其网站上发布文章称:

    C++ 作者 Bjarne Stroustrup 称,主要的编译器开发商已经实现了 C++ 14 规格。

    C++ 14 是 C++ 11 的增量更新,主要是支持普通函数的返回类型推演,泛型 lambda,扩展的 lambda 捕获,对 constexpr 函数限制的修订,constexpr变量模板化等等。

    C++14是C++语言的最新标准,正式名称为"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。C++14旨在作为C++11的一个小扩展,主要提供漏洞修复和小的改进。C++14标准的委员会草案(Committee Draft)N3690于2013年5月15日发表。工作草案(Working Draft)N3936已于2014年3月02日完成。最终的投票期结束于2014年8月15日,结果(一致通过)已于8月18日公布。

     

    如何理解C++?《摘自Effective C++》

    C++已经是个多重范型编程语言(multiparadigm programming language),一个同事支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、范型形式(generic)、元编程形式(metaprogramming)的语言。

     

    如何理解这样一个语言?

    将C++视为一个由相关语言组成的联邦而非单一语言,在其某个次语言中,各种守则与通例都倾向简单、直观易懂、并且容易记住。

     

    C++的4个次语言:

    1. C :          C++以C为基础。区块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(built-in data types)、数组(arrays)、指针(pointers)等都来自C。
    2. Object-oriented C ++ :        类(class)、封装(encapsulation)、继承(inheritance)、多态(polymorphism)、虚函数(virtual function)等都是面向对象设计在C++上的最直接实施。
    3. Template C++ (generic programming) :        C++的范型编程(generic programming)部分。他们带来新的编程范型(programming paradigm),也就是所谓的template meta programming(TMP,模板元编程)。
    4. STL:        即template程序库,对容器、迭代器、算法以及函数对象的规约有极佳的紧密配合与协调。

    C++并不是一个带有一组守则的一体语言,而是由4个次语言组成的联邦语言,每个次语言都有自己的规约。

     

    remember

    C++高效编程守则视状况而变化,取决于你使用C++的哪一部分。

     

    来源: <http://blog.csdn.net/livelylittlefish/article/details/5729847>

    再也不敢轻易声称自己是个C++程序员了,无知者无畏,果然是呀再见

     

    C++与C的关系

    C语言是C++的基础,C++和C语言在很多方面是兼容的。

    C语言是一个结构化语言,它的重点在于算法与数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制。所以C语言和C++的最大区别在于它们解决问题的思想方法不一样。

    C++对C的“增强”,表现在六个方面:

    • (1) 类型检查更为严格。
    • (2) 增加了面向对象的机制。
    • (3) 增加了泛型编程的机制(Template)。
    • (4) 增加了异常处理。
    • (5) 增加了运算符重载。
    • (6) 增加了标准模板库(STL)。

    与C不兼容之处

    C++一般被认为是C的超集合(Superset),但这并不严谨。大部分的C代码可以很轻易的在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中失效,或者在C++中有不同的行为。

    1. 最常见的差异之一是,C允许从void*隐式转换到其它的指针类型,但C++不允许。
    2. 另一个常见的可移植问题是,C++定义了新关键字,例如如new,class,它们在C程序中可以作为识别字(例:变量名)的。
    3. 在C标准(C99)中去除了一些不兼容之处,也支持了一些C++的特性,如//注解,以及在代码中混合声明。不过C99也纳入几个和C++冲突的新特性(如:可变长度数组、原生复数类型和复合逐字常数)。

    若要混用C和C++的代码,则所有在C++中调用的C代码,必须放在 extern "C" { /* C代码 */ } 内。

    展开全文
  • 三个故事带你快速理解C、C++、C#的区别!

    万次阅读 多人点赞 2019-06-23 20:05:33
    案例一: 任务:把大象放到冰箱里。 ...C语言是一个极其高冷的人,因此回答都是冷冷的: ...我:你好C语言,我想把大象放到冰箱里,帮我做好不好?...我:好的,我用malloc,申请一块空间放大象好...

    案例一:

    任务:把大象放到冰箱里。

     

     

    C:

    C语言是一个极其高冷的人,因此回答都是冷冷的:

    我:你好C语言,我想把大象放到冰箱里,帮我做好不好?

    C:好

    我:那我们要怎么做呢?

    C:猜

    我:额。。。是不是应该先创造一只大象?

    C:是

    我:怎么创造呢?

    C:猜

    我只好去翻了一下文档,哦,malloc一块内存啊。

    我:好的,我用malloc,申请一块空间放大象好不好?

    C:好

    我:额。。。大象怎么构造呢?

    C:猜

    我。。。去看了看大象的结构

    我:好吧。。。我定义了一个大象的数据结构,接下来怎么做?

    C:猜

    我心里一阵说不出的感觉。。。

    我:哦好吧,我创造一个冰箱,步骤应该和大象差不多。

    C:嗯

    我翻看了冰箱的结构,然后定义了一个冰箱的struct。

    我:好了,冰箱构造出来了,怎么放呢?

    C:哼

    我。。。默默在Stack Overflow上输入"如何把大象放进冰箱 C"。

    我:终于找到答案了,定义一个方法,把大象的鼻子放进去、眼睛放进去、耳朵放进去。OK,都放进去了。C,你输出一下看看吧。

    C:烫烫烫烫烫烫烫

    我:哈哈哈哈C你终于不高冷了

    。。。

    我:哎,你咋不说话了?C?你发烧了吗?

    立刻一盆水倒上去。

    结束。

    有兴趣一起交流c/c++的小伙伴可以加群:941636044

     

     

    C++:

    C++是一个知识渊博的孩子,相对年轻,也没那么高冷。

    我:C艹,我们把大象放冰箱好吗?

    C++:滚

    说话的不高冷呢?

    我:额我错了,亲爱的C++,我们把大象放冰箱好吧。

    C++:好的么么哒,大象的数据类型已经有人定义好了,冰箱也有人定义好了,你需要分别构造一个哦。

    我:好的。

    于是我翻看了文档后知道了用new来构造

    我:OK,亲爱的C++,我想构造一个大象。

    C++:好的,构造大象的方法有13个,请问你选择哪一种呢?

    我。。。

    我:你介绍一下吧。

    C++:OK,首先可以在栈上面构造,这么做的好处呢是可以方便资源管理,而且语法也好看一些,可以利用RAII,如果你不知道什么事RAII,你可以去cppreference上面查一下,当然你也可以在堆上构造,可以构造一只很大很大的大象,还有。。。。。。。

    一个月过后,C++终于讲完了。我也长满了胡须。。。刮了胡子之后继续工作

    我:好的,C++,我就在栈上面构造一只大象吧。

    C++:你不爱我了。

    我:???

    C++:你都没有说“亲爱的”。

    我。。。

    我:好吧,亲爱的C++,我想简单构造一只大象。

    C++:好的呢,你可以选择构造一只非洲象还是美洲象还是南极洲象,象的肤色是什么样子的你可以设定一下,象的屁股大小你可以设定一下,象的性别和性取向你看要什么。。。。。。

    我:我就想要一只简单的,默认的就好。

    C++:好的,构造出来了一只,你可以选择怎么初始化它,有13种初始化方法,推荐使用最新的统一初始化。

    我。。。

    我:统一初始化

    C++:好的,我们可以构造冰箱了。

    我:好。。。

    经过一个月的选择,终于构造出了冰箱。

    C++:好的,冰箱提供了addElephant方法,可以直接使用哦。

    我:哇太棒了,好的,我就用这个方法。

    C++:这个方法提供了多种重载,可以拷贝,移动,也可以直接转发,省的在移入冰箱之前构造一个大象。

    我:。。。你为啥不早说

    C++:你为啥不早问。

    我:就用移动的吧。

    C++:OK,请用std::move将构造好的大象转为右值引用。

    我一脸懵,但是还是照办。

    我:好了

    C++:OK,开始放入冰箱了哦,速度极快的呢。

    突然

    C++:报错了报错了,分子和原子不是可以转换的类型,大熊猫和爱迪生之间没有+运算符等1556项错误。

    我。。。。。。。。。

    我:网上找资料,说看最后一行就差不多了,好的看看。嗯,看起来是第31行出错了,错误是什么呢?报错信息啥也没说明白啊。随便改改吧。编译,运行。

    C++:好的,已经将臀围12米,左臂长13米,右臂长14米,喜欢公大象,没有结婚生子,从小家教不错,熟读四书五经的非洲母大象放入橘黄色,五十米高,六十米宽,三百米厚,温度有零下三百度,制冷剂的牌子是湖澈牌,额定电压220V的冰箱里。

    我。。。长舒了一口气。

     

     

    C#:

    我:我想把大象放进冰箱。

    C#:好的主人,我爸爸微软已经写好了大象类,也写好了冰箱类,你只需new一下就好了。

    我:OK,new好了,放入冰箱。

    C#:好的,已经放入,使用了冰箱的拓展方法addElephant<>方法。

    我:嗯,你表现得很好,能不能放的稍微快点儿,刚刚C++放的就很快。

    C#:为了您的安全,不能。

    我:额。。。那我想调节一下大象耳朵的尺寸。

    C#:对不起,不能调节。您可以设定大象的耳朵形状,已为您定义好多种耳朵形状,您还可以调整大象的肤色,已为您定义好多种肤色。

    我:算了不调了,就这样吧。

    C#:好的。如果您需要速度,或者需要对大象的每个细节进行把握,还可以去看看我的弟弟,C++/CLR,他可以完成您提出的这些功能。您也可以将他带到我这里来,我们可以一起工作的。你也可以把C++完成的工作导出到二进制形式,我可以直接使用的。

    我:好的谢谢,不用了。

    C#:好的,祝您生活愉快。

    案例二:

    在遥远的地方,有三位大魔法师,吸引了许多学徒。

    第一位大魔法师叫C,他是这样教学生的。

    "火球术:"

    "首先,把提前写好的符咒放在桌子上。"

    "然后,把左手抬起来。"

    "把右手抬起来。"

    "让左手的位置下移3厘米。"

    ………

    ………

    ………

    省略大约100行。

     

     

    虽然这位魔法师的方法很麻烦。但是很快就能召唤出火球,同时以后重复这个步骤就可以召唤出火球。

    第二位大魔法师叫C++,是C的徒弟。

    他的火球术则是这样的。

    "首先,用100个小时制作一张封装的,美观的,有注释的符咒,然后专门写一篇文档描述它的外表。"

    "然后在上面写上火球术三个字。"

    "扔出去。"

    这位大魔法师的火球术使用很方便,只不过制作过程过于繁琐,并且有的时候可能会过十分钟才出现火球。

    第三位大魔法师叫C#,据说是C和另一位姓J的大魔法师的不清不楚的产物。

    他的火球术很简单,只要喊一声 火球! 就可以了。

    只不过有一个致命的缺点。

    如果离他的距离超过了5米,那所有的法术都会失效并且出现一大堆红色的写着error的神秘符咒,据说那是异次元的魔鬼的产物。

    案例三:

    C就像一台引擎裸露在外,轮子变速箱刹车传动轴承都要自己装的“车”,如果你是DIY狂人喜欢自己造车,你会喜欢C的;

    C++就像上面说的DIY狂人造出来的一台马力十足的跑车,包含了C的全部优点外加一个外壳。开起来是疯狂的野兽马力十足,但是不是谁都能驾驭了,稍有不慎就会车毁人亡;

    C#就像一台综合性能非常好的轿跑,自动超速箱ABS防抱死空调音响一应俱全。让你轻松上路,怎么开怎么爽。但是你永远体会不到飙车的激情了,而且这车只能在特定公路开哦~

    好了,通过三个案例大家应该对于C、C++、C#的区别有了一些认知了,喜欢的话可以支持或者关注哦!



     

    展开全文
  • cc++汉字的输出

    千次阅读 2018-05-10 08:10:32
    #include &lt;iostream&gt; using namespace std; #include &lt;windows.h&gt; #include &lt;conio.h&gt;...#define stoptimelong 500 //Sleep函数以毫秒为单位,Sle...
    #include <iostream>
    
    using namespace std;
    
    #include <windows.h>
    #include <conio.h>
    #include <stdlib.h>           //system函数所需头文件
    #define stoptimelong 500    //Sleep函数以毫秒为单位,Sleep(500);表示停半秒
    
    #pragma warning(disable:4996)
    
    //中文的所有符号和等全是小于0的
    string str = "汉字里有english也能正确显示,hehe";
    
    int main17060603()
    {
    	int i = 0, len = str.length();
    	while (i<len)
    	{
    		if (str[i] < 0)
    		{
    			printf("%c%c", str[i], str[i + 1]);
    			i++;
    		}
    		else
    		{
    			printf("%c", str[i]);
    		}
    		i++;
    	}
    	return 0;
    }
    
    //跳到屏幕指定坐标
    
    void gotoxy(int x, int y)
    {
    	CONSOLE_SCREEN_BUFFER_INFO    csbiInfo;
    	HANDLE    hConsoleOut;
    	hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo);
    	csbiInfo.dwCursorPosition.X = x;
    	csbiInfo.dwCursorPosition.Y = y;
    	SetConsoleCursorPosition(hConsoleOut, csbiInfo.dwCursorPosition);
    }
    
    int main17060602(void)
    {
    	int x = 14, y = 5;
    	gotoxy(x, y);
    	printf("你好!");
    	Sleep(stoptimelong);
    //	system("color 10");     //调用控制台颜色管理命令,可以改变屏幕和字体的颜色
    	printf("欢");
    	Sleep(stoptimelong);
    	printf("迎");
    	Sleep(stoptimelong);
    	printf("来");
    	Sleep(stoptimelong);
    	printf("到");
    //	system("color 19");
    	Sleep(stoptimelong);
    	printf("计");
    	Sleep(stoptimelong);
    	printf("算");
    	Sleep(stoptimelong);
    	printf("机");
    //	system("color 37");
    	Sleep(stoptimelong);
    	printf("冒");
    	Sleep(stoptimelong);
    	printf("险");
    //	system("color 46");
    	Sleep(stoptimelong);
    	printf("世");
    	Sleep(stoptimelong);
    	printf("界");
    	Sleep(stoptimelong);
    	printf("!");
    	Sleep(stoptimelong);
    	cout << endl;
    	getchar();
    	return 0;
    }
    
    
    int main17060802()
    //int main()
    {
    	cout << "I made it!" << endl;
    	char my1[] = "一别都门三改火,天涯踏尽红尘。\
    		依然一笑作春温。无波真古井,有节是秋筠。\
    		惆怅孤帆连夜发,送行淡月微云。\
    		尊前不用翠眉颦。人生如逆旅,我亦是行人。";
    	char my[] = "定风波、莫听穿林打叶声。宋代:苏轼。\
    					                                 三月七日,沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉,已而遂晴,故作此词。\
    													                                 莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。\
    																					 		                       料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。";
    
    	//char my[] = "一别都门三改火,天涯踏尽红尘。依然一笑作春温。无波真古井,有节是秋筠。惆怅孤帆连夜发,送行淡月微云。尊前不用翠眉颦。人生如逆旅,我亦是行人。";
    	char s[3] = { 0 };
    	char over[] = "。";  //中文的句号字符串
    	cout << endl << endl << "    ";
    	//逐个输出汉字
    	for (int k = 0; k < strlen(my); k += 2)
    	{	
    		printf("%c%c", my[k], my[k + 1]);  //每两个字符表示一个汉字
    		Sleep(300);
    
    		sprintf(s, "%c%c", my[k], my[k + 1]);  //把一个中文的字符转化存到s中
    	    //sprintf_s(s, "%c%c", my[k], my[k + 1]);
    		if (strcmp(s, over) == 0)  //字符串对比是否是句号,如果是则换行
    		{
    			printf("\n");
    		}
    	}
    
    	cout << endl << endl;
    	char poetry[] = "一别都门三改火";
    
    	int j = 0;
    	while (j<strlen(poetry))
    	{
    
    		printf("%c%c", poetry[j], poetry[j + 1]);
    		j += 2;
    		Sleep(100);
    	}
    
    	cout << endl<< "---------------" << endl;
    
    	string po = "一别都门三改火";
    	int i = 0, len = po.length();
    	while (i<len)
    	{
    		
    			printf("%c%c", po[i], po[i + 1]);
    			i += 2;
    			Sleep(100);
    	}
    	cout << endl;
    	//cout << sizeof(poetry) << endl;
    	//cout << strlen(poetry) << endl;
    	system("pause");
    
    	return 0;
    }

    展开全文
  • CC++程序员“是否应该掌握”【某种汇编语言】?

    万次阅读 多人点赞 2011-09-11 15:19:32
    工作3年之余,发现精力会随着很多事情而降低,以前觉得很有激情很有兴趣的东西,可能会慢慢变得“无关紧要”了。不知道这是一种所谓的洒脱,还是一种懈怠。总之我会努力克服现在的状态,让自己的业余时间再充分利用...

            工作3年之余,发现精力会随着很多事情而降低,以前觉得很有激情很有兴趣的东西,可能会慢慢变得“无关紧要”了。不知道这是一种所谓的洒脱,还是一种懈怠。总之我会努力克服现在的状态,让自己的业余时间再充分利用起来。加上最近得了一个“准专家徽章”,为了对得起这个徽章,也为了摆脱前面的懈怠,我要坚持写下去。

            之前在网络上,一群伙计在那儿讨论关于CC++程序员是否应该对汇编语言有一定的掌握程度的问题,当然我作为一名CC++程序员也参与了讨论。对于这个问题,我有我自己的观点,可以说是亲身的感受和经历以及经验之谈。于是,抽这个中秋假期有时间,跟大家分享一下。当然,首先声明一下,本文只代表我个人的观点,您愿意接受,我感欣慰;不愿接受,就当我在这里唱独角戏。技术上的东西,每个人都有自己的一套方法,没有对错,还是我一贯的观点:我只吸收对我有用的,无用的就当看小说吧。

            首先,就本文标题而言,为什么强调是“某种汇编语言”。我想,大家都知道,汇编语言只是所有平台汇编语言的统称,这样说来,不同的平台就会有不同的汇编语言,即不同的汇编指令、不同的机制等。这里所谓的某种,即在自己经常工作的平台下的汇编语言。

            其次,对于是否应该掌握这个问题上,反对掌握的观点大致有以下几点:

                    1、对于普通软件开发人员来讲,关注于上层实现,关注于功能和产品才是主要,汇编也用不到。

                    2、很多的CC++程序员不懂汇编,也成为了某公司某项目组主程序、核心研发,因此汇编可以不学不用。

                    3、绝大多数CC++程序员还是在做上层开发,绝大多数项目也是上层开发,不了解底层也能赚到大钱,而且是更多的钱。

                    4、做底层,比如:逆向、破解、写病毒等,很多致力于这层的程序员,感觉整天昏天暗地,无数的重复劳动也没赚到大钱,觉得没意义。

                    5、对于做C#、java、WEB等领域的程序员们,大多数不会去关注底层实现,他们照样过得很好,以此类推,汇编也是可以不掌握的。

                    6、汇编语言几乎是不跨平台的,于是就算你掌握了某个平台的汇编,但你在汇编语言上,例如语法、机制等还是有局限性。

     我就暂时列举这么几种反对的观点,可能你还有其他的看法,欢迎你的回复。至于支持掌握的观点,也就是我个人的观点,我个人是站在支持一方的。所以下面就是我针对上面几种反对的观点的看法以及我个人的体会。

            从上面几种反对的观点来看,可以总体分为几个关键点:利益、收入和兴趣。我不打算将这三个关键点分别进行针对性阐述,因为它们之间都是息息相关分不开的。对于利益和收入上来讲,的确是有很多公司的高职位且收入不错的程序员并不了解汇编和底层,这样也不代表他们没有能力,而往往他们是非常有能力的人。这样一来似乎和我个人的支持类的观点有所冲突,但我认为这个冲突可以用追求二字来化解。为什么可以用追求来化解呢?因为追求可以是任何领域、任何方向、任何目的和任何标准的,因此也就是我前面所说的,归结到根本,掌握不掌握都没有对错。那我就说说我作为一个程序员的感受吧。

            我们进入这个行业,从事了编程工作(大多数程序员都是编程开发做起的)。我相信很多程序员的初衷,都是对编程开发有很大的兴趣,兴趣驱使着我们熬夜,驱使着我们研究, 驱使着我们进步。对于CC++程序员,我相信兴趣占有很大的比重。那么,我们来举几个例子:

            你应该看过《深入C++对象模型》这本书吧,这是一本非常细致和美妙的书,我想你应该有这样的感受。那么在此基础之上,你有过更多的思考吗?这本书里都是以实例和理论来进行讲解的,实例是以C++语言进行描述的。于是你是否有想知道在具体的编译器和平台下的这样一些疑问:

                    1、this指针是怎么传递进成员函数的?成员函数和普通函数以及静态成员函数有何区别和联系?

                    2、透过语法,成员函数和类在内存中有什么联系?对象和成员函数有何种联系?

                    3、函数间的调用原理,是怎么实现的?

                    4、__cdecl、__stdcall、__thiscall和__fastcall这几种函数调用方式,在本质上有什么区别?具体是怎么实现的?

                    5、虚函数、多态和继承在本质上的体现,以及这些机制在底层是怎么实现的?

    除此之外,你在学习和使用CC++的时候,我想你还会在乎一些细节,例如:

                    1、递归函数一定会导致低效?编译器针对递归函数会不会有什么样的优化?你怎么知道这些优化细节?

                    2、对于这句代码:int b = a > 0 ? 100 : 200;  // int a;      编译器会有什么细节上的优化?这句代码会有比较并跳转的过程吗?

                    3、对于这样的代码:      

             #include <stdio.h>
             int a = 10;
             int main( void )
             {
                 printf( "%d", a );
                 return 0;
             }                      

                          在VC下,开启全局优化,全局变量a还存在吗?你怎么通过本质的论证来证明?

                    4、对于:float a = 100;  int b = a / 30;  在VC下,你会不会怀疑这两句代码背后会存在函数调用?如果有,调用了什么函数?为什么?

                    5、对于__declspec( thread ) int g_nNum = 0; 你知道g_nNum++;这句代码背后的具体实现机制吗?

                    6、对于调试,你会怎么根据自己记录的程序崩溃时的堆栈现场及其它信息来错误跟踪查找呢?

                    7、对于开发游戏来说,你怎么知道外挂是怎么修改游戏程序的,修改了哪个地方呢?

                    8、你要怎么熟悉编译器的优化细节,怎么写出适应它的代码,怎么写出比它优化得更好的代码?

            还有很多这样上层开发的例子,这里就不一一列举了。从上面列举的这些疑问,我想作为一名CC++程序员,热爱编程开发的程序员来讲,你都想知道其中的原委。作为上层开发者,是应该关注上层的功能开发和产品方面的东西。但是我个人觉得,本着技术,本着这份热爱,本着自身的技术发展,了解更底层一些,有助于上层开发的通透性,以及全局的掌控力度。从我个人的感受来讲,当把握了关键细节以及全局设计之后,任何地方出了问题,都能很及时的反应并予以追查和处理。在当前的编译器技术上,已经非常强大了,很多细节可以放心的交给编译器来优化和处理。但是我想,编译器不是万能的,人才是最智能的。掌握不是必然,但掌握了会更好。

            对于初学者乃至工作了一定时间的程序员,对于CC++,很多处于CC++语法的层面,在语法上的条条款款使用得得心应手,问其本质,可能就缺乏一二了。我个人的经历来看,在掌握语法之后,在向下关注一下语法背后的具体实现,会通透很多。你会在内存上、数据上和程序的各种底层运行机制上会有深刻的认识。这也就是为什么去海边玩儿,还要潜水去看看海底世界。错过了海底,你会失去很多精彩,而这些精彩我想也是作为程序员应有的追求之一。

            对于java、C#以及WEB类领域的程序员,我想汇编可能相对遥远一些。在这方面的关注也会相对少一些,但结合前面的观点,作为程序员这个角色,都是让自己的程序在机器上面跑起来,那么我想这之间的诸多底层的疑问可以作为程序员的一种兴趣来研究。目的也是为了让自己更通透,更熟悉自己的平台。我不知道怎么表达通透二字,就我个人的感受就是,能够从现象联系到本质实现,并且能够从本质实现勾勒出一幅很清晰生动的图像在脑子里,一切都一目了然尽收眼底。有点居高临下,望长城内外,惟余莽莽的那种宽广的感触。

            对于本身就处于底层开发的程序员来说,无可厚非,掌握汇编就是必须的了。但是澄清一点,本文的观点更多的是从兴趣和通透性上出发,对于底层开发者可能会觉得底层有一定的枯燥,特别是整天破解、逆向等工作,非常多的体力活,从我几年的业余破解和逆向经验来看的确是这样的。但是我觉得,破解和逆向只是领域之一,我之所以破解和逆向,很多时候是处于兴趣和为了对上层进行更本质和合理的解释。所以,上层和底层结合,才是我的根本目的,也是本文想推崇的一种思路。

            综上所述,我的观点是CC++程序员乃至程序员,不管是作为兴趣还是工作,掌握或者了解一下汇编都是有一定必要的,但不是强制性的,也正所谓需求和追求不尽相同罢了。因此,不要问别人到底是否应该关注一下底层,掌握一下某种汇编语言,答案很明显。

           号外:如果想更多的了解掌握了汇编的好处,可以看一下本博客里的C/C++ inline汇编语言版块的文章

           ---- 如需转载,请注明出处[http://blog.csdn.net/masefee],谢谢!----

    展开全文
  • CC++结构体初始化与赋值

    万次阅读 2018-03-01 09:38:31
    1.CC++结构体的初始化今天看到项目中对自定义结构体初始化方式有点陌生,特在此罗列一下可用的结构体初始化的方式。对结构体struct A { int b; int c; }1234有几种初始化方式:第一种:struct A a = { .b = 1, ....
  • Premiere Pro CC 2018功能特点 Premiere(简称PR),是一款功能很强大的视频剪辑软件,广泛用于影视后期、婚前剪辑等地方 如果您的系统是32位的,那么只有2.0、CS3、CS4可供选择。请务必不要选择绿色版、精简版,...
  • c/c++zip压缩解压缩

    千次下载 热门讨论 2010-07-09 19:35:25
    这个是目前最简单傻瓜式的,基于c/c++ 的压缩解压缩程序。 操作非常简单。里面有教程,有图。 有源代码。
  • CC2530+CC2591 PA寄存器配置

    万次阅读 2015-12-21 15:11:59
    在TI Ztack 协议栈中,CC2530与CC2591接线方式如下图: CC2591有三个脚与CC2530连接,如果硬件管脚连接的是其他的管脚则需要在协议栈上修改。值得注意的是PA_EN与EN只能连接在P1_0到P1_5,这是由CC2530决定的。...
  • Photoshop CC 2019 软件安装包+破解教程

    万次阅读 多人点赞 2018-12-25 17:00:31
    Photoshop CC 2019 部分新功能: 1、Ctrl+Z 成为了默认的重复撤销键; 2、等比例缩放,不用按 Shift 啦; 3、点击空白处即可确认文字输入;双击即可编辑文字; 4、图层混合模式可以实时预览; 5、新增色轮取色...
  • 关于CS+ for CC的一些使用心得

    千次阅读 2019-05-10 13:30:18
    这两天做了一个项目,里面用到了renesas的一款芯片做主控;在编写程序及调试的过程中遇到...瑞萨目前有两款程序编译器在使用,一款是e2studio,还有一款就是CS+ for CC;关于e2studio的这一篇就不讲了;来说说CS+ f...
  • cc2531+cc2591的zstack协议栈修改

    千次阅读 2014-01-17 21:25:52
    ZA2530-2591采用CC2591作为射频前端,协议栈完美支持CC2530+CC2591组合,但需要在编程时做出相应修改,否则无法取得良好信号:需在hal_board_cfg.h中将 #define xHAL_PA_LNA 改为 #define HAL_PA_LNA
  • 前不久,由中国金融认证中心(CFCA)信息安全实验室检测的一款芯片获得了首个国内EAL5+认证证书。...为了有助于大家更全面地了解CC,本文在上篇《白话说CC-稍有点小复杂的CC介绍》的基础上,重点介绍一下EAL4+和EAL5...
  • CC2530 + RFX2401C Zigbee模块

    万次阅读 多人点赞 2012-12-26 14:35:39
    最近公司的一个项目需要使用zigbee,购买了网上的现成的模块,通信距离都很远,但是协议等都不公开,价格也很高,不方便使用,最后决定自己画板子,起初使用的是CC2530 + CC2596的组合,发现效果很差,主要是CC2596的...
  • 首先在网上买了一对CC2530+RFX2401C的模块,发射功率和1.2公里吹嘘的话也不知道是不是真的,暂时当它是真的吧!手头上也没有什么工具可以测这些参数。 跑题了,还是先看看代码怎么修改吧。我们根据模块的硬件连接线...
  • CC框架学习总结

    千次阅读 2017-10-29 22:03:13
    一、下载CC框架 下载地址:http://pan.baidu.com/s/1qYwoEss 解压缩之后就是这样的 二、生成训练配置文件 进入jobs下的yzm-easy文件夹,打开产生变迁文件3.exe 填写你的样本文件夹路径,...
  • C/C++描述 第十一届蓝桥杯省赛 第一场(2020.7.5) 题目+题解
  • w5500+stm32+cc2530的家庭网关小板

    千次阅读 2017-06-04 15:38:57
    板子上主要的硬件包括:w5500 stm32 cc2530 sd卡 ch340g 于是又 吧板子重新画了一次,这次的板子显得更加的完美,基本硬件调试通过,网络稳定。 板子焊接的很丑,就不要笑我了 上两张图: 部分的原理图: USB...
  • 最新制作出CC1101+PA无线收发模块

    千次阅读 2011-02-24 14:05:00
    CC1101+PA+LNA是在CC1101的模块上加了功率放大器以及高频信号放大器,是集FSK/ASK/OOK/MSK调制方式于一体的无线收发模块,CC1101+PA+LNA射频收发模块是用于低功耗无线应用的业界系统成本最低的多通道无线电...

空空如也

1 2 3 4 5 ... 20
收藏数 846,888
精华内容 338,755
关键字:

cc++

c++ 订阅