注册 登录
编程论坛 C++教室

求指点,调用函数中出现主函数已有的变量

flypanda999 发布于 2013-02-14 13:18, 834 次点击
首先拜个晚年。我是个无任何基础的初学者,用的是吕凤翥的《c++语言程序设计》,课后习题里有这么一段代码:

#include<iostream.h>
int a;
void main()
{
     int b=2;;;
     cout<<a<<','<<b<<endl;
     {
        int b;
        static int a=5;
        cout<<a<<','<<endl;
        a=10;
        b=10;
        cout<<a<<endl;
     }
     b=8;
     cout<<a<<','<<b<<endl;
}
在VC++上实验等效于下面一段代码:
#include<iostream.h>
int a;
void fun();
void main()
{
int b=2;
cout<<a<<','<<b<<endl;
fun();
b=8;
cout<<a<<','<<b<<endl;
}
void fun()
{
int b;
static int a=5;
cout<<a<<','<<endl;
a=10;
b=10;
cout<<a<<endl;
}
我不明白的是:在同一个源文件中a如何能定义两次,而且还是两种不同的存储类。很是困惑,请高人帮我指点下迷津。
24 回复
#2
zklhp2013-02-14 13:28
同一个源文件中a如何能定义两次,而且还是两种不同的存储类。

你看的那个书里面讲不讲变量的类型呢 变量可以有类型的 比如 auto global static 你这里 两个a的类型不一样 一个是static 一个是全局变量也就是global


[ 本帖最后由 zklhp 于 2013-2-14 13:30 编辑 ]
#3
flypanda9992013-02-14 13:47
回复 2楼 zklhp
之前有一道例题:
#include<iostream.h>
void fun();
void main()
{
  fun();
  fun();
}
void fun()
{
  int a=5;
  a=2*a;
  static int b=10;
  b=2*b;
  cout<<a+b<<endl;
}
结果是30
      50
分析中一说第次调用fun()结束时b的值仍保留,等到第二次调用时b的值不能被再次定义了。为什么这里就不能再次定义,而之前我问的那段里就可以再次调用呢?多谢
#4
Susake2013-02-14 13:50
首先第一次算出来是50是很明显的是吧,第2次b=20不变 即20 * 2 + 10 = 50就可以解决了
#5
Susake2013-02-14 13:52
所谓2个a其实是不同的,一个是全局变量,一个是局部变量,但是在全局变量和局部变量相同时,只有局部变量起作用
#6
zklhp2013-02-14 14:05
以下是引用flypanda999在2013-2-14 13:47:38的发言:

