首页 > 开发 > C++ > 正文

很简单的c++程序问题

2017-09-11 21:35:32  来源: 网友分享
 #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呢?谁给我解释一下呗,谢谢

解决方案

先推荐楼主一本书《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