zoukankan      html  css  js  c++  java
  • C++函数传值问题

    在做题出现个神奇的事情,C++的传值跟其他OOP语言不一样。首先做个测试,看看下面输出结果是什么?

    void F(int a,int b,int c){
        cout<<a<<b<<c;
    }
    int main()
    {
        int a=1;
        F(++a,a++,++a);
    }

    我猜大部分觉得应该是2,2,4。C#确实是这个结果。但C++结果并不是这样。查了资料和询问朋友回答的都很复杂,也不说清楚里面的具体机制。只知道C++函数传值可能根据栈来。

    从左边开始入栈,右边出栈,与C#相反。有不同意见大神欢迎指导

    个人认为如果函数从右边的值开始输出,如a++,则先输出a的值,此时a的值在输出后变成2了,如果是++a,则变成2再输出。但如果同时输出a++,++a,++a就是把a压在栈底,即所有

    ++a的值都是在最后输出且相同,例子如下:

        //方便都设a为1
        /*输出结果 424 
          过程为最右边 因为有++符号在前 a压到栈底 且此时值变成2
          到中间因为++符号在后 输出此时的a为2 之后a值3 
          最后最左边有++符号在前 因此把a入栈 此时a变成4 
          最后遍历结束把俩个a退栈输出*/
        F(++a,a++,++a);
        //下面例子可证明上述
        //输出结果 321
        F(a++,a++,a++);
        //输出结果 344
        F(a++,++a,++a);
        //输出结果 444
        F(++a,++a,++a);
        //输出结果 222
        F(a,a,++a);
        //输出结果 421
        F(++a,a++,a++);

    那么如果是多个数的情况呢?分开看即可,a看a,b看b顺序还是如上,但是碰见了a+b情况,此时就是他们当前值的输出,如下:


    //设 a=1 b=3
    //
    输出结果 1 3 4 F(a++,b++,a+b); //输出结果 6 1 3 F(a+b,a++,b++); //输出结果 8 3 5 1 3 F(a+b,++a,++b,a++,b++); //输出结果 2 4 6 3 5 F(a++,b++,a+b,++a,++b);

    补充一个如果是cout<<输出则根据逗号表达式输出最后一个即可,如下:

        int a=1,b=3;
        //输出4
        cout<<(a++,b++,a+b,++a,b++);
        //输出5    
        cout<<(a++,b++,a+b,++a,++b);
  • 相关阅读:
    hdu 5007 水题 (2014西安网赛A题)
    hdu 1698 线段树(成段替换 区间求和)
    poj 3468 线段树 成段增减 区间求和
    hdu 2795 公告板 (单点最值)
    UVaLive 6833 Miscalculation (表达式计算)
    UVaLive 6832 Bit String Reordering (模拟)
    CodeForces 124C Prime Permutation (数论+贪心)
    SPOJ BALNUM (数位DP)
    CodeForces 628D Magic Numbers (数位DP)
    POJ 3252 Round Numbers (数位DP)
  • 原文地址:https://www.cnblogs.com/dlvguo/p/11902274.html
Copyright © 2011-2022 走看看