zoukankan      html  css  js  c++  java
  • 一道题浅析 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(),print()被压入堆栈倒数第四层.

    5.开始跳出print,从上到下弹出堆栈中的内容.得到结果dcb.因次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;
    }

      

     

  • 相关阅读:
    POJ
    POJ
    HDU——1027Ignatius and the Princess II(next_permutation函数)
    HDU——1106排序(istringstream的使用、STLvector练习)
    HDU——2054A==B?
    HDU——2087剪花布条
    HDU——2064汉诺塔III
    HDU——2068RPG的错排(错排公式)
    HDU——1789Doing Homework again(贪心)
    HDU——2067小兔的棋盘(卡特兰数&递推DP)
  • 原文地址:https://www.cnblogs.com/wannable/p/5991591.html
Copyright © 2011-2022 走看看