精华内容
下载资源
问答
  • (1)C语言从语法上规定全局变量只能用常量表达式来初始化,因此下面这种全局变量初始化是不合法的: int minute = 360; int hour = minute / 60; (2)如果全局变量在定义时不初始化则初始值是0,如果局部...

    (1)C语言从语法上规定全局变量只能用常量表达式来初始化,因此下面这种全局变量初始化是不合法的:

    int minute = 360;
    int hour = minute / 60; 
    

    虽然在编译时计算出 hour 的初始值是可能的,但是 minute / 60 不是常量表达式,不符合语法规定,所以编译器不必想办法去算这个初始值。

    (2)全局变量在定义时不初始化则初始值是0,局部变量在定义时不初始化则初始值是不确定的。
    所以,局部变量在使用之前一定要先赋值,如果基于一个不确定的值做后续计算肯定会引入Bug。

    (3)关于形参和实参
    记住这条基本原理:形参相当于函数中定义的变量,调用函数传递参数的过程相当于定义形参变量并且用实参的值来初始化

    (4)关于局部变量和临时变量
    假设写了一个如下的返回布尔值的函数

    int is _even(int x)
    {
    	if(x%2==0)
    		return 1;
    	else
    		return 0;
    }
    与之等价的,可以直接写成:
    int is even(int x)
    {
    	return !(x%2);
    }
    

    例如上面的函数调用相当于这样的过程:
    在这里插入图片描述

    参考:<Linux C 一站式编程>

    展开全文
  • C++变量初始化规则

    2013-07-29 19:23:23
    当我们定义一个没有初始化式的变量时,系统有时候会帮我们初始化变量,有时候又不会帮我们初始化变量。这主要取决于三点:(1)变量的类型;(2)变量的位置;(3)特殊的关键字。 1、 内置类型变量初始化 内置...

    当我们定义一个没有初始化式的变量时,系统有时候会帮我们初始化变量,有时候又不会帮我们初始化变量。这主要取决于三点:(1)变量的类型;(2)变量的位置;(3)特殊的关键字。

    1、  内置类型变量的初始化

    内置类型是指C++语言本身定义的基本数据类型,如int、double、bool、char等,这些内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量(即全局变量)都初始化为0,在函数体里定义的变量(即局部变量)不自动进行初始化。实际上,未初始化的变量事实上都有一个值,它会随机把该变量放到内存中的某个位置,编译器会把这个位置中的值当成一个合法的值去做相关的运算,而这种错误是我们很难发现的,往往会导致程序错误执行。

    上面说的应该不难理解,有趣的是我在VS2010上验证上面的说法时,发现全局变量确实会初始化为0,但是局部变量却不是一个随机值,而是一个固定值-858993460(0xcccccccc)。后来上网查了一下后发现,在VC Debug版本里,栈中分配的值都会先用0xCCCCCCCC来处理一下,所以大家在Debug模式下调试程序发现在引用0xCCCCCCCC这样的值,就说明在试图使用一个没有初始化的值。DEBUG版本为了能让程序员更早的发现错误,把堆栈上的数据对初始化成了0xCCCCCCCC,也就是说局部变量如果不初始化,那么DEBUG版本中就会是0xCCCCCCCC,从而容易发现未初始化的错误。如果想详细了解VC中的0xCCCCCCCC可以参考下面的网址

    http://qiusuoge.com/8291.html

    2、  类类型变量的初始化

    每个类都定义了该类型的对象可以怎样初始化。类可以通过定义一个或多个构造函数来控制类对象的初始化。如果定义某个类的变量时没有提供初始化式,这个类也可以定义初始化时的操作。它是通过一个特殊的构造函数即默认构造函数来实现的。这个构造函数之所以被称作默认构造函数,是因为它是“默认”运行的。如果没有提供初始化式,那么就会使用默认构造函数。不管变量在哪里定义(无论是全局变量还是局部变量),默认构造函数都会被使用。

    大多数类都提供了默认构造函数。如果类具有默认构造函数,那么就可以在定义该类的变量时不用显示地初始化变量。例如,string类定义了默认构造函数来初始化string变量为空字符串,即没有字符的字符串:

    string empty;//empty是一个空串:empty=“”

    有些类类型没有默认构造函数。对于这些类型来说,每个定义都必须提供显示的初始化式。没有初始值是根本不能定义这种数据类型的变量的。

    3、  特殊的关键字

    对于使用static关键字修饰的内置类型变量,不管变量在哪里定义(无论是全局变量还是局部变量),都会像全局变量一样初始化为0。

    展开全文
  • C语言编程规范中,一个争论已久的问题,就是变量是否该在定义时进行初始化。 针对这个问题,谈谈我的个人想法。 相比于变量定义时初始化,本人更倾向于变量按需初始化。 当然,变量按需初始化并不是不要在定义时初始...

    C语言编程规范中,一个争论已久的问题,就是变量是否该在定义时进行初始化。

    针对这个问题,谈谈我的个人想法。

    首先,相比于变量定义时初始化,本人更倾向于变量按需初始化,具体如下:

    A、 变量按需初始化,即变量定义时不初始化,而在变量使用前再进行赋值,此时可明确的知道该变量需要一个什么样的值

    B、 而变量定时义初始化,可能给变量赋了一个不恰当的值,因为此时为变量初始化的任何值,等到该变量被使用时,都可能是一个意料之外的值。例如,int i = 0; 变量 i 定义时被初始化成0了。程序在某个时刻用到该变量func(i),且在该函数调用之前,没有其他地方对 i 赋值。而func函数内部,认为入参0是个有效的值,然后进行一些处理。而这有可能是我们不希望看到的,因为这是一个误操作(在使用 i 之前没给它赋一个有效的值)。此时最好的结果是:func认为0是无效的参数,不做处理直接返回即可,即不把影响扩大化。

    C、 现在编译器一般是可以检查出这样错误:变量在没初始化的情况下就被使用了。如果你采用了B的初始化方式,编译器就不会报错了,那么B中的意外就会发生

    在变量定义时进行初始化,我们一般是期望给变量赋一个无效的值,保证在以后使用该变量时可通过合法性校验,避免因为使用了未初始化的变量(变量的值不确定)而产生意料之外的情况。

    但在大型项目开发中,往往需要多人合作开发,每个人对于无效值的定义并不一定是一致的。例如程序员张三认为0为无效值,而程序员李四认为0是有意义的,0xffff才是无效的。那么上文提及的情况B就会发生。当然在开发时,张三和李四提前约定好对无效值的定义,保证他们对无效值的认识是一致的,那也可以避免情况B的发生。但要明白,在大型产品迭代开发中,某个模块的代码并非一直是张三维护、开发,如果来了新员工王五,他是否也会与张三、李四一样认为0是无效的呢?

     C语言是面向过程的编程语言,作为C语言编程从业者,要时刻对于自己的变量心中有数。而在变量使用前进行赋值,会促使程序员思考此时该给变量赋一个什么样的值才符合自己的期望,从而选择一个合适的值,避免了意料之外的情况发生。

    当然,变量按需初始化并不是不要在定义时初始化,而是要灵活应用。比如,字符串变量,在使用前一般要memset为0,如果将初始化的动作放在变量定义时,是可以有效的提高整个程序的运行效率的。而有些变量用于缓存内部调用的返回值,而且只有在内部调用完成之后才会使用该变量,那就没必要在该变量定义时进行初始化了。也就是说,变量在被使用前,一定要保证已被正确赋值了。

    一个好的编程规范,在大型产品合作开发中尤为重要,不但有助于提高代码的可读性、可维护性,而且对产品质量也起到正向的作用。
    展开全文
  • C++类成员变量初始化位置

    千次阅读 2015-09-08 11:29:16
    static: static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而... 在C++中,static静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始

    static:
    static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。
    在C++中,static静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化,如:double Account::Rate=2.25;static关键字只能用于类定义体内部的声明中,定义时不能标示为static
    static成员函数主要目的是作为类作用域的全局函数。不能访问类的非静态数据成员。类的静态成员函数没有this指针,这导致:1、不能直接存取类的非静态成员变量,调用非静态成员函数2、不能被声明为virtual
    const:
    在C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。
    const数据成员 只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。
    const数据成员的初始化只能在类的构造函数的初始化列表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static cosnt。
    cosnt成员函数主要目的是防止成员函数修改对象的内容。即const成员函数不能修改成员变量的值,但可以访问成员变量。当方法成员函数时,该函数只能是const成员函数。
    const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。

    总结起来,可以初始化的情况有如下四个地方:
    1. 在类的定义中进行的,只有const 且 static 且 integral 的变量。
    2. 在类的构造函数初始化列表中, 包括const对象、Reference对象和一般变量。
    3、在类的定义之外初始化的,包括static变量。因为它是属于类的唯一变量。
    4、普通的变量可以在构造函数的内部,通过赋值方式进行。当然这样效率不高。

    class DebugDelete
    {
    public:
        DebugDelete(std::ostream &s = std::cerr):os(s),i(2),j(3){}  //流无法被拷贝
        template<typename T> void operator()(T* t)const
        {
            os << "deleting ptr" << std::endl;
            std::cout << "t:" << t <<" &t:"<< &t <<" *t:" <<*t << std::endl;
            delete t;
            std::cout << "t:" << t <<" &t:"<< &t <<" *t:" <<*t << std::endl;
        }
    private:
        std::ostream &os;//流无法被拷贝,只能在初始化列表初始化
        int i;//可以在初始化列表,构造函数内部初始化
        const int j;//只能在初始化列表初始化
        static int k;//只能在类外部类文件中初始化
        static const int m = 30;//可以在类外部类文件中也可以在定义时初始化初始化
        static const float n ;//只能在类外部类文件中初始化
    };
     int DebugDelete::k = 20;
     //const int DebugDelete::m = 30;//合法
     const float DebugDelete::m = 30.0;
    #endif
    展开全文
  • C/C++ --- 全局变量初始化总结

    千次阅读 2016-09-01 17:29:56
    什么时候初始化根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时...
  • 内置类型变量是否自动初始化取决于变量定义...问题出在未初始化变量事实上都有一个值,编译器吧该变量放到内存中的某个位置,而把这个位置无论哪种位模式都当成是变量初始的状态,当被解释成整型值时,任何位模式都...
  • 变量初始化规则以及声明和定义

    千次阅读 2007-07-08 16:53:00
    当我们定义没有初始化式的变量的时候,系统有时候会帮我们初始化变量.系统提供什么样的值取决于变量的类型,也取决于变量定义的位置.内置类型变量初始化.内置类型变量是否自动初始化取决于变量定义的位置.在函数体外...
  • zero initialization 的变量会被保存在 bss 段,const initialization 的变量则放在 data 段内,程序加载即可完成初始化,这和 c 语言里的全局变量初始化基本是一致的。 dynamic initialization:动态初始化...
  • 结构体变量初始化和引用 任务描述 本关任务:从键盘输入两个学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。 相关知识 结构体类型用于描述由多个不同数据类型的数据...
  • 指针变量定义和初始化

    千次阅读 2019-04-17 08:16:47
    1.指针定义和初始化 2.指向数组的指针 指针数组 指针定义 ...指针变量初始化 语法形式 存储类型 数据类型*指针名=初始地址; 例: int *pa = &a; 注意事项 用变量地...
  • 本节介绍Tensorflow中的变量创建和初始化操作。 初始化操作包含三种: 1. 给特定的变量单独初始化 2. 直接给所有变量初始化 3. 用其他的变量给一个变量初始化
  • 全局变量初始化

    千次阅读 2014-08-24 20:08:31
    注:以下例子仅是讨论C++语法,绝非推荐在实践中利用它们。 例1 extern int y; int x = y; int y = x; int main() ...{} 例2 extern int y; int x = y; int y = 3; int main() ...{...
  • 初始化变量引起运行问题

    千次阅读 2013-06-23 01:49:52
    结合几年来在C++编程中的遇到的问题,以及看了《C++ Primer Plus》这本书后觉得变量初始化确实是一个值得重视的细节。先将原因列举出来: 内置类型变量初始化 使用未初始化变量是常见的程序错误,通常也是...
  • const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。 static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是...
  • java要求定义成员变量时必须采用合法的向前引用,比如: public class ErrorDef { int num1 = num2 +2 ;//非法向前引用num2 int num2 = 10 ; } 上述代码无法通过编译。num1非法向前引用num2。 同样的道理,两...
  • 使用未初始化变量是常见的程序错误,通常也是难以发现的错误。虽然许多编译器都至少会提醒不要使用未经初始化变量,但是编译器并未要求去检查未初始化变量的使用。而且没有一个编译器可以检测出所有未初始化变量...
  • C++类构造函数初始化变量

    千次阅读 2013-07-19 09:39:12
    构造函数初始化列表  2009-12-18 17:46:48| 分类: C++|字号 订阅 与任何其他函数一样,构造函数具有名字、形参表和函数体。 与其他函数不同的是,构造函数也可以包含一个构造函数初始化列表:...
  • 在了解指针变量初始化之前,首先要弄清楚一点:什么是指针?1、指针的内容实际上是一个地址,我们只要给指针赋值一个地址,它将会指向这个地址表示的内存空间,这也是指针的作用,我们要访问某个地址时,这个指针...
  • 静态(statis)变量只在第一次被调用时声明并初始化,此后保存在堆上。而对于类的静态成员来说,同样是所有类共享一个静态成员,需要注意的是静态成员的初始化 如下面代码 class A { public: static int a; // ...
  • 对于JAVA中类的初始化是一个很基础的问题,其中的一些问题也是易被学习者所忽略。当在编写代码的时候碰到时,常被这些问题引发的错误,感觉莫名其妙。而且现在许多大公司的面试题,对于这方面的考查也是屡试不爽。...
  • 2.1详解变量的定义、初始化与赋值

    千次阅读 2017-01-16 15:39:34
    这一节我们将继续《1.3变量初探》的内容。 在前的课程中我们谈到,变量其实就是一块内存空间的名称。简要地说,计算机拥有可供程序使用的随机存取存储器(RAM),当一个变量被定义时,一部分内存就会被预留给这个...
  • 是父类的初始化的方法,这时候B对象还没初始化,c为空,b为默认值0。 然后将A类构造函数中的 setMM() 注释掉,B不变: public abstract class A { public A(){ // setMM(); } public abstract void setMM...
  • c语言结构体学习整理(结构体初始化,结构体指针)

    万次阅读 多人点赞 2018-11-01 20:22:12
    首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来...
  • 初始化数组成员变量:似乎没有比较简单的办法在初始化列表里初始化数组成员。建议在构造函数的函数体内赋值。不过可以用模板实现: #include #include class A { public: template A(Args... args) : x_...
  • C++认识初始化

    千次阅读 2015-08-29 18:32:55
    初始化是程序设计中一项重要的...使用未初始化变量(或内存区域)是程序产生bug的重要原因之一。正确理解和使用初始化操作,要弄清以下几个问题。1.什么是初始化在给初始化下定义前。先弄清楚两个概念。申明与定义。
  • 首先呢,结构是一些值的集合,这些值称为成员变量,结构的每个成员变量可以是不同类型的变量。 一般的声明 struct Book { char name[100]; //书名 float price; //价格 }b1,b2; //全局变量 struct Book b3; ...
  • 如果是静态(static)生存期(函数外声明的变量和静态存储变量)的未初始化变量,可以确保整形初始化为0,浮点型初始化为0.0,指针初始化为null 。 如果是自动(automatic)生存期的变量(即非静态存储类型的局部...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,407
精华内容 49,762
关键字:

以下变量初始化合法的是