`
zhang19581987
  • 浏览: 60235 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++学习笔记——7

    博客分类:
  • C++
阅读更多
对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整型操作数。

移位操作的右操作数不可以是负数,而且必须是严格小于左操作数位数的值。否则,操作的效果未定义。

位异或(互斥或,exclusive or)操作符(^)也需要两个整型操作数。在每个位的位置,如果两个操作数对应的位只有一个(不是两个)为 1,则操作结果中该位为 1,否则为 0。

重载的操作符与该操作符的内置类型版本有相同的优先级和结合性,如移动操作符<< >>.
移位操作符具有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高。若 IO 表达式的操作数包含了比IO操作符优先级低的操作符,相关的优先级别将影响书写该表达式的方式。通常需使用圆括号强制先实现右结合:

     cout << 42 + 10;   // ok, + has higher precedence, so the sum is printed
     cout << (10 < 42); // ok: parentheses force intended grouping; prints 1
     cout << 10 < 42;   // error: attempt to compare cout to 42!

The second cout is interpreted as

第二个cout语句解释为:

     (cout << 10) < 42;

该表达式说“将 10 写到 cout,然后用此操作(也就是 cout)的结果与 42 做比较”。

与其他二元操作符不同,赋值操作具有右结合特性。当表达式含有多个赋值操作符时,从右向左结合。上述表达式,将右边赋值操作的结果(也就是 jval)赋给 ival。多个赋值操作中,各对象必须具有相同的数据类型,或者具有可转换(第 5.12 节)为同一类型的数据类型:

     int ival; int *pval;
     ival = pval = 0; // error: cannot assign the value of a pointer to an int
     string s1, s2;
     s1 = s2 = "OK";  // ok: "OK" converted to string

赋值操作具有你优先级,
例如: while((i = get_value()) != 42)  i = get_value() 需要用括号。加为赋值操作符的优先级低于不等操作符。

利用前置操作是个好惯,前置操作的性能要好点,它不用存储计算能前的值。
同时后自增操作的优先级高于解引用操作,加此*iter++ 等效于 *(iter++),子表达式 iter++ 使iter加1, 然后返回iter百年偕老的副本作为该表达式的结果。解引用操作×的操作娄是iter未加1前的副本。

解引用操作符低于点操作符,
Sales_item *sp = &item1;
(*sp).same_isbn(item2);
等价于 sp->same_isbn(item2);

条件操作符的优先级相当低 条件操作符是: cond ? expr1 : expr2;
条件操作符的优先级相当低。当我们要在一个更大的表达式中嵌入条件表达式时,通常必须用圆括号把条件表达式括起来。例如,经常使用条件操作符根据一定的条件输出一个或另一个值,在输出表达式中,如果不严格使用圆括号将条件操作符括起来,将会得到意外的结果:

     cout << (i < j ? i : j);  // ok: prints larger of i and j
     cout << (i < j) ? i : j;  // prints 1 or 0!
     cout << i < j ? i : j;    // error: compares cout to int

第二个表达式比较有趣:它将i和j的比较结果视为 << 操作符的操作数,输出 1 或 0。 << 操作符返回 cout 值,然后将返回结果作为条件操作符的判断条件。也就是,第二个表达式等效于:

     cout << (i < j); // prints 1 or 0
     cout ? i : j;    // test cout and then evaluate i or j
                      // depending on whether cout evaluates to true or false

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics