精华内容
下载资源
问答
  • 这句话是错误的,因为一个函数内部可以有多个复合语句。 举个栗子: void main(void) { // 复合语句1 { // 复合语句2 int a = 10; } printf("%d\n",a);...这说明在复合语句(代码块)中定义的变量...

    这句话是错误的,因为一个函数内部可以有多个复合语句。
    举个栗子:

    void main(void)
    {	// 复合语句1
    	{	// 复合语句2
    		int a = 10;
    	}
    	printf("%d\n",a);
    }```
    编译后报错:[Error] 'a' undeclared (first use in this function)(变量a未声明)
    这说明在复合语句(代码块)中定义的变量,不可以在复合语句之外使用。
    (第一次用这玩意,排版就这样吧,懒得折腾了)
    
    展开全文
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ... 多个语句用括号{}括起来组成一个语句称复合语句。...程序应把复合语句看成是单条语句,而不是多条语句。 如: {   

    多个语句用括号{}括起来组成的一个语句称复合语句。 

    在程序中应把复合语句看成是单条语句,而不是多条语句。
    如:

    {  

         x=y+z;  

         a=b+c;  

         printf("%d%d",x,a);  

    }  

    是一条复合语句。

    复合语句内的各条语句都必须以分号“;”结尾;此外,在括号“}”外不能加分号。



    定义变量可能有三种情况: 

    (1)在函数的开头定义;

    (2)在函数内的复合语句内定义.;

    (3)在函数的外部定义.;

           在一个函数内部定义的变量只在本函数范围内有效,也就是说只有在本函数内才能引用它们,在此函数以外是不能使用这些变量的.在复合语句内定义的变量只在本复合语句范围内有效,只有在本复合语句内才能引用它们.在该复合语句以外是不能使用这些变量的.以上这些成为"局部变量".

           程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数.在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量).全局变量可以为本文件中其他函数所共用.它的有效范围为从定义变量的位置开始到本源文件结束.

    展开全文
  • 作者:starwing83网友 谭书其实和C语言有一个很相像地方,就是都出了很多个版本。然而C语言出新版本是为了方面程序员、适应新变化和开发风格。...定义变量的位置:一般函数开头声明部分定义变量...

    作者:starwing83网友
      谭书其实和C语言有一个很相像的地方,就是都出了很多个版本。然而C语言出新的版本是为了方面程序员、适应新的变化和开发风格。而一本教材出新的版本无非就是修正错误和描述语言的新方向。然而,如果一本教材的第一版就是概念不清胡说八道,却又碍着面子不肯承认自己的错误,那最终的结果就是越错越远了。
      就比如这里:

    定义变量的位置:一般在函数开头的声明部分定义变量,也可以在函数外定义变量(即外部变量、全局变量,见第7章)。C99允许在函数中的复合语句(用一句花括号括起来)中定义变量。
    ————谭浩强 ,《C程序设计》(第四版),清华大学出版社, 2010年6月,(前言)p41

      我相信谭老一定没有亲自去看过C99标准,不知道是英文不好还是自信满满觉得自己比标准要牛。所以,虽然谭老的确知道有“标准化”这么一个说法,却只有错上加错的份儿。事实上,我看不出这里的“一般”有什么凭据,难道谭老从没有看过正式地C语言项目吗?一般情况下,只有八十年代到九十年代的C语言项目才会“一般”在函数开头定义变量,新的项目一般定义变量的位置是复合语句的开头。将自己的臆测煞有介事地说成业界惯例,不知道这是无耻还是做得太多已经麻木了。
      让我们来揭开谜底吧。实际上,这段话几乎每一句都是错误的。”一般在函数开头的声明部分“,很遗憾地,C99根本就没有“声明部分”的说法,而C90中,声明部分根本就不止限于函数开头!“也可以在函数外定义变量”这一句是对的,然而括号坏事了:“(即外部变量,全局变量)”,事实上C语言根本没有全局变量的说法,只有外部变量,静态变量的说法,因为事实上这里的全局是有两个含义的:文件域的全局,和整个程序范围的全局。这两个含义是根据变量的链接性来定义的,我们之前就提到了链接性的概念,而谭书对此只字不提。“C99运行在函数中的复合语句(用一对花括号括起来)中定义变量”,首先这是C90的特性,而不是C99的,其次,括号内的部分明显代表谭老根本就不知道什么是复合语句,花括号本身是复合语句的一部分,复合语句花括号内的部分在标准中是被叫做“块项列表(block-item-list)”的,而列表中的一个块项既可以是声明,也可以是语句。对基本概念都不清晰,也难怪错的这么离谱了。
      我们总结一下:
      - C99实际上是允许你在任何地方声明变量的。
      - C90声明部分实际上是可以在任何复合语句的开头的。
      也就是说,下面的代码在C90里面仍然是合法的:

        void reverse(int array[], size_t size) {
            int i = 0, j = size - 1;
            for (; i < j; ++i, --j) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    

     

       只有唯一一种情况是必须在函数开头申请变量的:即该变量在整个函数的执行过程中都必须存在。而真正有这么一个需求是很罕见的。如同这里的 temp 变量,它只需要在交换的时候才存在,因此就不该把它和 i, j 声明在一起。上面的代码是合法的 C90 代码,可以在任何严格支持 C90 (而不支持 C99)的编译器下编译。
      就算你用的是C90的编译器,你也仍然可以获得“随处声明变量”的特权,很简单,在需要使用局部变量的时候,直接用复合语句即可,这也是复合语句作为一种单独的语句类型出现的另一个理由。(前一个理由是作为其他语句(如if for)中的语句部分存在)
      在真正使用的时候申请变量是个好习惯,这也是 C99 真正的改变是允许变量在任意位置定义,而不仅限复合语句开头的缘故。这可以防止变量的名字冲突,简化逻辑——新申请的变量哪怕名字和之前申请的一致,也不会对旧的变量有任何影响,一旦新变量超过作用域,旧的变量仍然有效。这是C语言的一个重大特性,也被认为是C语言最优秀的一个特性,这个特性就是大名鼎鼎的“词法作用域”。它被广泛地用在了大量的语言上,是编程语言的一个约定俗成的基本特性。如果不允许在复合语句内申请变量,无异于让C语言自废武功。
      并且,我们知道,C语言的局部变量是分配在栈上的。那么局部变量的及时释放也帮助节省栈空间:对于两个平行的复合语句块,其内部的局部变量事实上是共享一块区域的,这就是词法作用域的另一个实际好处。
      为什么谭老即使是愿意让C语言自废武功,也不愿意介绍真正的C99的变量声明特性呢?原因是谭书的前一个版本言之凿凿地说明“变量只允许声明在函数开头”,记得我最开始看谭书的时候,就一直是这么申请变量的,直到自行翻阅C90标准才走出这个误区。08年的时候我帮助一个上海交大的生物系研究生修改其 DNA 检测代码,就发现一堆的 i,j, k, l, m, n 被申请在函数开头,整个程序十分难维护,后来花了很大功夫才将代码整理完成,由此可见谭书危害之深。
      程序员一个重要的素质就是肯承认错误,肯承认失误。程序本就是思维的结晶,是智慧最集中的产品。不肯承认错误,就一定会被更先进者替代。而谭书却死死抓住“权威”两字不放,宁愿错上加错也不肯承认自己不是完人。这样的心态怎么符合一个程序员的自我修养呢?又怎么培育合格的程序员呢?书的销量越好,事实上是流毒越多而已。
      下面我们介绍一下C99真正的新特性,看看标准委员会为C语言的进步做出了什么样的努力。
    C99从C++中引进了可以“随处申请变量”的特性,并修改了 for 语句的语法,添加了一个新的 for 语句形式。对C99来说,复合语句内已经不区分“声明部分”和“语句部分”,在任何地方都可以书写声明或者语句,而新加入的 for 语句的语法是允许 for 的第一个部分是声明,后跟可选的表达式(注意声明本身会带上一个分号),后跟必须的分号,再跟可选的表达式。也就是说,上面的反转函数实际上可以这么写:

        void reverse(int array[], size_t size) {
            for (int i = 0, j = size - 1; i < j; ++i, --j) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    

     

       这时,i, j, temp 就同属一个作用域了,即 for 语句的语句体。在 for 语句之外使用 i, j, temp 会造成编译错误。
      注意和C++不同,对C99来说只有 for语句才有在第一部分申请变量的殊荣, if、while等等语句都是不允许的。而在C++里面这些语句的条件判断部分都是可以申请新变量的。
      从C99的新特性可以看出,C语言显然易见地是支持并鼓励“使用处声明”的编程方法的。而谭书却对此只字不提,挂着着C99的羊头,卖着C89的狗肉,不愿大大方方地承认自己的错误,甚至连一点点改过的意向都没有,只是一门心思的一错再错,一条路走到黑。这种态度不止是一本教科书编撰者,就算只是一个普通的程序员,恐怕也逃不过被开除的命运。

    转载于:https://www.cnblogs.com/pmer/archive/2012/04/22/2464766.html

    展开全文
  • 同样,在复合语句中定义的变量只在本复合语句范围内有效,如下就是局部变量:#include主函数不能使用其他函数中定义的变量。不同函数中可以使用同名的变量,它们代表不同 的对象,互不干扰。可以在一个函数内的复合...

    120b18a71b6085f4278751dccd769242.png

    C++局部变量

    C++局部变量是指:在一个函数内部定义的变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它,在此函数以外是不能使用这些变量的。

    同样,在复合语句中定义的变量只在本复合语句范围内有效,如下就是局部变量:

    #include
    • 主函数不能使用其他函数中定义的变量。
    • 不同函数中可以使用同名的变量,它们代表不同 的对象,互不干扰。
    • 可以在一个函数内的复合语句中定义变量,这些变量只在本复合语句中有效。
    • 形式参数也是局部变量。
    • 在函数声明中出现的参数名,其作用范围只在本行的括号内。
    • 主函数main中定义的local_Variable就是局部变量,只在主函数中有效,不会因为在主函数中定义而在整个文件或程序中有效。

    C++全局变量

    C++全局变量:是指在函数之外定义的变量,如下:

    #include

    建议读者尽量不要使用全局变量,原因有以下几点

    • 全局变量在程序的全部执行过程中都占用存储单 元,而不是仅在需要时才开辟单元。
    • 它使函数的通用性降低了,因为在执行函数时要 受到外部变量的影响。
    • 使用全局变量过多,会降低程序的清晰性。

    读者需要了解一点:如果在同一个源文件中,全局变量与局部变量 同名,则在局部变量的作用范围内,全局变量被屏 蔽,即它不起作用,设全局变量的作用是增加函数间数据联系的渠道。

    变量的有效范围称为变量的作用域,归纳起来,变量有4种不同的作用域

    • 文件作用域
    • 函数作用域
    • 块作用域
    • 函数原型作用域

    文件作用域是全局的,其他三者是局部的,除了变量之外,任何以标识符代表的实体都有作用域,概念与变量的作用域相似。

    经典案例:C++输出局部与全局变量。

    源码分析:

    #include

    编译后的结果:

    全局变量的值:
    5.2 C++局部变量与全局变量mp.weixin.qq.com
    96705f71a9ab9783e98710e41d09fa28.png
    展开全文
  • 同样,在复合语句中定义的变量只在本复合语句范围内有效。这称为局部变量(local variable)。如: 对局部变量的一些说明: 1) 主函数main中定义的变量(m, n)也只在主函数中有效,不会因为在主函数中定义而在整个...
  • 一、变量的定义mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin...end 块使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时申明多个变量,如果需要,可以使用default...
  • 我有故事,你有酒么?C++局部变量C++局部变量是指:在一个函数内部定义的变量,它只在本函数范围内有效,...同样,在复合语句中定义的变量只在本复合语句范围内有效,如下就是局部变量:#include//头文件 usingnames...
  • 4.11局部变量和全局变量 每一个变量都有其有效作用范围,这就是变量的作用域。 4.11.1局部变量 ...同样在复合语句中定义的变量只在本复合语句范围内有效,这些内部变量称为局部变量(local variabl...
  • 复合语句

    2019-08-05 21:45:23
    复合语句 又叫做语句块,是用花括号扩起的任意数量的Java...语句块可以使用外部的变量,而外部不能使用语句块中定义的变量,因为语句块中定义的变量作用域只限于语句块。 public static void main(String[] args) {...
  • 如果在语句中定义一个新的变量,则仅当该程序执行该语句块中的语句时,该变量才存在。执行完语句块后,变量将被释放。 #include int main() { using namespace std; cout ...
  • MySql中变量的定义

    2013-07-26 11:57:21
    mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin...end 块使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时申明多个变量,如果需要,可以使用default赋默认值。...
  • mysql 存储过程中变量的定义与赋值操作一、变量的定义mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin...end 块使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时...
  • 一、变量的定义 mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin…end 块使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时申明多个变量,如果需要,可以使用default...
  • C语言中,我们知道放在函数中的普通变量的值只能通过return语句返回值,但是如果只是把复合语句放在主函数中,则复合语句中的变量定义又该如何呢?我们来看下边一个例子: #include <conio.h> #include &...
  • C++局部变量C++局部变量是指:...同样,在复合语句中定义的变量只在本复合语句范围内有效,如下就是局部变量:#include<iostream>//头文件 using namespace std;//命名空间 int main() //主函数 { int loc...
  • 一、MySQL变量的定义mysql变量定义用declare来定义一局部变量,mysql 存储过程中变量的定义与赋值操作,该变量的使用范围只能在begin...end 块使用,变量必需定义在复合语句的开头,并且系在其它语句之前,expr为值...
  • 我有故事,你有酒么?C++局部变量C++局部变量是指:在一个函数内部定义的变量,它只在本函数范围内有效,...同样,在复合语句中定义的变量只在本复合语句范围内有效,如下就是局部变量:#include//头文件 usingnames...
  • 一、变量的定义mysql中变量定义用declare来定义一局部变量,该变量的使用范围只能在begin...end 块使用,变量必须定义在复合语句的开头,并且是在其它语句之前,也可以同时申明多个变量,如果需要,可以使用default...
  • 局部变量定义变量一般有三种形式:在函数的开头定义在函数的外部定义在复合语句中定义其中在函数的开头和在复合语句中定义的时候,只能在函数内部和该复合语句中使用,像这种变量称为局部变量。 例...
  • 同样,在复合语句中定义的变量只在本复合语句范围内有效,如下就是局部变量: #include<iostream>//头文件 using namespace std;//命名空间 int main() //主函数 { int local_Variable;//这就是局部变量 ...
  • 同样,在复合语句中定义的变量只在本复合语句范围内有效。这称为局部变量(local variable)。如: 对局部变量的一些说明: 1) 主函数main中定义的变量(m, n)也只在主函数中有效,不会因为在主函数中定义而在...
  • C++自动变量 C++中自动变量用关键字auto作存储类别的声明,C++中...如果是在复合语句中定义的变量,则在变量定义时分配存储空间,在复合语句结束时自动释放空间。 存储类别auto和数据类型int的顺序任意。关键字auto可以
  • 同样,在复合语句中定义的变量只在本复合语句范围内有效。这称为局部变量(local variable)。如: 对局部变量的一些说明: 1) 主函数main中定义的变量(m, n)也只在主函数中有效,不会因为在主函数中定义而...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 805
精华内容 322
关键字:

在复合语句中定义的变量