美文网首页C++2.0
C++11——表达式

C++11——表达式

作者: 铭小汁儿 | 来源:发表于2019-04-21 16:25 被阅读7次

    除法舍入规则

    对于模数运算符,如果m和n是整数且n非零,则(m / n) * n + m % n等于m。这也暗示着如果m % n非零,则它具有与m相同的符号。早期版本的语言允许m % n-(m / n)从零四舍五入的实现中具有与n相同的符号,但现在此类实现已经被禁止。此外,除了-m溢出的情况(- m) / nm / (-n)总是等于-(m / n)m % (-n)等于m % n,并且(-m) % n等于-(m % n)。更具体地:

    Code:
        21 % 6;    /*  result is 3  */      21 / 6;    /*  result is 3  */
        21 % 7;    /*  result is 0  */      21 / 7;    /*  result is 3  */
       -21 % -8;   /*  result is -5 */     -21 / -8;   /*  result is 2  */
        21 % -5;   /*  result is 1  */      21 / -5;   /*  result is -4  */
    

    使用初始化列表进行赋值

    新标准下,我们可以在赋值语句的等号右端使用已经写好的初始化器列表进行赋值:

    Code:
        k = {3.14};                   // error: narrowing conversion
        vector<int> vi;               // initially empty
        vi = {0,1,2,3,4,5,6,7,8,9};   // vi now has ten elements, values 0 through 9
    

    如果赋值语句的等号左侧操作数是内置类型,则初始化器列表最多可包含一个值,而且该值不得进行缩小转换。
    对于类类型,这样的赋值方式会发生什么取决于类定义时的详细信息。以vector为例,vector模板重载了赋值运算符,定义了自己的赋值运算符版本,该版本中允许以初始化器列表进行赋值运算。该运算符将等号左侧的元素替换为右侧列表中的元素。
    无论等号左侧操作数的类型如何,初始化器列表都可以为空。在这种情况下,编译器生成一个临时值,并将该值赋给左侧操作数。

    对类成员使用sizeof

    sizeof运算符返回表达式或类型名称的大小(以字节为单位)。运算符是右向关联的。sizeof的结果是size_t类型的常量表达式。
    在新标准下,我们可以使用范围运算符来获得类类型成员的大小。 通常我们只能通过一个类类型的对象来访问类的成员。 使用sizeof时我们不需要提供一个类的对象,因为sizeof不需要获取类的成员就可以知道其大小。
    应用sizeof的结果一定程度上取决于所涉及的类型:

    1. sizeof char或对一个char类型的表达式应用sizeof结果为1。
    2. 对一个引用类型使用sizeof返回引用类型的对象的大小。
    3. 对一个指针使用sizeof返回持有该指针所需要的空间大小。
    4. 对一个解指针对象(例:(*p))使用sizeof返回该指针指向的类型的对象的大小;该指针不必有效。
    5. 对一个数组使用sizeof将返回整个数组的大小。它等价于将元素类型的大小乘以数组中元素的数量。请注意,sizeof操作不会将数组转换为指针。
    6. stringvector使用sizeof只返回这些类型对象的固定部分的大小(fixed size);它不返回对象元素使用的大小。
    Code:
        Sales_data data, *p;  // Sales_data is a class
        sizeof(Sales_data);   // size required to hold an object of type Sales_data
        sizeof data;   // size of data's type, i.e., sizeof(Sales_data)
        sizeof p;      // size of a pointer
        sizeof *p;     // size of the type to which p points, i.e., sizeof(Sales_data)
        sizeof data.revenue;  // size of the type of Sales_data's revenue member
        sizeof Sales_data::revenue; // alternative way to get the size of revenue
    

    因为sizeof返回整个数组的大小,所以我们可以通过将数组大小除以元素类型大小来确定数组中元素的数量:

    Code:
        // sizeof(ia)/sizeof(*ia) returns the number of elements in ia
        constexpr size_t sz = sizeof(ia)/sizeof(*ia);
        int arr2[sz];    // ok sizeof returns a constant expression
    

    因为sizeof返回的结果是一个常量表达式,所以我们可以使用sizeof表达式的结果来指定数组的维度。

    参考文献

    [1] Lippman S B , Josée Lajoie, Moo B E . C++ Primer (5th Edition)[J]. 2013.

    相关文章

      网友评论

        本文标题:C++11——表达式

        本文链接:https://www.haomeiwen.com/subject/bacjgqtx.html