在做题出现个神奇的事情,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);

最新文章

  1. python程序生成平均脸
  2. php 上传文件
  3. $.extend()的用法【转】
  4. fetch 关于七牛的content-type 的问题
  5. Wiki介绍
  6. 解决HtmlAgilityPack无法获取form标签子节点的问题
  7. 完美解决Android完全退出程序(转)
  8. Cesium 获取当前视图范围
  9. js for...in 语句
  10. Weave 网络结构分析 - 每天5分钟玩转 Docker 容器技术(64)
  11. Ant 批量执行jmeter 脚本
  12. 【Mysql】【环境配置】Mac
  13. 自定义View之圆形水波扩散动效
  14. Linux运维中遇到的常见问题
  15. Latex编译过程中遇到的奇奇怪怪的问题及解决方案
  16. c# 程序调试出现“未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。”
  17. python之数据库的操作(课前准备)
  18. IDETalk
  19. 【BIEE】06_UNION /UNION ALL集合中分类汇总求和占比字段特殊处理
  20. hd acm1425

热门文章

  1. 在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法
  2. chrome插件开发-notification API注意事项
  3. Storm实践(二):集群搭建
  4. java8新特性学习:函数式接口
  5. IDEA中使用Sqlite3
  6. Win7安装VS2019
  7. Prism框架实战——订餐软件
  8. B/S上传超大文件解决方案
  9. js文件下载
  10. nodeJS环境搭建