很简单的c++程序问题
黄舟
黄舟 2017-04-17 11:08:27
[C++讨论组]
 #include<iostream.h>
 int m;
 int add(int x, int y =15, int z = m);
 int main(void)
 {
     using namespace std;
     int a = 5,b = 10,c = 20;
     int s;
     s = add(a,b);
     cout<<s<<endl;
 }

 int add(int x,int y,int z)
 {
     return x + y + z;
 }
 //end of this file

运行结果为什么是15而不是20呢?谁给我解释一下呗,谢谢

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(3)
大家讲道理

先推荐楼主一本书《C++ primer》,用于入门应该更好些,因为我看楼主的代码写得很多地方不够规范,比如 C++ 中使用 #include<iostream> 而不是 C style 的 #include<iostream.h>,另外对namaspace的使用也应该放在main函数以外更规范些。 好,现在回答问题,这里需要注意两点

  1. 全局变量是如何初始化的
  2. 默认形参如何赋值的

先说第一个问题:一个由 C/C++ 编译的程序占用的内存分为以下几个部分:

1)、栈区(Stack):由编译器(Compiler)自动分配释放,存放函数的参数值,局部变的值等。其操作方式类似于数据结构中的栈。

2)、堆区(Heap ):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3)、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

4)、文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。

5)、程序代码区:存放函数体的二进制代码。

你程序中的m就是一个全局变量,所以虽然你没给它赋初值,但它会被初始化为0。

第二个问题,有默认值的参数如何使用,如果该参数被传递,择使用实参的值,所以形参 y 被赋值为实参b的值也就是10,而不是默认值15,而形参z没有被传递所以使用默认值也就是 m=0,所以自然是 5 + 10 = 15

天蓬老师

add(a, b) 中,调用 add(x, y, z),其中 x = ay = bz 取默认值 mm 是全局变量,由系统初始化为 0,所以结果是 a + b + 0 = 15

阿神
 如果直接使用 using namespace std  是非常可怕的 ,它会将std 中所有定义的量全部加载到 该文件中,如果命名变量不当,会造成命名冲突,甚至会系统崩溃,  建议这样用 using std::cout;  using std::endl;     m  为全局变量,系统默认初始化为0 
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号