一道題淺析 i++,++i,i+1及(引用)&i的區別

我們可能很清楚i++,++i和i+1級&i的概念,但在實際運用中我們就有可能很容易搞混淆.特別是在遞歸中區別它們就顯得尤爲重要了.那首先我們先看一段利用遞歸逆序字符串的代碼,你能回答出這段代碼的正確輸出嗎?
#include <iostream>

using namespace std;

void print(char *s);

void print(char *s){
        if(*s) {
                print(++s);
                cout<<*s<<endl;
        }
}

int main(int argc,char **argv)
{
        print(argv[1]);
        cout<<endl;
        return 0;
}

[disda@disdader bin]$ ./revStr abcd

d
c
b

  這段代碼時逆序輸出字符串,然而仔細觀察,我們發現字符a呢?爲什麼沒有輸出?那下面來仔細說說:1.*s爲a,執行print(b),print(b)被壓入堆棧倒數第一層.

2.*s爲b,執行print(c),print(c)被壓入堆棧倒數第二層.  3.*s爲c,執行print(d),print(d)被壓入堆棧倒數第三層.  4.*s爲d,執行print(\0),print(\0)被壓入堆棧倒數第四層.

5.開始跳出print,從上到下彈出堆棧中的內容.得到結果\0dcb.因次a並沒有入棧,所以自然不會輸出a;

  如果此時你想到的是把++i改成i++的話!

#include <iostream>

using namespace std;

void print(char *s);

void print(char *s){
        if(*s){
                print(s++);
                cout<<*s<<endl;
        }
}

int main(int argc,char **argv)
{
        print(argv[1]);
        cout<<endl;
        return 0;

}

  這是一個段錯誤,因爲在當*s爲d時壓入print(d)後s++會指向字符串的空間之外,自然會引起段錯誤.

  想想如果我們將i++改成i+1能得到正確的結果嗎?

#include <iostream>

using namespace std;

void print(char *s);

void print(char *s){
        if(*s) {
                print(s+1);
                cout<<*s<<endl;
        }
}

int main(int argc,char **argv)
{
        print(argv[1]);
        cout<<endl;
        return 0;

}

[disda@disdader bin]$ ./revStr abcd
d
c
b
a

  這次我們得到終於正確的逆序字符串了!但這時我們就有可能有點混亂了.那先解釋一下i+1的意義.i+1沒有傳遞這個過程!加過去就結束了,後面i原來是多少還是多少!這點在遞歸中的時候特別值得注意!而我們如果利用指針的引用也可以解決這道題.

#include<iostream>                        
using namespace std;

void print(char* &s)
{
    if(*s){
    
        p(++s);     //if條件成立,即進行遞歸 注意不能進行s++會溢出
        cout<<*s;      //按反序輸出字符串中的各個字符
    }
    s--; 
}
int  main(int argv,char **argc)
{
    char *str = "iloveyou";
    print(str);
    cout<<endl;
    return 0;
}

 

 

 

  

 

發佈了28 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章