zoukankan      html  css  js  c++  java
  • c++中自增(++)和自减(--)操作符

    自增(++)和自减(--)操作符为对象加1 或减1 操作提供了方便简短的实现方式。它们有前置和后置两种使用形式。到目前为止,我们已经使用过前自增操作,该操作使其操作数加1,操作结果是修改后的值。同理,前自减操作使其操作数减 1。这两种操作符的后置形式同样对其操作数加 1(或减 1),但操作后产生操作数原来的、未修改的值作为表达式的结果:

    1 int i = 0, j;
    2 j = ++i; // j = 1, i = 1: prefix yields incremented value
    3 j = i++; // j = 1, i = 2: postfix yields unincremented value

    因为前置操作返回加1 后的值,所以返回对象本身,这是左值后置操作返回的则是右值

    建议:只有在必要时才使用后置操作符
    有使用 C 语言背景的读者可能会觉得奇怪,为什么要在程序中使用前自增操作。道理很简单:因为前置操作需要做的工作更少,只需加 1 后返回加 1 后的结果即可。而后置操作符则必须先保存操作数原来的值,以便返回未加 1 之前的值作为操作的结果。对于 int 型对象和指针,编译器可优化掉这项额外工作。但是对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。因此,养成使用前置操作这个好习惯,就不必操心性能差异的问题。

    后置操作符返回未加 1 的值
    当我们希望在单个复合表达式中使用变量的当前值,然后再加1 时,通常会使用后置的 ++ 和 -- 操作:

    1 vector<int> ivec; // empty vector
    2 int cnt = 10;
    3 // add elements 10...1 to ivec
    4 while (cnt > 0)
    5 ivec.push_back(cnt--); // int postfix decrement

    这段程序使用了后置的 -- 操作实现 cnt 减 1。我们希望把 cnt 的值赋给vector 对象的下一个元素,然后在下次迭代前 cnt 的值减 1。如果在循环中使用前置操作,则是用 cnt 减 1 后的值创建 ivec 的新元素,结果是将 9 至 0十个元素依次添加到 ivec 中。

    在单个表达式中组合使用解引用和自增操作
    下面的程序使用了一种非常通用的 C++ 编程模式输出 ivec 的内容:

    1 vector<int>::iterator iter = ivec.begin();
    2 // prints 10 9 8 ... 1
    3 while (iter != ivec.end())
    4 cout << *iter++ << endl; // iterator postfix increment

    如果程序员对 C++ 和 C 语言都不太熟悉,则常常会弄不清楚表达式 *iter++ 的含义。

    由于后自增操作的优先级高于解引用操作,因此 *iter++ 等效于*(iter++)。子表达式 iter++ 使 iter 加 1,然后返回 iter 原值的副本作为该表达式的结果。因此,解引用操作 * 的操作数是 iter 未加 1 前的副本。

    这种用法的根据在于后自增操作返回其操作数原值(没有加 1)的副本。如果返回的是加 1 后的值,则解引用该值将导致错误的结果:ivec 的第一个元素没有输出,并企图对一个多余的元素进行解引用。

    建议:简洁即是美
    没有 C 语言基础的 C++ 新手,时常会因精简的表达式而苦恼,特别是像 *iter++ 这类令人困惑的表达式。有经验的 C++程序员非常重视简练,他们更喜欢这么写:

    1 cout << *iter++ << endl;

    而不采用下面这种冗长的等效代码:

    1 cout << *iter << endl;
    2 ++iter;

    对于初学 C++ 的程序员来说,第二种形式更清晰,因为给迭代器加 1 和获取输出值这两个操作是分开来实现的。但是更多的 C++ 程序员更习惯使用第一种形式。

    要不断地研究类似的代码,最后达到一目了然的地步。大部分的 C++ 程序员更喜欢使用简洁的表达式而非冗长的等效表达式。因此,C++ 程序员必须熟悉这种用法。而且,一旦熟悉了这类表达式,我们会发现使用起来更不容易出错。

  • 相关阅读:
    生成指定规模大小的redis cluster对关系
    根据ip列表模拟输出redis cluster的主从对应关系
    获取redis实例绑定cpu的情况
    通过shell模拟redis-trib.rb info的输出
    又一种获取redis cluster slots分布的小脚本
    第3种方法获取redis cluster主从关系
    Lamada
    Linq笔记
    推荐博文
    SQL server 自带存储过程 sp_rename
  • 原文地址:https://www.cnblogs.com/wangduo/p/5866126.html
Copyright © 2011-2022 走看看