之前有一道例题:
#include
void fun();
void main()
{
  fun();
  fun();
}
void fun()
{
  int a=5;
  a=2*a;
  static int b=10;
  b=2*b;
  cout<

这个就是 static 的用法演示 认真看书去罢、、、
#7
Susake2013-02-14 14:07
。。。。
#8
flypanda9992013-02-14 14:33
回复 6楼 zklhp
嗯嗯,我就是没法理解例题中说a是静态存储类变量,第一次调用结束后不释放,也不能被再次定义,而最上面书后习题中那段代码int a;是外部存储类变量,程序不结束不会释放,而为什么又可以被再次定义为静态存储类变量呢
#9
Susake2013-02-14 14:35
      这要看局部变量的作用域了,如果超过局部变量的作用域,就可以从新定义
#10
flypanda9992013-02-14 14:52
回复 9楼 Susake
外部存储类变量的作用域是整个程序啊,怎么可以被再定义呢?(最上面那段代码中的int a)
#11
zklhp2013-02-14 14:53
以下是引用flypanda999在2013-2-14 14:33:10的发言:

嗯嗯,我就是没法理解例题中说a是静态存储类变量,第一次调用结束后不释放,也不能被再次定义,而最上面书后习题中那段代码int a;是外部存储类变量,程序不结束不会释放,而为什么又可以被再次定义为静态存储类变量呢

这里好像不是你想的这个样子 而是 变量都有一个属性 而且是有且只有一个属性 要么是全局 要么是静态 要么是局部 而且有规定 有全局有局部默认用的是局部 也就是 一般来说默认用自己函数里面的而不是全局的 当然C++里也提供了访问全局的方式

代码说话

程序代码:

#include <iostream>

using std::cout;
using std::endl;

int a = 100;

void func(void)
{
    static int a = 2;
    cout << "这里我打出了a=" << a << endl;
    cout << "最后打出的是啥?" << endl;
}

int main(void)
{
    int a = 1;
    cout << "这里我打出了局部变量 因为默认情况下是用局部变量 a=" << a << endl;
    cout << "这里我打出了全局变量 a=" << ::a << endl;
    func();
   
    return 0;
}


这些东西是基础知识 记住就好了

这里我打出了局部变量 因为默认情况下是用局部变量 a=1
这里我打出了全局变量 a=100
这里我打出了a=2
最后打出的是啥?
#12
Susake2013-02-14 14:55
可以赋值啊
#13
zklhp2013-02-14 14:55
以下是引用flypanda999在2013-2-14 14:52:14的发言:

外部存储类变量的作用域是整个程序啊,怎么可以被再定义呢?(最上面那段代码中的int a)

这里牵扯的知识点是局部变量覆盖全局变量

这容易理解 函数是相对独立的 如果一旦有一个外部的变量 我这些函数都受影响了 那多不方便啊 所以 默认是先里后外
#14
Susake2013-02-14 14:57
是这样,  一般都不用全局变量的
#15
zklhp2013-02-14 14:57
还有就是 楼主学的这个代码很不规范啊

比如

#include<iostream.h>

这个带.h的文件已经被抛弃了 很多编译器都不支持了罢

     int b=2;;;

这里又是啥。。

如果楼主想从事这方面的工作 建议找些好点的 规范的东西来学习。。
#16
zklhp2013-02-14 14:59
其实我根本不会C++、、

还有一个问题 这里 没有什么namespace神马的么
#17
Susake2013-02-14 15:07
这里交给我吧....一般来说是不用namespace,但是输入和输出流中要加上std::,这样就显得很麻烦。。。。接着就出现了using namespace std;
这个在后面的输入和输出就只要写cin 和 cout了
#18
zklhp2013-02-14 15:10
以下是引用Susake在2013-2-14 15:07:36的发言:

这里交给我吧....一般来说是不用namespace,但是输入和输出流中要加上std::,这样就显得很麻烦。。。。接着就出现了using namespace std;
这个在后面的输入和输出就只要写cin 和 cout了
那为啥他的代码也没 namespace 也没std 好像是能编译过呢

我琢磨 要么是iostream.h的问题 要么是VC6的问题
#19
Susake2013-02-14 15:13
我想他应该把C++和C和在一起了.....因为大部分的程序C和C++都是兼容的
#20
Susake2013-02-14 15:16
一般这2种是比较规范的
第一:将头文件stdio.h 改为cstdio  然后写法和C一模一样
第二:将头文件stdio.h改为iostream
再用using namespace std;
再用cin 和 cout
#21
zklhp2013-02-14 15:16
以下是引用Susake在2013-2-14 15:13:14的发言:

我想他应该把C++和C和在一起了.....因为大部分的程序C和C++都是兼容的

cout C里也没这个啊
#22
Susake2013-02-14 15:19
可以能是C++继承了C的特性吧,我做的竞赛书上推荐的是这2中写C++程序
#23
zklhp2013-02-14 15:21
因为他用的是.h的头文件 就像上面说得 这个.h版的头文件已经是淘汰产品了 很多编译器已经不支持了
#24
Susake2013-02-14 15:25
这个不太清楚
#25
flypanda9992013-02-15 17:54
回复 23楼 zklhp
能不能帮推荐些像样的教材,谢谢
1