1. 程式人生 > >[C++] 指標和自增自減操作符簡潔的寫法

[C++] 指標和自增自減操作符簡潔的寫法

陣列複製:

// arr1 is an array of ints
int *source = arr1;
size_t sz = sizeof(arr1)/sizeof(*arr1); // number of elements
int *dest = new int[sz];                // uninitialized elements
while (source != arr1 + sz)
    *dest++ = *source++; //  copy element and increment pointers 

*dest++ = *source++ 等價於:

{
    *dest = *source; // copy element
    ++dest;  // increment the pointers
    ++source;
}

第2個例子:

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

同理  cout << *iter++ << endl; 等價於:

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

而  *++iter 則為 iter  先自增,然後將 iter 修改後的值用作 *

操作符的運算元。

簡潔為美,code裡要使用簡潔表示式, 避免使用冗餘表示式。

此外關於陣列和指標的sizeof操作:

int arr[10];
int *p = arr;
cout << sizeof(arr) << endl; // 輸出40
cout << sizeof(p) << endl; // 輸出4

陣列是陣列,指標是指標,但是在絕大多數情況下,陣列名會被轉換為(衰變為)指標。上例中,arr是陣列,p是指標,sizeof輸出不同。因為sizeof返回整個陣列的大小,可以用下面的方法得到元素的個數,假定ia為陣列:

// sizeof(ia)/sizeof(*ia) returns the number of elements in ia
int sz = sizeof(ia)/sizeof(*ia);

下面的程式,本意是想執行*x = *x + 1, 但實際不按設想輸出:

#include <iostream>
#include <string>
using namespace std;

void doSomething(int *x, int *y)
{
    *x = *x++;
    *y = *y + 5;
}

int main()
{
    int x = 4;
    int y = 3;
    doSomething(&x, &y);
    cout << "x is now: " << x << endl; //outputs 4
    cout << "y is now: " << y << endl; //outputs 8
    return 0;
}

以下寫法:

*x = *x+1;

等價於:

*x = ++*x;

等價於:

++*x;
所以,*x = *x++ 必須改為 *x = ++*x ++*x, 同理 --*x 也是類似的意思。

C++ Primer 5.5