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);
  • 相关阅读:
    Pycharm简单使用教程
    【Jenkins学习】【第二节】 jenkins构建触发器定时任务
    Docker之从零开始制作docker镜像
    手机APP自动化环境搭建
    格式字符详解
    Bash Shell之内建命令和保留字
    asp.net 实现后台异步处理的方式
    Spring3.2.0 之后各个版本完整包下载地址
    Oracle的rollup、cube、grouping sets函数
    C# 委托类型及使用
  • 原文地址:https://www.cnblogs.com/dlvguo/p/11902274.html
Copyright © 2011-2022 走看看