C++ Primer学习笔记 - 8 - 基本内置类型 (三)

2.2.1节 变量定义

简单要点

  1. 初始化和赋值是具有不同意义的,初始化是创建变量是赋予其一个初始值,而赋值是把对象的当前值擦除而以一个新的值替代。
  2. 列表初始化的四种形式:
	int a = 0;
	int a = {0};
	int a{0};//经测试,在当前MAC中使用的版本中仍受限,括号初始化的方式可用
	int a(0);
  1. 定义变量时如果没指定初值 ,则变量被默认初始化,默认值是什么由具体类型决定。如果是内置类型,函数体外的变量被初始化为0,函数体内的变量不被初始化,它的值是未定义的。

练习

  1. 练习2.9 解释下列定义的含义。对于错误的定义请说明错误并改正。
std::cin >> int input_value; //cin语句不能定义变量,应该先定义input_value再使用cin赋值。
int i = {3.14}; //使用double类型的字面常量值对Int类型变量进行初始化,会导致丢失数据,编译器会报错。使用double类型或去除小数点即可。
double salary = wage = 9999.99; //wage变量未被定义,先将wage定义后再初始化或赋值即可
int i = 3.14 ;//这 与第二行是相同的意义,但是可以通过编译,i的值会被初始化为3.

  1. 练习2.10 下列变量的初始值分别是什么
std::string global_str; //函数体外的类型,由类型决定,string默认值为空字符串
int global_int;//函数体外的内置变量类型,默认值为0
int main()
{
	int local_int; //函数体内的内置变量类型,显示为未定义 -- 由于编译器或版本不同,可能会有一个初始值
	std::string loaal_str;//函数体内的内置变量类型,显示为未定义 -- 由于编译器或版本不同,可能会有一个初始值
}

使用如下代码进行验证:

#include <iostream>
using namespace std;
string globa_str;
int globa_int;
int main()
{
    int local_int;
    string local_str;
    cout << "全局int:" << globa_int<< endl;
    cout << "全局string:" << globa_str <<endl;
    cout << "局部int:" <<local_int<<endl;
    cout << "局部string:" <<local_str <<endl;
    cout << "空字符串:" << "" << endl;
}

输出结果为:

全局int:0
全局string:
局部int:0
局部string:
空字符串:

可以看到的是,int和string类型在函数内部也被初始化了,这可能是C++版本或编译器不同导致的,但是仍然要注意的是,定义一个变量的时候要记得初始化,不然可能造成不确定的后果。

2.2.2节 变量声明和定义的关系

主要概念

  1. 声明和定义在C++是分离的,声明使得名字为程序所知,定义负责创建与名字关联的实体。
  2. extern关键字用于标记声明,带有extern关键字的非显式定义不会定义一个变量,而仅仅标记一个变量名。
  3. 任何显示初始化都会定义一个变量,即使这个变量前有extern关键字,也会被定义。
  4. 变量只能被定义一次,但可以被多次声明。
  5. C++是静态类型(statically typed)语言,基含义是在编译阶段进行类型检查。

练习

练习2.11:下面的语句是声明还是定义 :

extern int ix = 1024; //显示初始化了变量ix,所以是定义
int iy; //没有extern关键字,变量会被初始化为0,所以也是定义 
extern int iz; //变量没有被显示初始化,所以仅是声明

2.2.3 标识符

主要概念

  1. C++标识符由下画线、大小写字母和数字组成,数字不能作为第一个字符。
  2. 标识符不能与保留字相同。
  3. 标识符不能出现两个相连的下画线,也不能以下画线紧接大写字母开头。 经验证,这两条无效,虽然少见,但可以通过编译。
  4. 标识符要注意俗成的用法和可读性。

练习

练习2.12 :指出下面的名字中哪些是非法的

int double = 3.14 ; //double作为标识符是非法 的,这与double类型冲突
int _; //仅使用下划线作为标识符也是非法的
int catch-22; //C++不支持使用-作为标识符
int 1_or_2 = 1; //数字不能作为标识符的开头
double Double = 3.14; //可以通过编译,但不符合一般的俗成约定

2.2.4节 名字的作用域

主要概念

  1. C++中所有定义都有作用域,作用域大多以花括号分隔。
  2. 根据可用范围,分为全局作用域(global scope)和块作用域(block scope)。
  3. 根据嵌套关系,分为内层作用域(inner scope)和外层作用域(outer scope)。
  4. 在嵌套关系中,允许在内层重定义同名变量。
  5. 建议在接近使用的位置再定义变量。

练习

  1. 练习2.13 :下面程序中j的值是多少?
int i = 42;
int main()
{
    int i = 100;
    int j = i;
}

答:因为i在内层重定义了,所以j的值为内层i的值,即100;

  1. 练习2.14 下面的程序合法吗?如果合法,它将输出什么 ?
    int i = 100, sum = 0;
    for (int i = 0; i != 10; ++i)
        sum += i;
    cout << i << " " << sum << endl;

答:由于i在循环中被重定义了,所以sum的值为从0累加到9,即45,而最后输出的i仍为原值,所以最后输出为:
100 45

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值