首页 > 代码库 > C++primer第二章 变量和基本类型
C++primer第二章 变量和基本类型
类型是程序的基础。类型告诉我们数据代表什么意思以及可以对数据执行那些操作。
C++语言定义的几种类型:
- 字符型
- 整型
- 浮点型
还支持自定义数据类型
数据类型确定了数据和操作在程序中的意义
i=i+j;
- int:5=2+3;
- string:hello world = hello + world;
2.1.基本内置类型
计算:整型或者浮点型 用来存储数值
语句说明:字符串或者string类型 存储语句
判断条件:bool类型 存储真值
2.1.2. 整型
整数、字符和布尔值的算术类型合成为整型。与浮点型相对。
字符型:char和wchar_t。
整数:short、int和long 区别:存储空间大小不一样。用途也不一样
内置类型的机器级表示
C++内置类型与其在计算机中存储器中表示的方式紧密相关。计算机以位序列存储,每一位是0或1.
如上图,字节与地址对应
带符号和无符号类型
除了bool类型外,类型可以是带符号(signed)的也可以是无符号(unsigned)的。
整数值的表示
无符号型中,所有的位都表示数值。比如unsigned表示0~255
有符号性中,其中一位作为符号位,-128~127
整型的赋值
编译器会对关系不对应的数值取模后赋值。
unsigned char 0~255
将256赋值给unsigned char
将-1赋值给unsigned char
2.1.2. 浮点型
类型 float、double和long double 单精度、双精度和扩展精度浮点数
float:6位有效数字
double:10位有效数字
2.2. 字面值常量
42、 3.1415926 固定数值的数为字面值常量
只有内置类型有字面值常量
- 十进制
- 八进制 0开头
- 十六进制 0x开头
字面值常量规则: 在数值后边可以加修饰,比如3.14f .001f 12.345L 3.1415E0f
浮点型字面值常量(不加修饰)默认为double类型
布尔字面值和字符字面值
true 和 false 是布尔型的字面值
‘a’ ‘2’。。。是字符字面值 注意与 1 2 3 整型 区别
非打印字符的转义序列
字符串字面值
“hello world”
注意“A” 与‘A’的区别:“A”是字符串,字符串不仅包括一个字符,需要一个特殊的标示,标记字符串的结尾,‘\0’
‘A’只是一个简单的字符
字符串字面值的连接
1 std:cout << "a multi-line"2 " string literal"3 " using concatenation"4 << std::endl;
这条语句输出:a mutitude-line string literal using concatenation
1 std::cout << "multi-line"L "literal" << std::endl;
这是未定义的,输出不一定
多行字面值
在一行的末尾加一反斜线符号可将此行和下一行当做同一行处理。
1 std::cou2 t<<"Hello " << st3 d::endl;
注意:反斜线符号必须是该行的尾字符----不允许有注释或空格。
变量
计算2^10
1 #include<iostream>2 int main()3 {4 std::cout << "2 raised to the power of 10: ";5 std::cout << 2*2*2*2*2*2*2*2*2*2;6 std::cout << std::endl;7 return 0; 8 }
假如计算 2^30?
#include <iostream>int main(){ int value = http://www.mamicode.com/2; int pow = 10; int result = 1; for(int cnt = 0;cnt != pow;++cnt) { std::cout << value << " raised to the power of " << pow << ": \t" <<result << std::endl;
}
return 0;}
2.3.1. 什么是变量
变量提供了程序可以操作的有名字的存储区。每一个变量都有特定的类型。
表达式分为:左值和右值
左值:赋值语句的左边或右边。
右值:只能出现在赋值的右边。
2.3.2. 变量名
变量名,即变量的标示符,可以由字母、数字和下划线组成。
必须是以字母或下划线开头,并区分大小写
变量名的习惯:
- 变量名一般用小写字母
- 标示符应使用能够帮助记忆的名字
- 包含多个词的标示符在每个词之间添加一个下划线或者每个词的首字母大写。
2.3.3. 定义对象
1 int unit_sold;2 3 double sales_price,avg_price;4 5 std::string title;6 7 Sales_item curr_book;
每个定义都是以类型说明符开始,后边紧跟着以逗号分开的一个或多个说明符列表。分号结束。
初始化
两种形式:复制初始化和直接初始化
int ival(1024); //直接初始化int ival = 1024; //复制初始化
2.3.4. 变量初始化规则
当定义的变量没有初始化时,系统有时候会帮我们初始化,取决于变量的类型和变量的位置。
内置类型变量的初始化
取决于位置。
在函数体外定义的变量都初始化为0,在函数体内部定义的变量不进行初始化。
类类型变量的初始化
每个类都定义了该类的对象可以怎么初始化。类通过定义一个或多个构造函数来控制类对象的初始化。
如果定义某个类的变量时没有提供初始化式,这个类也可以初始化,默认构造函数。
2.3.5. 声明和定义
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。
声明用于向程序表明变量的类型和名字。
2.3.6.名字的作用域
C++程序中,每个名字都与唯一的实体相关联。大多数作用域是用花括号来界定的。
1 #include <iosteram> 2 int main() 3 { 4 int sum = 0; 5 for(int val = 1;val <= 10;++val) 6 sum+= val; 7 std::cout << "Sum of 1 to 10 inclusive is" 8 << sum << std::endl; 9 return 0;10 }
全局作用域:定义在所有函数外部的名字
局部作用域:定义在或括号内部。
C++ 中作用域可嵌套
#include <iostream>#include <string>/* Program for illustration purposes only:* It is bad style for a function to use a global variable and then* define a local variable with the same name*/std::string s1 = "hello"; // s1 has global scopeint main(){std::string s2 = "world"; // s2 has local scope// uses global s1; prints "hello world"std::cout << s1 << " " << s2 << std::endl;int s1 = 42; // s1 is local and hides global s1// uses local s1;prints "42 world"std::cout << s1 << " " << s2 << std::endl;return 0;}
2.3.7. 在变量使用处定义变量
一般来说,变量的定义或声明可以放在程序中能摆放语句的任何位置。变量在使用前必须先声明或定义。
通常把一个对象定义在它首次使用的地方是一个很好的办法。
2.4. const 限定符
for (int index = 0; index != 512; ++index) {// ...}
改进后
int bufSize = 512; // input buffer sizefor (int index = 0; index != bufSize; ++index) {// ...}
定义一个变量代表某一常数的方法仍然有一个严重的问题。即 bufSize 是可以被修改的。bufSize 可能被有意或无意地修改。const 限定符提供了一个解决办法,它把一个对象转换成一个常量。
const int bufSize = 512; // input buffer size
2.5. 引用
引用就是对象的另一个名字。在实际程序中,引用主要用作函数的形式参数。
int ival = 1024;int &refVal = ival; // ok: refVal refers to ivalint &refVal2; // error: a reference must be initializedint &refVal3 = 10; // error: initializer must be an object
2.6. typedef 名字
typedef 可以用来定义类型的同义词:
typedef double wages; // wages is a synonym for doubletypedef int exam_score; // exam_score is a synonym for inttypedef wages salary; // indirect synonym for double
typedef 通常被用于以下三种目的:
• 为了隐藏特定类型的实现,强调使用类型的目的。
• 简化复杂的类型定义,使其更易理解。
• 允许一种类型用于多个目的,同时使得每次使用该类型的目的明确
2.7. 枚举
我们经常需要为某些属性定义一组可选择的值。例如,文件打开的状态可能会有三种:输入、输出和追加。记录这些状态值的一种方法是使每种状态都与一个唯一的常数值相关联。我们可能会这样编写代码:
const int input = 0;
const int output = 1;
const int append = 2;
虽然这种方法也能奏效,但是它有个明显的缺点:没有指出这些值是相关联的。枚举提供了一种替代的方法,不但定义了整数常量集,而且还把它们聚集成组。
定义和初始化枚举
// input is 0, output is 1, and append is 2enum open_modes {input, output, append};
2.8. 类类型
2.9. 编写自己的头文件
一般类定义都会放入头文件。为了允许把程序分成独立的逻辑块,C++ 支持所谓的分别编译。这样程序可以由多个文件组成
2.9.1. 设计自己的头文件
头文件一般包含类的定义、extern 变量的声明和函数的声明
头文件的正确使用能够带来两个好处:保证所有文件使用给定实体的同一声明;当声明需要修改时,只有头文件需要更新。
头文件用于声明而不是用于定义
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。
2.9.2. 预处理器的简单介绍
避免多重包含
#ifndef SALESITEM_H#define SALESITEM_H// Definition of Sales_itemclass and related functions goes here#endif
使用自定义的头文件
#include 指示接受以下两种形式:
#include <standard_header>
#include "my_file.h"
如果头文件名括在尖括号(< >)里,那么认为该头文件是标准头文件。编译器将会在预定义的位置集查找该头文件,这些预定义的位置可以通过设置查找路径环境变量或者通过命令行选项来修改。使用的查找方法因编译器的不同而差别迥异。如果头文件名括在一对引号里,那么认为它是非系统头文件,非系统头文件的查找通常开始于源文件所在的路径。
C++primer第二章 变量和基本类型