除法舍入规则
对于模数运算符,如果m和n是整数且n非零,则(m / n) * n + m % n
等于m。这也暗示着如果m % n
非零,则它具有与m相同的符号。早期版本的语言允许m % n
在-(m / n)
从零四舍五入的实现中具有与n相同的符号,但现在此类实现已经被禁止。此外,除了-m
溢出的情况(- m) / n
和m / (-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
的结果一定程度上取决于所涉及的类型:
-
sizeof char
或对一个char
类型的表达式应用sizeof
结果为1。 - 对一个引用类型使用
sizeof
返回引用类型的对象的大小。 - 对一个指针使用
sizeof
返回持有该指针所需要的空间大小。 - 对一个解指针对象(例:
(*p)
)使用sizeof
返回该指针指向的类型的对象的大小;该指针不必有效。 - 对一个数组使用
sizeof
将返回整个数组的大小。它等价于将元素类型的大小乘以数组中元素的数量。请注意,sizeof
操作不会将数组转换为指针。 - 对
string
或vector
使用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.
网友评论