精华内容
下载资源
问答
  • 深入了解C语言(局部变量定义)
    2021-05-20 04:31:13

    深入了解C语言

    这一节我们主要来研究一下C语言如何使用函数中的局部变量的.C语言中对于全局变量和局部变量所分配的空间地址是不一样的.全局变量是放在_DATA段,也就是除开_TEXT代码段的另一块集中的内存空间.而局部变量主要是使用堆栈的内存空间.好了,让我们直接看看下面这个案例研究.

    研究案例三工具: Turboc C v2.0,Debug,MASM v5.0,NASM

    实例C程序:/* example3.c */charch;int e_main(){

    int i1;

    int i2;

    int i3;

    i1=1;

    i2=2;

    i3=3;

    }

    ; C程序的入口 start.asm

    [BITS 16]

    [global start]

    [extern _e_main]

    start:

    call _e_main

    目标内容:C语言使用局部变量的方法

    同样,这里我需要使用start.asm来作为我们C语言的入口.我们使用e_main,避开常规main函数入口,这样我们就能更清晰地了解到函数内部所产生的代码指令.

    跟前一节一样,我们先编译C程序和入口汇编程序start.asm

    nasmw -f obj -o start.obj start.asm

    TCC -mt -oexample3.obj -c example3.c

    link start.obj example3.obj,example3.exe,,,

    exe2bin example3.exe

    同样,我们使用老DOS的DEBUG工具来对example3.bin进行反汇编查看C生成的代码.

    DEBUG

    -n example3.bin

    -l 0

    -u 0xxxx:0000    CALL0003xxxx:0003    PUSH   BP

    xxxx:0004    MOV    BP,SP

    xxxx:0006    SUB    SP,+06

    xxxx:0009    MOV    WORD PTR [BP-06],0001xxxx:000E    MOV    WORD PTR [BP-04],0002xxxx:0014    MOV    WORD PTR [BP-02],0003xxxx:0019    MOV    SP,BP

    xxxx:001B    POP    BP

    xxxx:001C    RET

    好了,这里关于C生成的代码已经显露出来了.除开第一句CALL 0003是我们在start.asm的代码外,其它就是我C程序生成的代码.

    首先进入e_main函数.执行

    PUSH BP

    MOV  BP,SP这跟我们前面第二个案例中函数反问参数的代码相同.先保存BP,然后把堆栈指针传递给BP,以便后面通过BP来实现对变量的访问.

    SUB  SP,+06将堆栈指针继续后移动6个字节.因为我们在e_main中定义三个整型变量i1,i2,i3,一共6个字节的空间.这里通过移动堆栈指针,来实现局部变量的内存空间分配.

    MOV  WORD PTR [BP-06],0001

    MOV  WORD PTR [BP-04],0002

    MOV  WORD PTR [BP-02],0003分别对应我们在e_main中的三条赋值语句

    i1=1;

    i2=2;

    i3=3;这里我们可以看出,i1的地址实际上就是BP-06,i2就是BP-04,i3就是BP-02.前面的SUB SP,+06就是为了这三个变量而留出6个字节的空间(BP-08到BP-02)

    同时我们也看到C语言中16位的赋值语句就是简单的MOV指令完成的.

    MOV  SP,BP当e_main函数结束后,堆栈指针还原成BP(BP值从未改变过).这样,我们的局部变量i1,i2,i3的空间也就消失了.所以当C语言中的函数结束后,函数中的局部变量会自动消失.

    POP  BP还原BP的值.这与前面的PUSH BP想对应

    好了,本案例研究完毕.下面是总结的时候了.

    C语言函数中的局部变量的空间一般都是放在堆栈里面.在进入函数前,通过"SUB SP,+XX"来为这些局部变量分配堆栈空间.然后同样通过BP来对这些局部变量进行访问.函数结束时,"MOV SP,BP"还原堆栈指针,局部变量随之而消失.最后以"POP BP"还原BP,结束该函数.

    值得注意的是,C语言会自动为C函数中经常使用int类型变量设置成resigter int.这样的局部变量就不是使用堆栈空间的了,而就是直接使用SI寄存器.比如一个典型的例子

    void loop()

    {

    int i;

    while(i<10000)

    {

    i++;

    }

    }对于这样的函数,C语言通常会将i优化成resigter int i.这个i没有使用任何内存空间来保存数值,它的数值直接保存于SI寄存器.那么对它的访问速度自然比起一般的变量要快.

    更多相关内容
  • 1) 主函数main中定义变量(m, n)也只主函数有效,不会因为主函数中定义整个文件或程序中有效。主函数也不能使用其他函数中定义变量。 2) 不同函数可以使用同名的变量,它们代表不同的对象,互不干扰...
  • SQL变量介绍和DECLARE定义局部变量

    千次阅读 2021-12-05 12:28:09
    自定义变量 : 包括 局部变量 和 用户用户变量 2、变量的特点: 1、系统变量的特点: (1)、每个客户机成功连接服务器后,都会产生与之对应的会话。会话期间,服务实例会服务器内存生成与该会话对应的会话系统...

    一、变量的分类及特点

     1、变量的分类总体可以分为两大类:

      系统变量 和  用户自定义变量

           系统变量包括  全局变量会话变量

           自定义变量 : 包括 局部变量 用户用户变量

    2、变量的特点:

    1、系统变量的特点
    (1)、每个客户机成功连接服务器后,都会产生与之对应的会话。会话期间,服务实例会在服务器内存中生成与该会话对应的会话系统变量。这些会话系统变量的初始值都是全局系统变量值的复制,有了标记不同的会话,会话系统又新增了一些变量,这些变量是全局扁郎没有的。

    (2)、会话系统的特点在于,它仅仅用于定义当前会话属性,会话期间对某个会话熊蓉变量值的修改,不会影响到其他会话同一个会话系统变量的值。

    (3)、全局系统变量的特点在于,它适用于定义MYSQL服务实例的属性、特点。当某个会话对某个全局系统变量值的修改会导致其他会话中同一全局系统变量值的修改。

    (4)、全局系统变量对所有会话系统变量生效,会话系统变量包括全局系统变量

    (5)、系统变量一'@@'开头

    2、自定义变量特点
    (1) 、用户会话变量(以@开头),局部变量(不以@开头)

    (2) 、当定义了会话系统变量,在会话期间,该会话系统变量一直有效,不同会话之间的会话系统变量是不能相互访问的。

    (3) 、局部变量必须定义在存储程序中(如函数、触发器、存储过程以及事件),并且局部变量的作用范围仅仅局限于存储程序中,脱离存储程序没有丝毫意义。

    二、局部变量的定义

     (一)DECLARE 命令专门用于定义局部变量及对应的数据结构。

    局部变量主要用于下面三种场合:
    1、定义在存储程序的BEGIN-END语句块之间,此时,先使用DECLARE定义,并且指定其数据类型,然后用SET或SELECT为其赋值。
    2、当局部变量作为存储过程或者函数的参数使用,此时不用DECLARE定义,但是需要指出参数的数据类型。
    3、局部变量用于SQL语句中。

    (二)使用DECLARE 定义局部变量:

    在流程语句分析中,我们在存储过程中使用变量的声明与设置,由于这些变量只能在存储过程中使用,因此也称为局部变量,变量的声明可以使用以下语法:

    DECLARE 变量名,[变量名2....] 数据类型(type) [DEFAULT value];

    其中:

    DECLARE 关键字是用来声明变量的,也可以同时定义多个同数据类型的变量;
    type参数用来定义变量的类型;

    DEFAULAT value字句用来设置变量的默认值,没有default value字句时,变量的默认值为NULL;

    DECLARE a_test int DEFAULT 2021;
    
    //定义一个int类型的变量,变量名为a_test 并赋予默认值为2021
    //也可以同时定义多个变量,数据类型是一样的,都为timestamp类型
    DECLARE v_start_timestamp,v_last_timestamp TIMESTAMP;

     

    展开全文
  • 局部变量的作用域:一个函数内部定义的变量只能本函数内部进行使用。 OK,上面的效果用Java语言实现一下: public class App1 { public static int k = 10;//相当于全局变量 public static void main...
  • - 程序结束释放函数体中定义变量通常是栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是堆上。所有函数体外定义的是全局量,加了static修饰符后不管哪里都存放全局区(静态区),所有...
  • 这篇文章主要介绍了图解python全局变量与局部变量相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 了解全局变量和局部变量之前,我们先来了解一下作用...
  • 当局部变量与全局变量同名时,在定义局部变量的子程序内局部变量其作用;其他地方全局变量起作用。 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu school = "Qing hua" #全局变量
  • 编程语言的三大发展阶段:面向机器语言、面向过程语言...1、类是Java程序的基本要素,一个Java应用程序就是由若干个类所构成; 2、类声明的变量称为对象变量,也简称 对象 ; 3、class 关键字是用来定义类 ; 4、...

    编程语言的三大发展阶段:面向机器语言、面向过程语言、面向对象语言 ;

    其中面向对象语言主要体现三个特征:封装性、继承、动态 ;

    类的定义:类声明和类体。基本格式如下:

    class 类名{

       类体

    }

    特点:

    1、类是Java程序的基本要素,一个Java应用程序就是由若干个类所构成;

    2、类声明的变量称为对象变量,也简称 对象 ;

    3、class 关键字是用来定义类 ;

    4、类的目的是抽象出一类事物共有的属性和行为,并用一定的语法格式来描述所抽象出的属性和行为;

    4、类名必须是合法的Java标识符;

    Java标识符详细说明:(以及中文标识符的说明)

    https://blog.csdn.net/LagerSwan/article/details/104081548


    类的声明:

    如下所示:

    class Number {

    .....

    }

    class 数字 {

    .....

    }

    其中 class Number 与 class 数字 称为类的声明,而 Number 和 数字 则为类名 ;


    类体,即 { } 中的内容:

    类体的内容由如下两部分构成:

    • 变量的声明:用来存储属性的值 ;(体现了对象的属性)
    • 方法的定义:方法可以对类中声明的变量进行操作;(体现了对象的行为)

    如下代码演示:

    public class Class_Test {
    	int number = 10;
    	double numberd = 11.111;
    	double TestDouble() {
    		double numbers = 100 ;
    		numbers += numberd;
    		return numbers;
    	}
    	public static void main(String[] args) {
    		Class_Test test = new Class_Test();
    		System.out.println(test.TestDouble());
    	}
    }

    在以上代码中,声明了一个类 Class_Test ,两个变量 number 与 numberd ,一个方法 TestDouble() ,一个主方法 main () ;


    成员变量的定义:

    一、成员变量的类型:

    成员变量的类型可以是Java中的任何一种数据类型,包括了基本数据类型:整形、浮点型、逻辑类型、字符类型 ;引用类型中的:数组、对象和接口;  

    如下代码演示:

    public class Class_Test {
    
    	public static void main(String[] args) {
    		
    		//成员变量的说明
    		//基本数据类型的成员变量
    		int testt = 11 ;
    		float testf = 11.111f ;
    		double testd = 11.11111 ;
    		//引用类型的变量
    		int a [] ;
    		Class_Test test ;
    		
    	}
    }

    在以上代码中,成员变量:testt,testf,testd 是基本数据类型的变量;a [ ] ,test是引用类型的变量,a [ ] 为数组的变量,test 为类声明的变量,即类对象;

    二、成员变量的有效范围:

    成员变量在整个类内都是有效的,其有效性与它在类体中声明的先后位置是不关的;

    如下代码演示:   最终输出: 110

    public class Class_Test {
    	
    	//成员变量的有效范围:
    	int number = 11 ;
    	int Int_Test(){
    		int int1 = number * digit ;
    		return int1;
    	}
    	int digit = 10 ;
    
    	public static void main(String[] args) {
    		//类体的说明
    		Class_Test test = new Class_Test();
    		System.out.println(test.Int_Test());	
    	}
    }
    

    不建议大家这样编写程序,当代码量多时,对代码的可读性有一定的影响,建议先声明成员变量,再定义方法;

    三、成员变量的编写风格:

    建议大家在声明成员变量时,变量的名字使用驼峰规则,即变量名由多个单词组成时,从第二个单词开始的其他单词的首字母大学;如:computerArea 、ClassExceptionShow 


    方法的使用:

    在类体中,方法的定义包括两部分:方法头、方法体 ;  一般格式如下:

    方法头 {

       方法体

    }

    一、方法头说明

    方法头由方法的类型、名称、名称后面的 () 以及 ()里面的参数列表所构成;

    如下代码演示:

    //无参数的方法头
    double testd (){
        return 11.111;
    }
    
    //有参数的方法头, x 和 y 即为参数
    double testd (double x,double y){
        return x+y;
    }

    二、方法体说明:

    方法体即 方法()后面的 { } 以及 { } 里面的内容;

    在方法体中声明的变量为局部变量,而不是成员变量,局部变量只在方法体内有效,而且与声明时的前后位置有关;

    如下代码演示:

    double testd = 10 ;
    double testd (double x,double y){      //参数 x,y是局部变量
       double sum;                         //参数 sum 是局部变量
       sum = x + y ;
    
       if(sum>x){
           sum += testd ;         //参数 testd 是成员变量(全局变量)
    }
    
        return sum;        //return 语句,返回 sum 的值
    }

    局部变量的介绍:

    1、局部变量不同与成员变量,局部变量只在方法中有效,而且与其声明的位置顺序有关;

    2、若局部变量声明在一个复合语句中,那么该局部变量的有效范围只在复合语句中有效;

    double testd (double x,double y){      //参数 x,y是局部变量
    	   double sum;                         //参数 sum 是局部变量
    	   sum = x + y ;
    	   if(sum != 0){
    	       int ints = 1;        // ints 为复合语句中的局部变量
    	       sum += ints ;
    	}
            double bottom = 1.1;
            bottom += ints ;         //程序报错:ints cannot be resolved to a variable
    	    return sum;
    	}

    3、若局部变量声明在一个循环语句中,那么该局部变量的有效范围只在循环语句中有效;和以上复合语句是一样的;


    总结:成员变量与局部变量的区别

    1、局部变量不同与成员变量,局部变量只在方法中有效,而成员变量在整个类中都有效;

    2、局部变量与其声明的位置顺序有关,而成员变量与其声明的位置顺序无关;

    3、若局部变量的名字和成员变量的名字相同,那么成员变量会被隐藏,即在方法体中成员变量暂时是无效的,如下代码演示:

    class Test_Variable {
        int x = 10 , y ;
       void tests () {
          int x = 5 ;
          y = x + 10 ; //y的值为 15 ,而不是20,此时成员变量 x = 10 在该方法体中,暂时失效;
       }
    
    }

    4、当想使用方法中被隐藏的成员变量,可以使用关键字 this 进行调用,如下代码演示:

    class Test_Variable {
        int x = 10 , y ;
       void tests () {
          int x = 5 ;
          y = this.x + 10 ; //此时 y 的值为 20 ,而不是15,this.x调用的为成员变量 x = 10 ;
       }
    
    }

    5、成员变量有默认值,而局部变量没有默认值,因此在使用局部变量时,要确保该局部变量是有初始值的,否则程序报错;

    class Test_Variable {
    
               int  y ;
    	   void tests () {
    	      int x;       //报错:The local variable x may not have been initialized
    	      y = x + 10 ; 
    	   }
    
    }

     

     

     

    展开全文
  • PHP 和 JavaSript 区别_后端开发PHP是一种...C语言中在main函数中定义的变量不是全局变量,而是局部变量。main函数中定义的变量与全局变量的生命周期一样长。(推荐教程:C语言教程)注意:全局变量一定是定义在函数...

    PHP 和 JavaSript 区别_后端开发

    PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言,主要用于开发前端应用。

    06e7c1aa5d3ac772dfb62105337a5bda.png

    C语言中在main函数中定义的变量不是全局变量,而是局部变量。

    main函数中定义的变量与全局变量的生命周期一样长。

    (推荐教程:C语言教程)

    注意:全局变量一定是定义在函数外部的。

    python如何生成随机密码?_后端开发

    python生成随机密码的方法:1、编写程序在26个字母大小写和9个数字组成的列表中随机生成10个8位密码;2、使用random库,采用【0x1010】作为随机种子即可。

    main函数是程序启动后执行的第一个自定义函数。

    什么是局部变量?

    定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。

    什么是全局变量?

    在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。

    展开全文
  • 全局变量在整个源文件的作用域都是有效的,只需要一个源文件中定义全局变量其他不包含全局变量定义的源文件中用extern关键字再次声明这个全局变量即可。 也可以一个源文件中定义这个全局变量头文件中用...
  • 函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。但有的时候我们需要两次调用之间对变量的值进行保存。通常的想法...
  • c语言局部变量和全局变量

    千次阅读 2021-08-05 22:52:14
    局部变量出现三种地方: (1)函数的开头定义的变量 (2) 函数内的复合语句内定义的变量 (3)形式参数 一个函数内部定义的变量只本函数范围内有效,也就是只有本函数内才能引用它们,此函数外不能使用这些...
  • 方法中定义局部变量是否为线程安全的? 具体问题,具体分析。 比如我们就拿StringBuilder来分析吧,首先你需要明白:StringBuilder和StringBuffer都是可变的,但是StringBuffer是线程安全的,而StringBuilder是...
  • simulink定义全局变量

    千次阅读 2021-04-22 12:34:02
    函数文件的变量是局部变量 , 运行期间有效 , 运行完毕就自动被清除 , 而命令 文件的变量是全局变量 , 执行完毕后仍被保存内存 (3) 、M 函数文件要定义......(4)命名变量时可以取一个容易...
  • Shell中局部变量和全局变量

    千次阅读 2021-12-12 22:07:52
    shell编程过程,不同于其他编程语言,一些高级编程语JAVA或Python过程在定义一个变量的时候,如果这个变量函数声明的变量,那么函数外面是不能直接使用这个变量的,也就是说高级语言中变量是有...
  • Java局部变量

    千次阅读 2021-02-26 15:03:41
    * 局部变量是指方法或者方法代码块中定义的变量,其作用域是其所在的代码块。可分为三种: * 方法参数变量(形参):整个方法内有效; * 方法局部变量(方法内定义): 从定义这个变量开始到方法结束这一段...
  • 通常情况下,如果有两个同名变量,一个是全局变量,另一个...main函数的输出语句,使用的变量num是main函数内定义局部变量,因此输出的结果为局部变量num的值。 作用域运算符可以用来解决局部变量与全局变量的重
  • 局部变量

    千次阅读 2020-09-07 12:22:00
    局部变量就是定义在大括号{ }包含的代码块内,例如: if(){ } if(){ }else{} for(){ } while() { } do{ } while(); switch(){ } 还有函数的定义,例如: voidfunc(void){ } 大括号{}包含的代码块内定义的...
  • /**********************************************...*函数内部定义局部变量与全局变量重名时,函数使用该变量的时候会以局部变量覆盖全局变量,也就是只有局部变量会起效果。 ********************************...
  • python的全局变量和局部变量

    千次阅读 2020-12-21 06:36:40
    1. 使用局部变量deffunc(x):print'x is', xx =2print'Changed local x to', xx =50func(x)print'x is still', xx is 50Changed local x to 2x is still 50函数,我们第一次使用x的值的时候,Python使用函数声明...
  • 在定义局部变量的子程序内,局部变量起作用;其它地方全局变量起作用。 简而言之,谁的作用域越小,共有作用域内,谁就越大 全局变量 我们需要整个程序中使用某个变量时,定义的就是全局变量 (如果定义常量的...
  • 首先pythonpython同一函数调用了全局变量后又内部定义了与全局变量同名的局部变量,导致引用全局变量那里会报错:UnboundLocalError: local variable 'a' referenced beforeassignment代码:1 ...
  • C语言当中,定义在函数之外的变量称为全局变量(包括main函数),而定义在函数内部的变量我们称之为局部变量,这里需要注意的是main函数内部的变量也是局部变量。 说到变量,我们就不能不说变量作用域,变量的生命...
  • 简单解读局部变量和全局变量

    千次阅读 2021-05-20 17:41:53
    今天课课家笔者为大家详细介绍局部变量和全局变量的概念和作用。函数的参数和返回值我们认识到形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量只能函数内部使用,离开该函数就...
  • C语言的学习过程,会涉及到**局部变量和全局变量的内存分配和内存释放**问题
  • C++,有时会希望函数中局部变量的值函数调用结束后不消失,而保留原来的值。 也就是其占用的存储单元不释放,下一次调用该函数时,这个变量还保留上一次函数调用结束时的值,这是就需要指定该局部变量为静态...
  • 全局变量函数外部定义和声明的变量,我们需要函数内部使用它们。# This function uses global variable sdef f():print s# Global scopes = "I love Geeksforgeeks"f()输出:我喜欢Geeksforgeeks如果函数...
  • 局部变量函数内作定义说明的,其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。 对于局部变量作用域的几点说明: 1)主函数中定义的变量也只能主函数使用,不能其它函数使用。同时,主函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 437,273
精华内容 174,909
关键字:

在程序中定义局部变量