C++函数传值问题
在做题出现个神奇的事情,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++函数传值问题的更多相关文章
- jquery的ajax()函数传值中文乱码解决方法介绍
jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...
- [java学习笔记]java语言基础概述之函数的定义和使用&函数传值问题
1.函数 1.什么是函数? 定义在类中的具有特定功能的一段独立小程序. 函数也叫做方法 2.函数的格式 修饰符 返回值类型 函数名(参数类型 形式参数1, 参数类型 形式参数2-) { ...
- js 基础 函数传值
让我忽略的函数传值问题 function box(num){ num += 10; // num(有色的num) 实际就是arguments[0] ,如果参数没有num,则函数体的num(有色的nu ...
- ajax()函数传值中文乱码解决方法介绍
jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 复制代码 代码如下: $.ajax({ dataType : ‘json',type : ‘POST',url : ‘ht ...
- C++函数传值调用
C++的函数的参数调用是传值方式. 想要改变传值调用,有引用和指针两种方式.其中,引用的实现机理也是通过一个指针,但是具体和指针传值的方式又不一样.具体见:C++中的指针与引用 对于指针传值,其实实际 ...
- c++ primer 函数传值1
不看c++ primer 永远不知道自己基础有多差 函数的參数传值一般有两种方式:值传递,引用传递. 值传递有以下两种形式: void func( int a ) { // } void func1 ...
- c#基础 函数传值
随便新建个控制台程序做个演示! 1.最基础,最普通的传值方式: static void Main(string[] args) { ); Console.WriteLine("x:" ...
- go slice与函数传值的理解
go语言中所有的传值方式都是传值操作. 今天遇到了以下代码: func main(){ slice := make([],) fmt.Println(slice) change(s) fmt.Prin ...
- 关于swap函数传值的问题
#include <stdio.h> void swap(int * p3,int * p4); int main() { int a = 9; int b = 8; int * p ...
随机推荐
- 查看TensorFlow的版本以及安装路径
查看TensorFlow的版本以及安装路径 进入到Python环境 import tensorflow as tf tf.__version__ # 查看版本 tf.__path__ # 查看安装路径 ...
- 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 ...
- bind(named)配置文件
BIND是DNS协议的一种实现.BIND包含了一个DNS Server(服务名叫named),用来解析主机名到ip地址:一个解析库:一些辅助工具,还有一个安全目录工具,分别属于下面几个包: 下面是原配 ...
- java 面试题摘要
5.1 什么是线程 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位, 可以使用多线程对运算提速. 5.2 线程和进程有什么区别 (1)进程是资源的分配和调度的一个独 ...
- 经常使用的js三元表达式
语法:条件?表达式1:表达式2 . 条件的括号可要可不要的 let istrue = true; let a = (istrue === true) ? '我是true啊' : "我是fa ...
- Ion-select and ion-option list styling 自定义样式
https://forum.ionicframework.com/t/ion-select-and-ion-option-list-styling/117028
- docker 卸载与安装
卸载 Docker自17.03版本开始分为两个版本Docker CE和Docker EE: Docker CE:Docker Community Edition,即Docker社区版 Docker E ...
- Spring——JdbcTemplate
一.JdbcTemplate介绍: 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架,Spring Boot Spring Data ...
- [CSP-S模拟测试]:序列(二分答案+树状数组)
题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...
- 12.数值的整数次方 Java
题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 这道题看似简单,其实BUG重重.要注意的问题: 1 关于次幂的问题特殊的情况, ...