《C++ primer》英文第五版阅读笔记(十九)——位运算符,sizeof运算符和逗号运算符

来源:互联网 发布:免费聊天相亲软件 编辑:程序博客网 时间:2024/04/29 14:32

The Bitwise Operators位运算符

1.位运算符的操作数是可以是整型的,并且位操作符吧它当做许多“位”的集合。

2.位操作符的操作数也可以是名为bitset的库类型,这个类型代表了一个灵活可变的位的集合。

3.通常如果操作数是“小整型”,它的值将会被提升。

4.操作数可以是有符号的,也可以是无符号的。如果操作数是有符号的并且它的值是负的,那么在位操作中的”符号位“处理是机器独立的。此外,对于有符号数进行左移操作时改变了符号位的值,其结果是未知的。

5.因为关于符号位如何处理并没有确切的保证,所以强烈建议在进行位操作时使用无符号类型。

6.在IO库里面>>和<<表示进行输入和输出操作,而它们的内置类型含义是表示对它们的操作数进行移位操作(右移和左移)。它们返回的结果是进行移位后的左操作数的复制。右操作数必须是非负的并且比结果中值的位数小。否则,操作将变成未知的。被移出的位就会被抛弃掉。

7.左移<<运算符会在右面补0。

右移>>运算符具体补什么值取决于它的左操作数。如果左操作数是无符号的,那个就在左边补0;如果左操作数是有符号的,则依据具体实现而定,或者在左边补符号位,或者补0。

8.按位取反运算符~。将1变成0,0变成1。当类型被提升时,值不变,可能会进行补0操作,进行按位取反时补的位也要进行取反操作。

9.按位与&,或|,异或^操作符。两个操作数进行按位匹配操作。异或:相异为1,相同为0。

10.一个重载操作符与它的内置类型版本有着相同的优先级和结合性。

11.移位运算符是左结合的。移位运算符的优先级处于中间位置,比算术运算符低,但是比关系、条件、赋值运算符高。


sizeof运算符

1.sizeof运算符可以按字节返回一个表达式或者类型名的大小。其结果是一个常量表达式,类型为size_t。

2.它有两种形式:

    sizeof (type)

    sizeof expr

    在第二种形式里,sizeof返回给定表达式返回类型的大小。

3.sizeof运算符并不计算它的操作数。

4.当sizeof *p;时,

(1)由于sizeof是右结合的并且和*的优先级相同,因此这个表达式从右往左看。

(2)由于sizeof并不计算操作数,所以p是否有效是无关紧要的(可以未进行初始化)。当把一个无效指针的解引用作为sizeof的操作数是安全的,因为这个指针并没有实际地使用。sizeof不需要解引用这个指针去知道它将返回什么类型。

5.在新标准下,我们可以使用范围运算符::去求一个类类型成员的大小。通常我们类类型的一个对象来访问那个类的成员。但是在sizeof里面我们并不需要一个对象,因为sizeof不需要通过取得成员就能知道它的大小。

6.sizeof返回的结果取决于具体涉及到的类型:
(1)sizeof char或者char类型的表达式,结果是1。
(2)sizeof 一个引用类型返回引用类型对象的大小。
(3)sizeof 一个指针返回能保存这个指针的大小。
(4)sizeof 一个解引用指针返回这个指针所指类型的对象的大小。指针可能不是有效的。

(5)sizeof 一个数组返回整个数组的大小。它和让数组元素类型的大小乘上数组中元素个数是等价的。sizeof并不能把数组转换成指针。

7.由于sizeof返回整个数组的大小,因此我们可以通过让sizeof数组的结果除以sizeof数组元素的结果来得到数组中的元素的个数。

8.因为sizeof返回的是一个常数表达式,我们可以使用sizeof的结果去定义数组的维数。


Comma Operator——逗号运算符
1.逗号运算符有两个操作数,它从左往右算。和逻辑与、逻辑或、条件运算符一样,逗号运算符保证了它的操作数被计算的顺序。
2.左边表达式被计算,但是它的值会被抛弃。逗号表达式的结果是它的右边的表达式的值。如果右操作数的值是左值的话逗号表达式的返回值也是左值。
3.一个使用逗号表达式的例子就是在for循环中。






0 0
原创粉丝点击