精华内容
下载资源
问答
  • 局部变量前是不可使用访问控制修饰符的 首先我们先来看一段源代码 public void A(){ private int a = 4; } 如果在eclipse工具开发中,编译时期会提醒我们有错,错误提示是删除a的修饰符private,那...

    局部变量前是不可使用访问控制修饰符的


    首先我们先来看一段源代码

    public void A(){

    private int a = 4;
    }

    如果在eclipse工具开发中,编译时期会提醒我们有错,错误提示是删除a的修饰符private,那为什么局部变量前不能用pirvate等修饰符呢?


    我们知道局部变量本身就是一种有限制的变量,只可以局部调用,即局部变量只可以在其生命周期{}内有效,在{}之外是不能够访问的,所以 不需要任何修饰符,如public、private、protected等,但是能加final。


    至于能不能使用static关键字,本人也不太清楚,有待继续学习。



    展开全文
  • 1.定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是被定义为局部变量。在这种情况下,不论全局变量中是否用到该变量名,函数中使用的都是局部变量。例如: num = 100 def func(): num ...
  • MySQL入门 SQL语言之十八:系统变量(全局变量、会话变量),自定义变量(用户变量、局部变量)的使用 #变量 /*系统变量: 全局变量  会话变量自定义变量: 用户变量  局部变量 */ #一、系统变量 /*说明:变量由...

    MySQL入门 SQL语言之十八:系统变量(全局变量、会话变量),自定义变量(用户变量、局部变量)的使用

    #变量
    /*

    系统变量:
        全局变量
        会话变量

    自定义变量:
        用户变量
        局部变量
    */
    #一、系统变量
    /*

    说明:变量由系统提供,不是用户定义,属于服务器层面
    使用的语法:
    1、查看所有的系统变量
    show global variables;
    SHOW session VARIABLES;#session可以省略

    2、查看满足条件的部分系统变量
    show VARIABLES variables like '%char%';

    3、查看指定的某个系统变量值
    select @@global|【session】.系统变量名;

    4、为某个系统变量赋值
    方式一:
    set global|【session】 系统变量名 = 值;
    set autocommit = 0;

    方式二:
    set @@global|【session】.系统变量名 = 值;

    注意:
    如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认session

    */
    #1》、全局变量

    /*
    作用域:服务器每次启动将为所有的全局变量赋初始值,针对于所有会话(连接)有效,但是不能跨重启。
    如果要想每次启动也修改,则需要修改配置文件。
    */

    #查看所有的全局变量
    SHOW GLOBAL VARIABLES;

    #查看部分的全局变量
    SHOW GLOBAL VARIABLES LIKE '%char%';

    #查看指定的全局量的值
    SELECT @@global.autocommit;
    SELECT @@tx_isolation;

    #为某个指定全局变量赋值
    #方式一:
    SET @@global.autocommit = 0;
    #方式二:
    SET GLOBAL autocommit = 0;
    #2》、会话变量
    /*

    作用域:仅仅针对于当前会话(连接)有效,并且有默认值
    */


    #查看所有的会话变量;
    SHOW SESSION VARIABLES;
    SHOW  VARIABLES;

    #查看部分的会话变量
    SHOW  VARIABLES LIKE '%char%';
    SHOW SESSION VARIABLES  LIKE '%char%';

    #查看指定的某个会话变量
    SELECT @@tx_isolation;
    SELECT @@session.tx_isolation;

    #④为某个会话变量赋值
    #方式一
    SET @@session.tx_isolation = 'read-uncommitted';
    #方式二:
    SET SESSION tx_isolation =  'read-committed';


    #二、自定义变量
    /*

    说明:变量是用户自定义的,不是由系统的

    使用步骤
    声明
    赋值
    使用(查看、比较、运算等)

    */
    #1、用户变量
    /*

    作用域:针对于当前会话(连接)有效,同于会话变量的作用域
    应用在任何地方,也就是begin end里面或begin end外边
    */

    赋值的操作符= 或 :=
    #声明并初始化
    SET @用户变量名 = 值;
    SET @用户变量名 := 值;
    SELECT @用户变量名 :=值;

    #②赋值(更新用户变量的值)
    方式一: 通过SETSELECT
        SET @用户变量名 = 值;
        SET @用户变量名 := 值;
        SELECT @用户变量名 :=值;
    方式二:通过SELECT INTO
        SELECT 字段 INTO @变量名
        FROM 表;
    #③使用(查看用户变量名的值)    
    SELECT @用户变量名;

    #2、局部变量
    /*

    作用域:仅仅在定义它的begin end中有效
    应用在begin end中的第一句话
    */

    #①声明
    DECLARE 变量名 类型;
    DECLARE 变量名 类型 DEFAULT 值;
    #②赋值
    方式一: 通过SETSELECT
        SET 局部变量名 = 值;
        SET 局部变量名 := 值;
        SELECT @局部变量名 :=值;
    方式二:通过SELECT INTO 局部变量名
        SELECT 字段
    #③使用
    SELECT 局部变量名;


        
    #案例:
    #声明并初始化

    SET @name = 'john';
    SET @name = 100;
    SET @count = 1;
    #赋值
    SELECT COUNT(*) INTO @count 
    FROM employees;
    #查看
    SELECT @count;


    对比用户变量和局部变量

     作用域定义和使用的位置 语法
    用户变量当前的会话会话中的任何地方必须加@符号,不限定类型
    局部变量 BEGIN END中只能在BEGIN END中,且为第一句一般不加@符号,需限定类型

     

    #案例:声明两个变量并赋初始值,就和,并打印
    #1.用户变量
    SET @m=1;
    SET @n=2;
    SET @sum = @m+@n;
    SELECT @sum;
    #2.局部变量
        DECLARE m INT DEFAULT 1;
        DECLARE n INT DEFAULT 2;
        DECLARE SUM INT;
        SET SUM = m + n;
        SELECT SUM;

    #报错

    展开全文
  • 什么全局变量,局部变量,静态局部变量,静态全局变量 到这里,我们就可以很容易区分上面的变量类型了。实际上这里只是换了一种说法: 全局:具有文件作用域的变量 静态:具有静态存储期或内部链接属性 局部:具有...

    来源:公众号【编程珠玑】

    作者:守望先生

    
     

    前言

    这些是编程语言中的基本概念,如果你还不是非常明确地清楚标题的问题,并且不知道作用域,链接属性,存储期等概念的具体含义,那么本文你不该错过。为了更加清晰的理解我们的问题,需要先了解三个概念:作用域,链接属性,存储期。

    作用域

    C语言中,作用域用来描述标识符能够被哪些区域访问。

    而常见作用域有以下几种:

    为了便于说明,我们来看一个例子,就很容易理解了:

    /****************************作者:守望先生来源:公众号编程珠玑个人博客:https://www.yanbinghu.com***************************************/#include <stdio.h>int num1 = 222;         //定位在函数外,具有文件作用域static int num2 = 111;  //定义在函数外,具有文件作用域int swap(int *a,int *b); //这里的a,b是函数原型作用域int swap(int *a,int *b){    if(NULL== a || NULL == b)        goto error;        else    {        int temp = *a;  //定义在函数内,块作用域        *a = *b;        *b = temp;        return 0;    }    //printf("temp is %d\n",temp);   //因为temp具有块作用域,因此在这里不能直接使用    error://goto语句的标签,函数作用域,因此在前面就可以引用        {            printf("input para is NULL\n");            return -1;        }}int main(void){    printf("num1=%d,num2=%d\n",num1,num2);    swap(&num1,&num2);  //num1 num2具有文件作用域,可以在main函数中直接使用    printf("num1=%d,num2=%d",num1,num2);    return 0;}
    #include <stdio.h>
    int num1 = 222;         //定位在函数外,具有文件作用域
    static int num2 = 111;  //定义在函数外,具有文件作用域
    int swap(int *a,int *b)//这里的a,b是函数原型作用域
    int swap(int *a,int *b)
    {
        if(NULL== a || NULL == b)
            goto error;    
        else
        {
            int temp = *a;  //定义在函数内,块作用域
            *a = *b;
            *b = temp;
            return 0;
        }
        //printf("temp is %d\n",temp);   //因为temp具有块作用域,因此在这里不能直接使用
        error://goto语句的标签,函数作用域,因此在前面就可以引用
            {
                printf("input para is NULL\n");
                return -1;
            }
    }
    int main(void)
    {
        printf("num1=%d,num2=%d\n",num1,num2);
        swap(&num1,&num2);  //num1 num2具有文件作用域,可以在main函数中直接使用
        printf("num1=%d,num2=%d",num1,num2);
        return 0;
    }

    可以看到,error标签具有函数作用域,整个函数内都可见,而temp具有块作用域,因此在大括号外部,不能直接使用它。而num1和num2具有文件作用域,因此main函数可以直接使用它。

    链接属性

    在《hello程序是如何变成可执行文件的》我们说到了编译的过程,最后一个步骤就是链接。链接属性决定了在不同作用域的同名标识符能否绑定到同一个对象或者函数。或者说,不同作用域的标识符在编译后是否是同一个实体。

    c变量有三种链接属性:

    再稍作解释,没有static修饰,且具有文件作用域的变量,他们在链接时,多个同名标识符的变量最终都绑定到同一个实体。而static修饰的具有文件作用域的变量就不一样了,不同文件内,即便标识符名字相同,它们也绑定到了不同的实体。

    因此,如果我们希望某个变量或函数只在某一个文件使用,那么使用static修饰是一个很好的做法。

    同样的,来看一个例子。

    /****************************作者:守望先生来源:公众号编程珠玑个人博客:https://www.yanbinghu.com***************************************/#include <stdio.h>int a = 5;   //文件作用域,外部链接属性,其他文件可通过extern int a的方式使用该文件的astatic b = 6;  //文件作用域,内部链接属性,即便其他文件也有同名标识符,它们也是不同的int main(void){    int sum = 0 ; //无链接属性    sum = a + b;    printf("sum is %d\n",sum);    return 0;}
    #include <stdio.h>
    int a = 5;   //文件作用域,外部链接属性,其他文件可通过extern int a的方式使用该文件的a
    static b = 6;  //文件作用域,内部链接属性,即便其他文件也有同名标识符,它们也是不同的
    int main(void)
    {
        int sum = 0 ; //无链接属性
        sum = a + b;
        printf("sum is %d\n",sum);
        return 0;
    }

    从代码中可以看到,a和b都具有文件作用域,a具有外部链接属性,而b具有内部链接属性,sum具有块作用域,因此无链接属性。

    存储期

    实际上作用域和链接属性都描述了标识符的可见性,而存储期则描述了这些标识符对应的对象的生存期。存储期,也分下面几种:

    关于初始化,可参考《C语言入坑指南-被遗忘的初始化》。
    同样地,我们通过下面的代码来更好地理解存储期:

    /****************************作者:守望先生来源:公众号编程珠玑个人博客:https://www.yanbinghu.com***************************************/#include <stdio.h>int num1 = 222;         //静态存储期static int num2 = 111;  //静态存储期int add(int a,int b){    static int tempSum = 0;  //静态存储期    tempSum = tempSum + a + b;    return tempSum;}int main(void){    printf("num1=%d,num2=%d\n",num1,num2);    int sum = 0;  //自动存储期    sum = add(num1,num2);    printf("first time sum=%d\n",sum);//sum = 333    sum = add(num1,num2);    printf("second time sum=%d\n",sum); //sum = 666    return 0;}
    #include <stdio.h>
    int num1 = 222;         //静态存储期
    static int num2 = 111;  //静态存储期
    int add(int a,int b)
    {
        static int tempSum = 0;  //静态存储期
        tempSum = tempSum + a + b;
        return tempSum;
    }
    int main(void)
    {
        printf("num1=%d,num2=%d\n",num1,num2);
        int sum = 0;  //自动存储期
        sum = add(num1,num2);
        printf("first time sum=%d\n",sum);//sum = 333
        sum = add(num1,num2);
        printf("second time sum=%d\n",sum); //sum = 666
        return 0;
    }

    另外,如果我们通过nm命令查看编译出来的程序文件的符号表,我们可以找到num1,num2,tempSum,而没有sum,前者所用的内存数量在编译时就确定了。关于nm命令的使用可以参考《linux常用命令-开发调试篇》。

    $ gcc -g -o lifetime lifetime.c $ nm lifetime|grep num10000000000601038 D num1$ nm lifetime|grep num2000000000060103c d num2$ nm lifetime|grep tempSum0000000000601044 b tempSum.2289$ nm lifetime|grep sum$|grep num1
    0000000000601038 D num1
    $ nm lifetime|
    grep num2
    000000000060103c d num2
    $ nm lifetime|grep tempSum
    0000000000601044 b tempSum.2289
    $ nm lifetime|
    grep sum
    $

    什么全局变量,局部变量,静态局部变量,静态全局变量

    到这里,我们就可以很容易区分上面的变量类型了。实际上这里只是换了一种说法:
    全局:具有文件作用域的变量
    静态:具有静态存储期或内部链接属性
    局部:具有函数或块作用域的变量

    因而结合起来,也就很好理解了。

    当然,这仅仅是为了区分它们,这并不是它们的严格定义。更好的方法,是通过代码来理解:

    #include <stdio.h>int num1 = 222;         //全局变量static int num2 = 111;  //静态全局变量int add(int a,int b){    static int tempSum = 0;  //静态局部变量    tempSum = tempSum + a + b;    return tempSum;}int main(void){    printf("num1=%d,num2=%d\n",num1,num2);    int sum = 0;  //局部变量    sum = add(num1,num2);    printf("first time sum=%d\n",sum);//sum = 333    return 0;}
    int num1 = 222;         //全局变量
    static int num2 = 111;  //静态全局变量
    int add(int a,int b)
    {
        static int tempSum = 0;  //静态局部变量
        tempSum = tempSum + a + b;
        return tempSum;
    }
    int main(void)
    {
        printf("num1=%d,num2=%d\n",num1,num2);
        int sum = 0;  //局部变量
        sum = add(num1,num2);
        printf("first time sum=%d\n",sum);//sum = 333
        return 0;
    }

    总结

    本文总结如下:

    参考

    https://en.wikipedia.org/wiki/Global_variables

    https://en.wikipedia.org/wiki/Local_variable

    《C11标准文档》


    关注公众号【编程珠玑】,获取更多Linux/C/C++/Python/Go/算法/工具等原创技术文章。后台免费获取经典电子书和视频资源

    640?wx_fmt=jpeg

    展开全文
  • 使用DECLARE定义局部变量 在流程语句的分析中,我们在存储过程中使用变量的声明与设置,由于这些变量也只能在存储过程中使用,因此也称为局部变量,变量的声明可以使用以下语法: DECLARE 变量名[,变量名2...] ...
    使用DECLARE定义局部变量
    在流程语句的分析中,我们在存储过程中使用变量的声明与设置,由于这些变量也只能在存储过程中使用,因此也称为局部变量,变量的声明可以使用以下语法:
     
    DECLARE 变量名[,变量名2...] 数据类型(type) [DEFAULT value];
    DECLARE  num  INT  DEFAULT 10 ;
    -- 定义变量num,数据类型为INT型,默认值为10
     
    DECLARE mult_a,mult_b int;  //定义多个变量
     
     
    其中,DECLARE关键字是用来声明变量的;变量名即变量的名称,这里可以同时定义多个变量;type参数用来指定变量的类型;DEFAULT value子句将变量默认值设置为value,没有使用DEFAULT子句时,默认值为NULL。 如图所示怎么会报错?因为声明变量只能存在于存储过程,与定义变量不同
     
    声明后,我们就可以在存储过程使用该变量,设置变量值可以使用以下语法:
    SET 变量名1 = expr [, 变量名2 = expr] 
    其中,SET关键字是用来为变量赋值的;expr参数是赋值表达式或某个值。一个SET语句可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。除了这种赋值方式,前面我们还提到过使用SELECT…INTO语句为变量赋值,那也是可行的
    正确的例子: SET @a1 = 'zhangsan' ,@a2 =1029,@a3='2018-10-10'
     
    如图所示为什么会报错?因为没有用声明的符号@
     

    相关阅读:

     
     
    展开全文
  • python学习之全局变量与局部变量

    千次阅读 2017-08-28 19:24:36
    python全局变量global python局部变量local UnboundLocalError: local variable 'name' referenced before assignment python闭包 nonlocal locals() 和 globals()
  • 局部变量必须以“@”开头,而且必须先用DECLARE命令说明后才可使用。其说明形式如下:DECLARE @变量名 变量类型 [@变量名 变量类型…]其中变量类型可以是sql server(WINDOWS平台上强大的数据库平台) 2000支持的所有...
  • 局部变量作为返回值问题

    千次阅读 2014-04-23 18:10:57
    函数返回局部变量,是返回局部变量的值。但指针(或地址)是一种特殊的值,所以返回局部指针变量需要特别注意。正确情况下,作为函数返回值的局部指针,其所指向对象的作用域应该是调用者作用域、全局或静态常量区;...
  • 下面有几种网上的理解,我整理一下:一: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员...
  • JAVA 尽量使用局部变量优化性能

    千次阅读 2011-08-08 14:51:04
    java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著... 我们写一个Java类,在其内部方法中定义的局部变量或对象是存储在stack(堆栈)中的,且JVM是一种stack-based的,
  •  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。  2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 。...
  • 局部变量和全局变量的初始化

    千次阅读 2018-05-15 09:09:41
    因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的。在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间...
  • 使用systemtap获得内核局部变量  这两天在看内核的cgroup源码,就想着通过某个工具来获得一些调试信息如bt,参数返回值等,像在调试应用程序一样使用gdb来获得这些信息。所以就有了对systemtap的真正实践。 注:...
  • 关于 C++ 函数返回局部变量的警告

    千次阅读 2014-11-27 16:21:35
    关于 C++ 函数返回局部变量的警告 当函数返回时,局部变量和临时对象被销毁,所以返回的地址是无效的。需要修改代码,使其不返回局部对象的地址。 那么如何解决?该怎么修改代码?
  • ASM增加局部变量

    千次阅读 2015-03-10 20:33:04
    使用asm工具为一个函数添加局部变量后,重新加载该类失败。本篇文章主要分析错误的原因以及解决的办法。 首先了解一下虚拟机的类加载机制。类在初始化之前要完成加载、验证、准备和解析。 加载 加载过程分为三步: 1...
  • c中,一个文件里局部变量可以和全局变量重名。那这个文件编译出来的.o中,这两个变量的符号是怎么表示的呢?不可能符号是相同的呀!c++处理这种情况时,符号表示和c一样还是不同呢?
  • 局部变量和全局变量 $var1=6; echo "定义局部变量\$var=".$var1; include("a.php"); function myfun1(){ global $var1;//此处注意 echo "在myfun1()函数中输出局部变量"; echo "\$var1=".$var1; } ...
  • 主要介绍了c++作用域运算符用法,需要的朋友可以参考下
  • 西门子S7-1200PLC局部变量相关知识

    千次阅读 2019-05-06 14:23:00
    什么是局部变量呢?在回答这个问题之前,有必要对变量声明表有一个基本了解。在TIA Portal STEP7中有两种用来定义符号地址的表格形式:符号表(共享符号)和变量声明表(局域符号),其本质都是为了建立绝对地址与...
  • (1)栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。 (2)堆区(heap) — 由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。 (3)全局区(静态区)(static)—,...
  • 局部变量与全局变量  按照作用域不同将变量分为 局部变量和全局变量  局部变量:定义在函数内部变量  作用域:从定义的那一行开始直到所在代码结束  生命周期:从定义的那一行开始只直到其所在代码结束  ...
  • C++报错:C4700:使用了非初始化的局部变量

    万次阅读 多人点赞 2018-10-12 23:25:16
    使用了非初始化的局部变量 。 报错原因 以前遇到过这种情况,指的是定义一个变量,结构体,对象等,未初始化就进行操作,会报这个错误。还有一种情况就是, 在函数调用过程中,如果参数不是引用调用,那就...
  • 返回局部变量的问题

    千次阅读 2011-05-15 23:07:00
    函数返回局部变量,是返回局部变量的值。但指针(或地址)是一种特殊的值,所以返回局部指针变量需要特别注意。正确情况下,作为函数返回值的局部指针,其所指向对象的作用域应该是调用者作用域、全局或静态常量区;...
  • 函数返回局部变量

    千次阅读 2011-10-28 21:52:24
    本文转自:...  关于局部变量的返回,准确的说应该是:不能通过return 返回指向栈内存的指针!请看下面的两个例子: //----------------------------------------------------1[错误]-----------
  • 系统变量 查看所有的系统变量 SHOW GLOBAL [SESSION] VARIABLES; 查看满足条件的部分系统变量 SHOW GLOBAL [SESSION] VARIABLES LIKE '%变量名%'; 查看指定的某个系统变量的值 SELECT @@GLOBAL|[SESSION]....
  • kotlin--03 定义局部变量

    千次阅读 2015-07-28 23:31:13
    定义局部变量只赋值一次的(只读)局部变量:val a: Int = 1 val b = 1 // `Int` type is inferred val c: Int // Type required when no initializer is provided c = 1 // definite assignment可变的变量var x = 5 //...
  • C++中定义的函数,必须有输入参数(或者说是,形参列表)。...在main函数中,当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量。 "::"这个符号,可以直接来操作全局变量的。
  • 首先,要编译的文件中的符号(函数名,全局变量名)分为weak和strong类型。weak symbol:未初始化的全局变量strong symbol:函数名,初始化的全局变量linker解决按3条规则解决此问题1,多个相同名称的strong symbol...
  • 局部变量 :只能在变量定义的相同地方使用。如果转而调用对象的方法,或者调用自己的独立方法,变量是不起作用的,所以她的作用域(scape )被视为局部的,她只在局部代码内出现。 E.g. def basic_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,641
精华内容 67,456
关键字:

局部变量的使用符号