c语言中的变量作用域总结

不管什么语言,main好像总是程序的入口,大括号是它的内容;变量的作用域总是困扰着我们,接下来,我们循序渐进的搞明白c语言中的变量作用域,首先得知道c是弱类型的语言,弱类型表现在很多方面:
1:你可以直接在程序中写一个常量,然后一个分号:1;
2:在定义函数时,void型的函数可以return;int型的可以不用写返回值。
………还有很多
 
下面我们一步一步开始:首先在main中定义的变量当然作用于整个main函数了
 
1:在main中定义变量
 #include<stdio.h>
int main()
{   int a=;
  printf(“%d\n”,a);
  return ;
}
2:当在一个结构体中,即大括号中定义时(后边的#include<stdio.h>都省略了):
int main()
{ int a=; //结构体中
{
//首先结构体中是可以访问外层的变量的,这里可以直接访问a;
//printf(“%d\n”,a);
//其实上边在访问a的时候,编译器是会先在当前结构体中找a,如果没有才找外层的a
int a = ;//当然这里这个a只属于当前结构体中,即在大括号结束时,a被销毁,并不会影响外边的a;
printf(“%d\n”,a);//输出1
} printf(“%d\n”,a);//输出还是0
return ;
}
 
3:结构体可以多层嵌套的,多层嵌套时的情况:
int main()
{
  int a = ;
  //第一层结构体
  {
    printf(“%d\n”,a);//输出0
    int a = ,b=;
    printf(“%d\n”,a);//输出1
    //第二层嵌套
    {
      printf(“%d\n”,a);//输出1
      int a = ;
      printf(“%d\n”,a);//输出2
    }
  }
  printf(“%d\n”,a);//输出0
  //printf(“%d\n”,b);//这个是不能访问的,b在内层结构体中
}
总结:当有多层结构体嵌套时,最内层的可以访问外层的,但是外层的不可以访问内层的
 
4:通过3的例子总结,似乎可以解释一切的变量作用域了,但是随着知识的不断学习,又有了新的疑惑
 int main()
{
  //在for的循环体中定义变量,且循环体只有一条语句,建议任何时候都写大括号
  for (int a=; a<; a++)
   int b = ;//报错,不能定义变量,要定义只能在大括号中   return ;
}
这个其实比较好理解,如果不加大括号,表面上看b属于main的全局,因为只有一对main函数的大括号,但是对于for循环来讲,又希望这个
b在循环结束就释放掉,这样就矛盾了,所以编译器强制在for循环体中定义变量时定义在大括号中;类似的还有case语句中定义变量,所
以在使用for或者case时,即使语句只有一条也加上大括号;
 
5:for循环中的其他情况,对比函数(方法)定义时的变量作用域
int main()
{
  for(int a=; a<; a++,b++)//这里的b当然是不能访问了,b是在下边的一对大括号中定义的,也就是内层结构体中
  {
    printf(“%d\n”,a);//依次输出0、1、2,前提上边小括号中的b++删掉
    int a = ;//这个重名的a是可以的,在上边定义过a后,循环体重可以继续定义a,这个根据1、2中的结构体来理解
    int b = ;
    printf(“%d\n”,a);//每次都输出10
  }
  return ;
}
上边的例子来看for循环中的局部变量a可以在循环体中定义重名变量,只是每一次循环结束,循环体中的a会被释放
 
但是在定义函数时,形参是不能在函数体中定义重名变量的
int test(int num1, int num2)
{
  int num1 = ;//这个是不允许的,按照上边的for循环来讲是可以的,但是函数的形参是等待接收实参的值的,并且这个值要在函数体中参与运算的,是一个很有意义的变量,c不允许重新定义与形参同名的变量名以防止这个形参真的没了意义,而for中的a只是让循环继续的一个条件,即使在循环体中重新定义了,每次循环结束后,会被释放,a又回到了原来的值,并不影响循环,所以可以;
  return ;
}
以上都是个人的理解,自己也是正在学习c基础,如有不对的地方,欢迎一起讨论;
 
 

c语言变量作用域问题的更多相关文章

  1. 黑马程序员-- C语言变量作用域与代码块

    这里通过变量作用域的两种错误用法来介绍一下C语言变量作用域 其次对代码块的使用进行了简单说明: #include <stdio.h> 1.变量的作用域(作用范围) 变量定义的那一行开始,直 ...

  2. Go语言【第八篇】:Go语言变量作用域

    Go语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围,Go语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量: 函数外定义的变量称为全局变量: 函数 ...

  3. GO语言学习(十三)Go 语言变量作用域

    Go 语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函 ...

  4. go语言变量作用域

    Go 语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函 ...

  5. Go 语言变量作用域

    作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函数定义中的变量称为形式 ...

  6. Go的变量作用域

    Go 语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内部定义的变量称为局部变量 函数外部定义的变量称为全局变量 ...

  7. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...

  8. C/C++语言中变量作用域:局部变量,全局变量,文件级变量

    C/C++语言中的变量分为全局变量和局部变量. 这样的划分方式的根据是变量的可见范围或者叫做作用域. 1 局部变量 局部变量指的是定义在{}中的变量,其作用域也在这个范围内.尽管常见的局部变量都是定义 ...

  9. [转]深入理解JavaScript的变量作用域

    1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...

随机推荐

  1. oracle 常用技巧及脚本

    [Q]怎么样查询特殊字符,如通配符%与_ [A]select * from table where name like 'A/_%' escape '/' [Q]如何插入单引号到数据库表中 [A]可以 ...

  2. 零碎记录Hadoop平台各组件使用

    >20161011 :数据导入研究    0.sqoop报warning,需要安装accumulo:    1.下载Microsoft sql server jdbc, 使用ie下载,将42版j ...

  3. 根据不同的浏览器对不同元素进行css调整

    <!if firefox> .element { top:4px; } <![endif]> <!if chrome> .element { top:6px; } ...

  4. js 平滑定位

    <script type="text/javascript"> function intval(v){ v = parseInt(v); return isNaN(v) ...

  5. JqueryPagination 分页插件使用说明

    JqueryPagination是个简单轻量级的分页插件,使用起来很容易,只要初始化一个实例,并设置总数量.翻页回调函数.其它参数就可以实现无刷新分页功能了 1 首先引入相关js文件: <lin ...

  6. 【学习笔记】【C语言】标识符

    1. 什么是标识符 标识符就是在程序中自定义的一些符号和名称.要跟关键字区分开来:关键字是C语言默认提供的符号,标识符是程序员自定义的 2. 标识符的作用 1) 标识符,从字面上理解就是用来标识某些东 ...

  7. WPF DataGrid 操作列 类似 LinkButton

    WPF中没有类似LinkButton,所以只有运用Button及样式来实现LinkButton. DataGrid 操作列 实现 多个类似LinkButton按钮: 具体实现代码如下: <Dat ...

  8. [javascript|基本概念|Object]学习笔记

    对象:数据和功能的集合 创建对象:new 对象类型名称 e.g.: var o = new Object(); 或 var o = new Object(省略(),不推荐) 或 var o = {}( ...

  9. ArcGIS 坐标系统文件

    坐标是GIS数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确的坐标. ArcGIS自带了多种坐标系统,在${ArcGISHome}Coordinate Systems目录下可 ...

  10. UML类图新手入门级介绍

    UML类图新手入门级介绍 举一个简单的例子,来看这样一副图,其中就包括了UML类图中的基本图示法. 首先,看动物矩形框,它代表一个类(Class).类图分三层,第一层显示类的名称,如果是抽象类,则就用 ...