C++ Primer读书笔记第二章②

C++ Primer

第二章 变量和基本类型

变量

变量提供一个具名的,可供程序操作的存储空间。 C++中的每个变量都有其数据类型。 数据类型决定着变量

  • 所占内存空间的大小
  • 存储值得范围
  • 能参与的运算

    变量定义

    int a = 0;
    //首先是类型说明符(int),随后是变量名,最后是初始化(赋予一个初值)
    //也可以连续定义变量,注意变量之间是逗号
    int a = 0, b = 1;
    
    对于初始化,C++的规定比较特殊,说明如下。
int c = 1;//用等于号初始化
c = 2;//先把原来的1擦除,赋值2

++初始化不是赋值,初始化是创建变量时赋予它一个初始值;赋值是把变量当前的值擦除,以一个新的值代替。++ 可能你现在觉得没什么区别,以后就会知道了。


除了上面使用的等于号初始化,还有两种初始化要了解。

  1. 列表初始化
int d{0}; //等价于int d = 0, 也等价于int d(0)

使用花括号{}来初始化有一个很6的地方(当它跟类型转换混一起的时候),它不允许你丢失信息,听不懂的话下面举例说明:

double pi = 3.14;
int p1{pi}, p2 = {pi};//错误:列表初始化不允许损失信息
int p3(pi), p4 = pi;//正确:转换执行,且确实丢失了部分信息
  1. 默认初始化
    int a;
    
    程序员没有对a明确的初始化,则编译器默认初始化其为0,不同类型的变量默认初始化的值也不一样,那我们要不要去记住哪些变量类型对应的默认初始化值是多少呢?不用记,最好的办法就是我们不要默认初始化,每次定义一个变量,就赋给它一个初值。
变量声明和定义的关系

为了支持分离式编译(暂时可以理解为程序可以拆分为多个文件,然后一起编译),C++语言将声明合定义区分开:

  • 声明:使得名字为程序所知
  • 定义:负责创建与名字关联的实体
extern int i; //声明i,声明一个变量就在它前面加上关键字extern,且不要初始化
int j; //声明并定义j
extern int k = 0; 
//定义k,因为赋予了初值,所以等价于int k = 0;
//但是你在函数体内部不能这么干,包括main函数,会报错
//所以,还是老老实实用前面两种方式吧

如果要在多个文件中使用同一个变量,就必须将声明和定义分离。变量的定义只能出现在一个文件中,其他用到该变量的文件必须对其声明,不能重复定义。 可以这么理解:定义是创建实体,实体只有一个,我们定义了一个变量,就创造了一个工具,比如说一个榔头,然后我们在其他文件中想要用榔头,那就喊榔头一声,就声明一下。 所以啊,变量只能被定义一次,但可以被多次声明;对应着工具只需要创造一次,但可以被多次使用。

C++是一种静态类型语言,在编译阶段检查类型。

变量命名规范很重要
  • 标识符(例如变量名)要能体现实际含义
  • 变量名一般用小写字母,如index,不要使用Index或INDEX
  • 用户自定义的类名一般以大写字母开头,如Bookstore
  • 如果标识符由多个单词组成,单词间应该有区分,如student_boy或studetBoy,不要使用studentboy。 以上的规范都是为了代码的可读性。 作者原话:对于命名规范来说,若能坚持,必将有效。
名字的作用域

用大括号来区分,这个我个人觉得特好理解,直接贴一段截取字符串实现sunstring的代码来看这个特点。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str; //str是main函数的全局变量,在main函数里都可以用,如while中
    int num;
    while (cin >> str)
    {
        cin >> num;
        string sub;//sub是while这个花括号中的变量,在括号外面不能用
        int len = str.length();
        if (num <= len)
        {
            if (str[num - 1] > 128)
            {
                --num;
            }
            sub = str.substr(0, num);
        }
        cout << sub << endl;        
    }
    return 0;
}

还有一种情况要注意,可以重复定义,比如在上面的代码中,我在while循环中定义一个string str是正确的,而且会覆盖main函数中的str,可以理解为我要搞个特殊的str用用。不理解的话我写段代码举个例子

#include <iostream>

int main()
{
    int a = 0;
    {
        int a = 1;
        cout << a;
    }
    cout << a << endl;
    return 0;
}

这段代码打印输出的分别是10,因为里面的a覆盖了外面的a。

#C++工程师#
全部评论
收藏了!
点赞 回复 分享
发布于 2016-11-29 11:46

相关推荐

评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务