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

void F(int a,int b,int c){
cout<<a<<b<<c;
}
int main()
{
int a=;
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=,b=;
//输出4
cout<<(a++,b++,a+b,++a,b++);
//输出5
cout<<(a++,b++,a+b,++a,++b);

C++函数传值问题的更多相关文章

  1. jquery的ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...

  2. [java学习笔记]java语言基础概述之函数的定义和使用&函数传值问题

    1.函数 1.什么是函数? 定义在类中的具有特定功能的一段独立小程序. 函数也叫做方法 2.函数的格式 修饰符   返回值类型    函数名(参数类型  形式参数1, 参数类型  形式参数2-) { ...

  3. js 基础 函数传值

    让我忽略的函数传值问题 function box(num){ num += 10;  // num(有色的num) 实际就是arguments[0] ,如果参数没有num,则函数体的num(有色的nu ...

  4. ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 复制代码 代码如下: $.ajax({ dataType : ‘json',type : ‘POST',url : ‘ht ...

  5. C++函数传值调用

    C++的函数的参数调用是传值方式. 想要改变传值调用,有引用和指针两种方式.其中,引用的实现机理也是通过一个指针,但是具体和指针传值的方式又不一样.具体见:C++中的指针与引用 对于指针传值,其实实际 ...

  6. c++ primer 函数传值1

    不看c++ primer  永远不知道自己基础有多差 函数的參数传值一般有两种方式:值传递,引用传递. 值传递有以下两种形式: void func( int a ) { // } void func1 ...

  7. c#基础 函数传值

    随便新建个控制台程序做个演示! 1.最基础,最普通的传值方式: static void Main(string[] args) { ); Console.WriteLine("x:" ...

  8. go slice与函数传值的理解

    go语言中所有的传值方式都是传值操作. 今天遇到了以下代码: func main(){ slice := make([],) fmt.Println(slice) change(s) fmt.Prin ...

  9. 关于swap函数传值的问题

    #include <stdio.h> void swap(int * p3,int * p4); int main() {  int a = 9;  int b = 8;  int * p ...

随机推荐

  1. 【javascript】[].slice.call(arguments)的作用

    var thisExtends = function () { var args = [].slice.call(arguments).filter(function (item) { return ...

  2. Python 等分切分数据及规则命名

    将一份一亿多条数据的csv文件等分为10份,代码如下所示: import pandas as pd data = pd.read_csv('C:\\Users\\PycharmProjects\\Sp ...

  3. 使用IDEA创建JavaWeb项目 部署本地tomcat并运行

    一.下载商业版IDEA 官方链接:https://www.jetbrains.com/idea/download/#section=windows 二.新建JavaWeb项目 1.在菜单栏找到File ...

  4. MySQL用户

    创建用户 在对 MySQL 的日常管理和实际操作中,为了避免用户恶意冒名使用 root 账号控制数据库,通常需要创建一系列具备适当权限的账号,应该尽可能地不用或少用 root 账号登录系统,以此来确保 ...

  5. HDU 6039 - Gear Up | 2017 Multi-University Training Contest 1

    建模简析: /* HDU 6039 - Gear Up [ 建模,线段树,图论 ] | 2017 Multi-University Training Contest 1 题意: 给你n个齿轮,有些齿轮 ...

  6. 卸载python

    # rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps # whereis python|xargs rm -frv

  7. logback导入依赖 NoSuchMethodException

    1.我遇到的问题是Spring版本和logback低版本冲突的问题 如何解决:把logback.classic和logback.core等依赖换成1.2.2以上版本的依赖

  8. Logitech G系鼠标脚本编程,实现鼠标自动定位控制

    利用罗技官方提供的API来写一个鼠标自动定位移动脚本 点击脚本编辑器中的帮助选项,查看罗技官方提供的API说明,有很多实现好的鼠标功能 G-series Lua API V8.45 Overview ...

  9. luoguP1996 约瑟夫问题

    P1996 约瑟夫问题 2.5K通过 4.7K提交 题目提供者 Timothy 标签 洛谷原创 云端 难度 普及- 时空限制 1s / 128MB 题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个 ...

  10. Centos 7自定义屏幕分辨率

    $ xrandrScreen 0: minimum 1 x 1, current 1680 x 900, maximum 8192 x 8192Virtual1 connected primary 1 ...