在做题出现个神奇的事情,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. pip命令及虚拟环境的建立

    以下命令是pip命令,是帮助我们安装解决python所需要的环境包 列出已经安装的包 pip list 安装要安装的包 pip install 包名 安装特定版本 pip install django ...

  2. linux下进程间通信的机制

    今天突然想起了nginx解决惊群的方法,就是在多个进程间利用锁来保证同一时刻只能有一个worker进程在自己的epoll中加入监听的句柄,那么进程间是怎么共享变量的呢,下面就介绍一下共享内存 共享内存 ...

  3. Linux之vi文本编辑器

    vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode).输入模式(Insert mode)和末行模式(last line mode),各模式的功能区分如下: 1) 命令 ...

  4. mybatic进阶遗留

    参考文章: MyBatis的架构设计以及实例分析 MyBatis缓存机制的设计与实现 MyBatis的一级缓存实现详解 及使用注意事项 MyBatis的二级缓存的设计原理

  5. (六) Java数据库

    一.概述 程序开发没有数据库的参与,可以说几乎是不可能的.数据库和Java都已经有了简单的了解,现在的关键是对两者进行连接,起到这一作用的正是JDBC——Java Database Connectiv ...

  6. 15-资源等待类型sys.dm_os_wait_stats

    一.总结 1.网址 https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/ ...

  7. 寻找hive视图

    如何hive视图 1.mysql数据库 [centos@s201 ~]$ mysql -uroot -proot mysql> show databases; +---------------- ...

  8. python继承之super

    super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复调用( ...

  9. 简单的c程序分析

    1.裸函数 c语言的普通函数中即使什么都不写,编译器在编译时也会给它加上一些汇编代码:比如开栈.返回等: 裸函数就是编译器什么都不管,一切都需要自己来处理: 裸函数的优点是自由度高,可以应用在钩子程序 ...

  10. jquery unbind()方法 语法

    jquery unbind()方法 语法 作用:unbind() 方法移除被选元素的事件处理程序.该方法能够移除所有的或被选的事件处理程序,或者当事件发生时终止指定函数的运行.ubind() 适用于任 ...