A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sen 中级黑马   /  2014-4-12 22:19  /  1512 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sen 于 2014-5-20 11:58 编辑

#include <stdio.h>

int age;

void test()
{
    int age;
    age =10;
}


int main()
{
    printf("%d\n",age);//0
   
    int age = 20;
   
    printf("%d\n",age);//20
   
    test(); //(为什么这句函数没有调用? 如没有int age = 20 则能调用)
   
    printf("%d\n",age);//20
   
    return 0;
}

为什么main函数中的test函数对之后的printf没有影响??

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

6 个回复

倒序浏览
void test()
{
    int age;
    age =10;
}
这个函数里定义的age作用域只在此函数,也就是说这个age=10只在这个函数里有用,一旦函数被调用完,age=10就不再存在了,在内存中消失了。
主函数中test()函数调用了一次,因此当此函数调用完毕后,age=10,就会在内存中消失。由于你已经在主函数中定义了age=20,因此在输出的时候会寻找age的值,因此age=10已经消失了,所以会输出age=20;并不是test()函数没有进行调用。如果你在test()函数里增加输出age的值,就会发现age=10,还是输出了,test()函数被调用了、

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
  1. #include <stdio.h>
  2. int age;
  3. void test()
  4. {
  5.     int age;
  6.     age =10;
  7.    [color=Red] printf("调用了test的函数\n");[/color]
  8. }
  9. int main()
  10. {
  11.     printf("%d\n",age);//0
  12.     int age = 20;
  13.     printf("%d\n",age);//20
  14.     test();
  15.     printf("%d\n",age);//20
  16.     return 0;
  17. }
复制代码

结果为:
0
20
调用了test的函数
20
test()函数肯定是调用了,但是test()里的age是局部变量,只在test函数内部有效,其实只是局部变量和全局变量同名而已,test里的age你可以改为x或y任意变量名,不会对main造成影响;其次,在main函数中你传的是个空值,如果是地址的话就会对main函数的printf有影响,也可以简单的理解为是地址传递与值传递的区别吧!!

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
int main()
{
    printf("%d\n",age);//0
   
    int age = 20;
   
    printf("%d\n",age);//20
   
    test(); //(为什么这句函数没有调用? 如没有int age = 20 则能调用)
   
    printf("%d\n",age);//20
   
    return 0;
}
***********************************
main函数中的调用test()时,会为test()函数分配一个内存空间,但是test()函数掉用完之后这个test内存空间会被删掉,包括里面的变量,全局变量int a与test里的局部变量int  a在不同的内存空间中,作用域不同,没有联系。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
变量分为全局变量和局部变量,全局变量是声明在函数之外的,任意函数都可以调用,而局部变量是声明在函数内部的之恩那个在本函数调用,在别的函数里是没用作用,也就是他的作用域。

#include <stdio.h>

int age;

void test()
{
    int age;
    age =10;
}


int main()
{
    printf("%d\n",age);//0
   
    int age = 20;
   
    printf("%d\n",age);//20
   
    test(); //(为什么这句函数没有调用? 如没有int age = 20 则能调用)
   
    printf("%d\n",age);//20
   
    return 0;
}
虽然你声明了全局变量age,但是在test函数中调用的还是自己本身的局部变量age,赋值给他这个局部变量是10,和主函数的age是没有关系的,而且不会传值,所以得到的结果还是0.20

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
#include <stdio.h>



int age;

void test()
{
     int age;  // int给age分配了内存,{}代码块内部运行完毕该部分内存就消失了 。若是没有int age则会把10赋值给全局变量age,依然不会影响输出。
     age =10;
}


int main()
{
     printf("%d\n",age);//0
     
    int age = 20;
     
    printf("%d\n",age);//20
     
    test(); //
     
    printf("%d\n",age);//20
     
    return 0;
}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
  1. #include <stdio.h>

  2. int age;//这个是全局变量。

  3. void test()
  4. {
  5.     int age;//这个是test函数的局部变量,出了函数就会被释放
  6.     age =10;
  7. }


  8. int main()
  9. {
  10.     printf("%d\n",age);//0
  11.    
  12.     int age = 20;//这里还包含了一个main函数中的 age局部变量。
  13.    
  14.     printf("%d\n",age);//20
  15.    
  16.     test(); //(为什么这句函数没有调用? 如没有int age = 20 则能调用)特地试过了。去掉int age=20的话,输出结果就全部是0
  17.    
  18.     printf("%d\n",age);//20
  19.    
  20.     return 0;
  21. }
复制代码



test 中的变量周期只有test内执行完了,出了函数就被释放掉了。所以后面的变量没有变成10

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马