一、C++基础
<iostream> 包含两个基础类型,istream-输入流和ostrea-输出流 。
标准库定义了四个IO对象 cin-标准输入(istream),cout-标准输出(o),cerr-标准错误(o),clog-用来输出程序运行时的一般性信息(o)。
#include <iostream> int main() { std::cout << "Enter" << std::endl; // (<<)输出运算符 左侧运算对象必须是ostream对象,右侧运算对象是要打印的值。 // 该运算是将给定的值 写到给定的ostream对象中。 // “Enter”是字符串字面值常量 int v1 = 0; std::cin >> v1; //(>>)输入运算符 接受一个istream作为左侧运算对象,接受一个对象作为右侧运算对象,从给定的istream读入数据,并存入给定对象中。 return 0; }
- endl(操纵符):写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。 缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅仅停留在内存中等待写入流
- 前缀std:: 指出名字cout和endl是定义在名为std的命名空间中的。命名空间可以避免不经意的名字定义冲突,以及库中相同名字导致的冲突,标准库定义的所有名字都在命名空间std中。(通过命名空间使用标准库有一个副作用:当使用标准库中的一个名字时,必须显式说明想使用来自命名空间std中的名字,如:std::cout ,通过使用作用域运算符 (::)来指出我们想使用定义在命名空间std中的名字cout。)
二、基本类型
- 大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为"字节"(byte),存储的基本单元称为“字”。字由字节组成。
- 带符号类型和无符号类型:除去布尔型和扩展的字符型之外,其他整型可以划分为带符号(signed)和无符号(unsigned)两种。带符号可以表示正数、负数或0,无符号只能表示大于等于0的值。
- 当赋给无符号类型一个超出他表示范围的数,结果是初始值对无符号类型标识数值总数取模后的余数。
- 当赋给符号类型一个超出他表示范围的值时,结果是未定义的,程序可能继续工作,可能崩溃,也可能生成垃圾数据。
#include <iostream> int main() { unsigned char c=-1; //char占8比特,8比特unsigned char可以表示0~255区间内的值,-1不在区间内,实际结果是对2^8取模后的余数 -1%256=255; signed char c1=256; //signed char 理论上-127~127 大多数现代计算机的实际表示范围定在-128~127 std::cout<<(int)c<<std::endl;(255) std::cout<<c1<<std::endl;(空) return 0; }
- 含有无符号类型的表达式
- 当一个算数表达式中既有无符号数又有int值时,int值会转换成无符号数。(表达式中既有带符号类型 ,又有无符号类型,带符号数会自动转换成无符号数)
#include <iostream> int main() { unsigned u = 10, u2 = 42; std::cout << u2 - u << std::endl;//32 std::cout << u - u2 << std::endl;//4294967264 (2^32-32) //当从无符号数中减去一个值时,不管这个数是不是无符号数,都必须保证结果不能是一个负值 std::cout << std::endl; int i = 10, i2 = 42; std::cout << i2 - i << std::endl;//32 std::cout << i - i2 << std::endl;//-32 std::cout << i - u << std::endl;//0 std::cout << u - i << std::endl;//0 }
- 字面值常量:
- 整形字面值可以写成十进制数,八进制数,或者十六进制数。 以0开头的整数代表八进制数,以0x或者0X开头的代表十六进制数。
20/*十进制*/ 、024/*八进制*/ 、 0x14/*十六进制*/
- 浮点型字面值表现为一个小数或者以科学计数法表示的指数,其中指数部分用E或e标识。 (默认的,浮点型字面值是一个double)
- 字符和字符串字面值
- 转义序列:当遇到不可打印的字符,如退格或者其他控制字符(因为他们没有可视字符),或者在c++中有特殊含义的字符(单引号,双引号,问号,反斜线),这些情况下都要用到转义序列。(转义序列均以反斜线作为开始)。 除了规定的转义序列外还有泛化的转义序列,其形式是\x后紧跟一个或多个十六进制数字,或者\后紧跟着1个,2个或者三个八进制数字,其中数字部分表示的是字符对应的数值。(如果反斜线后面跟着的八进制数字超过3个,只有前3个数字与 \ 构成转义序列,相反, \x 要用到后面跟着的所有数字)。一般来说,超过8位的十六进制字符都以表2.2中某个前缀作为开头的扩展字符集一起使用。
- 指定字面值类型
三、变量
对象: 对象是具有某种数据类型的内存空间。
变量:变量提供一个具名的可供程序操作的存储空间。
- 列表初始化:
C++定义了好几种初始化的不同形式
当用于内置类型的变量是,列表初始化形式有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,编译器将报错。(如 double ld = 3.14; int a{ld} ,b = {ld}; 都会报错,因为存在丢失风险,小数部分会丢失);
- 变量声明和定义的关系
声明:声明使得名字为程序所致,一个文件如果想使用别处定义的名字则必须包含对哪个名字的声明。
定义:负责创建与名字关联的实体。
变量声明规定了变量的类型和名字,在这一点上定义与之相同,除此之外,定义还可以申请存储空间,也可能会为变量赋一个初值。如果想声明一个变量而非定义它,就在变量名前加关键字extern,而且不要显式的初始化变量)任何包含显式初始化的声明就成为定义,extern语句如果包含初始值就不再是声明,而是定义。
extern int ix = 1024; 定义
int iy ;定义
extern int iy; 声明
- 标识符
C++标识符必须以字母或者下画线开头,用户自定义的标识符中不能出现连续两个下画线,也不能以下画线紧连大写字母开头,定义在函数体外的标识符不能以下画线开头。
- 名字的作用域
嵌套作用域:作用域能彼此包含,被包含(或者说被嵌套)的作用域成为内层作用域,包含着别的作用域成为外层作用域。
作用域一旦声明了某个名字,它所嵌套的所有作用域中都能访问改名字,同时,允许在内层作用域中重新定义外层作用域已有的名字。
#include <iostream> int reused = 42;// 全局作用域 int main() { int unique = 0;//块作用域 std::cout << reused << ' ' << unique << std::endl;// 42 0 int reused = 0; std:: cout << reused << ' '<< unique << std::endl;// 0 0 std:: cout << ::reused << ' '<< unique << std::endl;// 42 0 //显式的访问全局变量reused ;输出42 0 return 0; }
第二条输出发生在局部变量reused定义之后,此时局部变量reused 正在作用域内,因此输出局部变量而非全局变量。
第三条输出使用作用域操作符 (::)来覆盖默认的作用域规则,全局作用域本身没有名字,所以当作用域操作符左侧为空,向全局作用域发出请求获取作用域操作符右侧名字对应的变量。
- 复合类型(引用和指针)
- 引用
- 引用为对象起了另外一个名字,通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。(引用必须被初始化)
- 在初始化变量时,初始值会被拷贝到新建对象中。 然而定义引用时,程序会把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。(引用并非对象,这是为已经存在的对象所起的另外一个名字)
- 除了另外两种情况 (第一种就是只要该表达式的结果能转换成引用的类型即可,尤其,允许为一个常量引用绑定的非常量的对象,字面值,甚至是一个一般表达式)其他所有有引用的类型都要和与之绑定的对象严格匹配,而且引用之呢个绑定在对象上,而不能与字面值或者某个表达式的计算结果绑定在一起。
标签:std,定义,二章,作用域,C++,int,名字,引用,Primer From: https://www.cnblogs.com/Ranr-/p/17441702.html