zoukankan      html  css  js  c++  java
  • C++11新特性(1)

    1.long long 类型

       C++11新增了long long 和 unsigned long long 类型,为长整型和无符号长整型

       long long 类型的数据占用8个字节(64位),取值范围为 -9223372036854775808~9223372036854775807( -2^63 ~ 2^63-1 )

       unsigned long long 也占用8个字节,取值范围为0 ~ 18446744073709551615 ( 0 ~ 2^64 - 1 )

     在VS2015中,如果定义  long long  a = -9223372036854775808 会报错:

         错误 C4146 一元负运算符应用于无符号类型,结果仍为无符号类型

     因为在头文件 limit.h中定义了 INT_MAX,LONG_MAX,LLONG_MAX,long long  a = -9223372036854775808会认为对long long 型数据进行一个一元运算,而LLONG_MAX = 9223372036854775807,所以会溢出,可以直接定义 unsigned long long = LLONG_MIN。

      在使用常量时,可以在后面加上LL(或ll,不分大小写)用来表示该数是一个long long类型的数,例

    long long a = 100ll
    unsigned long long a= 10uLL
    

     在使用printf和scanf进行输入输出long long 型数据时,一般linux评测系统使用%lld (%llu),windows评测系统用%I64d (%I64u)

    2.类型别名

     定义类型别名由两种方法,一种是传统方法使用关键字typedef,tyedef 定义了一个类型别名,例

    typedef long long ll;
    ll a,*b;
    

     C++11增加了别名声明来定义类型的别名,using 类型别名 = 类型名。例:

    using ll = long long;
    ll a = 1;
    

    3.auto关键字  

     auto关键字在C++98和C语言中,被用作申请具有自动存储周期的变量,在声明该变量时被建立,退出当前程序块时释放,与局部变量相似。auto仅仅是一个占位符,它并不是一个真正的类型,

     在C++11中,auto关键字可以用来获取表达式的类型,而不需我们自己指定,识别类型的工作由编译器来做,因此auto变量必须有初始值。

    int a = 1, b = 1;
    auto c = a + b;
    

     输出c = 3

    说明:

    • 使用auto在一条语句中申请多个变量时,由于这些变量只能有一种类型,所以这些变量的类型必须保证一致。例:
    auto c =1 ,d=1.0; //报错,c为int型,d为double型
    int i = 0;
    const int ci = i;
    auto &n = i, *p2 = &ci; //报错,
    •  当auto的对象是一个引用是,则返回的类型是引用对象的类型,引用的语义被去除
    int a = 1;
    int  &b = a;
    auto c = b;
    a = 2;
    cout <<b<<" "<< c << endl;
    //结果输出2 1
    •  当auto的对象是const类型时,则const被忽略,变为变量。要想变为常量型,需要在前面加上const
    const int a = 5;
    auto b = a;
    b = 100;
    const auto c = a;
    • 函数或者模板参数不能被声明为auto
    int function(auto a){   //报错
        ****;    
    }
    
    • 若auto的对象是一个数组,则返回类型一个指针  
    int a[3] = {1, 2, 3};
    auto b = a;
    cout << typeid(b).name() << endl;
    //输出int *

     4.范围for语句

     范围for语句的语法形式为

    for  (declaration : expression)
            statement
    

     expresion表示的是一个序列,如数组、vector、string、花括号括起来的初始值列表等(有能够返回迭代器begin和end成员);declaration定义一个变量,expression中的每一个元素都能够变为该变量的类型(建议直接使用auto类型说明符)

     若想要改变expression中的值,则需要使用引用类型

    string s = "123";
    for (auto i : {1 ,2,3})
    	i = i * 2;
    for (auto &i : s)
    	i = i + 2;
    cout << s << endl;
    //输出3 4 5
    

    5.nullptr常量

     C++11中使用nullptr来表示空指针,nullptr是一种特殊的字面值,可以转换为任意的指针类型。

     除了使用nullptr,还可以使用其他方法在C++中生成空指针

    int *p1 = nullptr;
    int *p2 = 0;
    int *p3 = NULL;
    

     其中NULL是一个宏定义,,c中NULL为(void*)0,而c++中NULL为整数0,将指针值为0,即为空指针。void*不能转化为任意类型的指针

        还要注意,不能把int变量赋给指针,即使这个int变量值为0

    int zero =0;
    pi = zero;  //报错
    

      

      

  • 相关阅读:
    测试本地node包
    webpack4+react多页面架构
    身为前端开发工程师,你需要了解的搜索引擎优化SEO.
    代码改变世界 | 如何封装一个简单的 Koa
    云计算系统測试之技术概念
    Cocos2d-x3.0 从代码中获取cocostudio编辑的UI控件
    Spring使用HibernateDaoSupport操作数据
    gitlab一键安装 笔记
    【TCP/IP】IP路由选择
    ios网络学习------3 用非代理方法实现异步post请求
  • 原文地址:https://www.cnblogs.com/dlutjwh/p/10682744.html
Copyright © 2011-2022 走看看