执行if语句。9%3==0,if语句的条件表达式成立,执行printf(%d”,- -y),即y先自减1变为8,然后在输出,因此屏幕上输出8
C++ 封装 我们都知道多核编程常用锁避免多个线程在修改同一个数据时产生race condition。当锁成为性能瓶颈时,我们又总想试着绕开它,而不可避免地接触了原子指令。 C++11正式引入了原子指令,我们就以其语法描述。 顾名思义,原子指令是对软件不可再分的指令,比如x.fetch_add(n)指原子地给x加上n,这个指令对软件要么没做,要么完成,不会观察到中间状态。 为了解决这个问题,CPU和编译器提供了memory fence,让用户可以声明访存指令间的可见性(visibility)关系,boost和C++11对memory fence做了抽象,总结为如下几种memory 理解C++的原子操作 事实上,Sequentially-consistent ordering是目前绝大多数编译器的缺省设置。 C++11所规定的这6种模式,其实并不是限制(或者规定)两个线程该怎样同步执行,而是在规定一个线程内的指令该怎样执行。是的,我知道这部分的文档(规定)以及给出的例子里面,满屏都是多线程。
singleton // T must be: no-throw default constructible and no-throw destructible template <typename T> struct Singleton { private: struct object_creator { // This constructor does nothing more than ensure that instance() // is call
1.C++11的发展历史 C++11 是 C++ 的第⼆个主要版本,并且是从 C++98 起的最重要更新。它引⼊了⼤量更改,标准化了既 有实践,并改进了对 C++ 程序员可⽤的抽象。 C++03 与 C++11 期间花了 8 年时间,故⽽这是迄今为⽌最⻓的版本间隔。从那时起,C++ 有规律地每 3 年更新⼀次。 +语法中就有引⽤的语法,⽽C++11中新增了的右值引⽤语法特性,C++11之后我们之前用到的引⽤就叫做左值引⽤。 纯右值和将亡值C++11中提出的,C++11中的纯右值概念划分等价于 C++98中的右值。 C++还⽀持更复杂的包扩展,直接将参数包依次展开依次作为实参给⼀个函数去处理。
C++ 11 的一些新特性 原始字面量 R("string...") /text.cc 上面换了个行)"; std::cout << str << std::endl; } [Running] cd "/root/code-server/c11 -new/" && g++ 字符串字面量.cc -o 字符串字面量 && "/root/code-server/c11-new/"字符串字面量 ../..
注:作者 Danny Kalev 曾是 C++ 标准委员会成员。 Lambda 表达式 Lambda 表达式的形式是这样的: [cpp] view plaincopyprint? vector<int> vi; typedef decltype (vi.begin()) CIT; CIT another_const_iterator; 统一的初始化语法 C+ delete; }; NoCopy a; NoCopy b(a); //编译错误,拷贝构造函数是 deleted 函数 nullptr nullptr 是一个新的 C+ 下面介绍一些 C++11 的标准库新特性: 线程库 从程序员的角度来看,C++11 最重要的特性就是并发了。 如果觉得 C++ 变化太大了,不必惊恐,花点时间来学习就好了。可能在你融会贯通新特性以后,你会同意 Stroustrup 的观点:C++11 是一门新的语言——一个更好的 C++。
如上代码,自我赋值的时候会出现删除自身数据的操作,这样非常危急。由于p变成了野指针。
nullptr\text{nullptr}nullptr 的出现是为了取代 NULL\text{NULL}NULL,避免 NULL\text{NULL}NULL 的二义性。
如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11。当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的。 C++ 11可以让你的代码更短、更清晰、和更易于阅读,这可以让你的效率更高。 C++ 11提供了一种方法来检查先决条件并尽早的在可能的时机捕获错误-编译过程中,在你运行代码前。这就是理由9。 这是通过静态断言(static_assert)和类别属性模版实现的。 现在开始掌握C++ 11 在C++ 11标准中除了上描述的还有更多的改动和新功能,它需要一整本数来描述。不过,我相信它们是值得你花时间去学习的。你将省去以往花在提高效率上的时间。 很多主流的编译器已经开始支持C++ 11的一些标准了。还等什么?开始吧! 推荐: http://www.cnblogs.com/roucheng/p/3456005.html
一、C++11简介 1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫 结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11。 从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。 相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,是C++的重点内容。 提供了initializer_list类,此类型用于访问C++初始化列表中的值,该列表是const T类型的元素列表。 六、右值引用和移动语义 传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,无论左值引用还是右值引用,都是给对象取别名。 1. 什么是左值?什么是左值引用?
8 list.reverse()反向列表中元素 9 list.sort(cmp=None, key=None, reverse=False)对原列表进行排序 10 list.clear()清空列表 11 9 radiansdict.update(dict2)把字典dict2的键/值对更新到dict里 10 radiansdict.values()返回一个迭代器,可以使用 list() 来转换为列表 11
include<iostream> 5 #include<vector> 6 #include<numeric> 7 using namespace std; 8 9 int main() 10 { 11
前言: 在C++11之前,C++98的出现使得C++看起来更像是一门独立的语言,C++委员会成立后,对外宣称的是5年一个版本,但是呢,计划赶不上变化,03年发布了C++03,计划07年发布07版本,变数多了 ,就一直拖啊拖,拖到了C++11,也就是2011年才发布,搁了这么久,C++11也是憋了一个大的,但是挨骂也挨多了,于是呢,后面就想着,有点新东西了就发布新版本,比如之后的C++14 C++17,C++ 20等,目前来说,C++98 C++11 C++20都是大版本,其中20还没有那么大,毕竟是3年更新一次,C++11相对于98来说,更正了许多错误,引入了很多新特性,包含了约140个新特性,600个缺陷修正 ,所以这个大版本需要学习的有很多,目前很多公司都是以11作为基准版本的,学习也是很有必要的。 2.3 nullptr 在C++中,对于NULL定义一直是宏定义为0,这就可能引入部分问题了,因为同时可以表示整型和指针类型,C++11中出于安全考虑加入了nullptr,表示空指针。
前言: 继上文介绍了右值概念,本文介绍两个C++11中的重要概念,lambda表达式和模板的可变参数,这两个部分都不算难,重在理解,有了lambda表达式和模板的可变参数的基础才好理解包装器。 2 模板的可变参数 模板的可变参数,在C++11中可以经常看到的: 就比如emplace的参数,就是模板的可变参数,没错,那三个点也算进去了! 因为模板的可变参数,在C语言里面可以一次性打印多个值(只用一次printf),那么我们想用C++实现怎么办呢? 在printf里面,参数包的底层是一个数组,但是C++里面,参数包我们只能说它是一个集合,所以当我们传了参数进去,但是不能像使用for遍历一个数组一样去遍历这个参数包了。 class Heap { public: static Heap* CreateObj() { return new Heap; } // C++98 私有+只声明不实现 // // C++11
c++入门教程–-11递归 递归的意思就是函数自己调用自己。 但在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环。 例子: 5!
前言: 本文介绍的是包装器以及线程库的简单了解,但是呢,线程是基于对Linux有一定的了解,所以本文就是简单介绍一下,介绍完包装器以及线程库的简单理解之后C++11的特性就到此为止,当然C++11远不止于此 但是C++不太喜欢使用。 lambda表达式是吧?但是lambda表达式没有类型概念,所以每次需要auto接受,相对于其他两个来说,lambda表达式算是比较好操作的了。
除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”:如下:int *p1 = NULL; // 需要引入cstdlib头文件int 到这里,大家心里有没有疑问:为什么C++11要引入nullptr?它与NULL相比又有什么不同呢?这就是我们今天要解决的问题。 C/C++中的NULL到底是什么我们查看一下C和C++的源码,不难发现:1.NULL在C++中的定义,NULL在C++中被明确定义为整数0:/* Define NULL pointer value */ 那么问题又来了,我们从一开始学习C++的时候就被告诫C++是兼容C的,为什么对于NULLC++却不完全兼容C呢?通过查找维基百科,才发现这其中的原因。 简单地说,C++之所以做出这样的选择,根本原因和C++的函数重载机制有关。
纯右值和将亡值C++11中提出的,C++11中的纯右值概念划分等价于C++98中的右值。 3. 用图来展示它们之间的关系就如上图所示,C++将其这样分类意义其实不大,所以这个知识点大家了解一下即可,知道有这么个名词即可。 下面我们就来解决这个问题: 首先 C++中不能直接定义引⽤的引⽤如 int& && r = i; ,这样写会直接报错,通过模板或 typedef 中的类型操作可以构成引⽤的引 这是C++规定的,所以说大家也不必纠结为什么这样写。 以上就是C++11(二)的内容。
紧接上文,C++11还有一些知识我们需要了解一下: 5.新的类功能 5.1默认的移动构造和移动赋值 原来C++类中,有6个默认成员函数:构造函数/析构函数/拷⻉构造函数/拷⻉赋值重载/取地址重 5.3default和delete C++11可以让你更好的控制要使⽤的默认函数。假设你要使⽤某个默认的函数,但是因为⼀些原因 这个函数没有默认⽣成。 有人会感觉lambda的格式和我们之前学的传统的格式不太一样,看起来就不像是C++的代码,这种感觉没错。 如果学过python,就会感觉很熟悉,C++这个语法就是抄的python,所以才会显得这么奇怪,而C++11过后,我们称C++11之前的C++是传统C++,C++11及之后我们称为现代C++,也是因为C 以上就是C++11(三)的内容。
1.C++11的发展历史 C++11 是 C++ 的第⼆个主要版本,并且是从 C++98 起的最重要更新。它引⼊了⼤量更改,标准化了既有实践,并改进了对 C++ 程序员可⽤的抽象。 C++03 与 C++11 期间花了 8 年时间,故⽽这是迄今为⽌最⻓的版本间隔。从那时起,C++ 有规律地每 3 年更新⼀次。 2.2C++11中的{} 1.C++11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。 3.右值引用和移动语义 C++98的C++语法中就有引⽤的语法,⽽C++11中新增了右值引⽤语法特性,C++11之后我们之前学习的引⽤就叫做左值引⽤。 现代C++中,lvalue 被解释为loactor value的缩写,可意为存储在内 存中、有明确存储地址可以取地址的对象,⽽ rvalue 被解释为 read value,指的是那些可以提供