在做题出现个神奇的事情,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. 查看TensorFlow的版本以及安装路径

    查看TensorFlow的版本以及安装路径 进入到Python环境 import tensorflow as tf tf.__version__ # 查看版本 tf.__path__ # 查看安装路径 ...

  2. IE8"HTML Parsing Error:Unable to modify the parent container element before the child element is closed"错误

    一.IE8报下面错误,解决办法:网页错误详细信息消息: HTML Parsing Error: Unable to modify the parent container element before ...

  3. bind(named)配置文件

    BIND是DNS协议的一种实现.BIND包含了一个DNS Server(服务名叫named),用来解析主机名到ip地址:一个解析库:一些辅助工具,还有一个安全目录工具,分别属于下面几个包: 下面是原配 ...

  4. java 面试题摘要

    5.1 什么是线程 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位, 可以使用多线程对运算提速. 5.2 线程和进程有什么区别 (1)进程是资源的分配和调度的一个独 ...

  5. 经常使用的js三元表达式

    语法:条件?表达式1:表达式2 .  条件的括号可要可不要的 let istrue = true; let a = (istrue === true) ? '我是true啊' : "我是fa ...

  6. Ion-select and ion-option list styling 自定义样式

    https://forum.ionicframework.com/t/ion-select-and-ion-option-list-styling/117028

  7. docker 卸载与安装

    卸载 Docker自17.03版本开始分为两个版本Docker CE和Docker EE: Docker CE:Docker Community Edition,即Docker社区版 Docker E ...

  8. Spring——JdbcTemplate

    一.JdbcTemplate介绍: 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架,Spring Boot Spring Data ...

  9. [CSP-S模拟测试]:序列(二分答案+树状数组)

    题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...

  10. 12.数值的整数次方 Java

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 这道题看似简单,其实BUG重重.要注意的问题: 1 关于次幂的问题特殊的情况, ...