大二寒假读书笔记150204

来源:互联网 发布:如何注册新网域名 编辑:程序博客网 时间:2024/04/26 17:09

1、关系操作符和逻辑操作符使用算术或指针类型的操作数,并返回bool类型的值。

逻辑与和逻辑或操作符总是先计算其左操作数,只有当仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数。我们称这种求解策咯为“短路求值”。

2、位操作符

位操作符操纵的整数的类型可以是有符号的也可以是无符号的。如果操作数为负数,则操作数如何处理其操作数的符号位依赖于机器。因此对于位操作符,强烈建议使用unsigned整型操作数。

~    位求反<<   左移>>   右移&    位与^    位异或|    位或 
常犯的错误是把位与操作(&)和逻辑与操作(&&)混淆。同样地,位或操作(|)和逻辑或操作(||)也很容易混淆。注意看代码:

unsigned char b1 = 0145;//01100101unsigned char b2 = 0257;//10101111unsigned char result = b1 & b2;//00100101
3、下面是应用

bitset类比整型值上的低级位操作更容易使用。

假设某老师带了一个班,班上有30个学生,每个星期在班上做一次测验,只有及格和不及格两种测验成绩,对每个学生用一个二进制位来记录一次测试及格与否,以方便我们跟踪每次测验的结果,这样就可以用一个bitset对象或整数值来代表一次测验:

bieset<30> bitset_quiz1;unsigned long int_quiz1 = 0;

使用bitset类型时,可根据所需要的大小明确地定义bitset_quiz1,它的每一个位都默认为0.如果使用内置类型来存放测试成绩,则应将变量int_quiz1定义为unsigned long类型,这种数据类型在所有机器上都至少拥有32位长度。最后显式地初始化int_quiz1以保证该变量在使用前具有明确定义的值。

老师可以设置和检查每个位。例如,假设第27位所表示的的学生及格了,可以用下面的语句设置对应的位:

bitset_quiz1.set(27);int_quiz1 |= 1UL<<27;
如果老师重新复核成绩,发现第27个同学实际上在该次测验中不及格,则可以将27位重新设置为0。

bitset_quiz1.reset(27);int_quiz1 &= ~(1UL<<27);
最后,可以通过以下代码获知第27个学生是否及格:

bool status;status = bitset_quiz1[27];status = int_quiz1 & (1UL<<27);

4、将移位操作符用于IO

IO操作符为左结合,

cout<<"hi"<<"there"<<endl;//执行为((cout<<"hi")<<"there")<<endl;
移位操作符具有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高。若IO表达式的操作数包含了比IO操作符优先级低的操作符,相关的优先级别将影响书写该表达式的方式。通常使用圆括号强制先实现右结合:

cout<<42 + 10;//okcout<<(10 <42);//okcout<<10<42;//error
第二个cout语句解释为:(cout<<10)<42;表达式说“将10写到cout,然后用此操作(也就是cout)的结果与42比较”。

5、赋值操作符的左操作数必须是非const的左值。下面语句是不合法的:

int i , j , ival ;const int ci = i;//ok1024 = ival;//errori + j = ival;//errorci = ival;//error 

赋值操作具有右结合性,当表达式含有多个赋值操作符时,从右向左结合。多个赋值操作中,各对象必须具有相同的数据类型,或者可转换为同一类型的数据结构:

int ival;int *pval;ival = pval = 0;//errorstring s1 , s2;s1 = s2 = "hello";//ok
虽然0值恰好都可以赋值给ival和pval这两个不同类型的对象,但这仍然是错误的。问题在于,给pval赋值的结果是一个int*类型,再将其赋值给int型的变量就会出错。

6、箭头操作符

C++语言为包含点操作符和解引用操作符的表达式提供了一个同义词:箭头操作符(->).

点操作符用于话哦去类类型对象的成员:

items.sam_isbn(item2);
如果有一个指向Sales_item对象的指针(或者迭代器),则在是医用点操作符前,需对该指针或迭代器进行解引用:

Sales_item *sp = &item1;(*sp).same_isbn(item2);
如果漏掉了(),那么这段代码含义完全不同:

*sp.same_isbn(item2);
这个表达式企图获得sp对象的same_isbn成员,等价于:

*(sp.same_isbn(item2));
然而sp是一个没有成员的指针,这条语句无法通过编译

因为编程时经常使用这种语句,而又容易忘记(),所以用->来替代点操作符后面使用解引用操作符。

(*p).foo;//等价于p->foo;





















0 0
原创粉丝点击