C++ Primer 学习笔记_3_变量和基本类型



变量和基本类型

引言:

1、各种程序设计语言都具有许多各具特色的特征,这些特征决定了用每种语言适合开发哪些类型的应用程序。

2、大多数现代现代程序设计语言都采用两种方式扩充语言的基本特征集:允许程序员通过自定义数据类型扩充该语言;提供一组库例程,这些例程定义了一些并非内置在语言中的实用函数和数据类型。

3、C++是静态类型语言,支持在编译时执行类型检查。

4、包括C++在内的其他语言允许程序员定义的类型不仅有数据还包含操作!

5、掌握C++的第一步就是学习语言的基本知识和标准库!

6、类型可以告诉我们:数据代表什么意思;可以对数据执行哪些操作。

正文:

一、基本内置类型

1、算术类型的存储空间大小依机器而定。

2、wchar_t类型用于扩展字符集,如汉字,日文等。

3、 1字节=8位

1B = 8bit

1字/word= 32b/4B

P31的《内置类型和机器级表示》非常重要,值得细读!

一般的,short类型为半个机器字长,int为一个机器字长,而long为2个机器字长(在32位操作系统中int与long通常字长是相同的!)

4、虽然char有三种不同的类型,但是只有两种表示方式。

5、一般,float类型用一个字长表示,double用两个字长表示,而long
double要用三个或四个字长来表示。

类型的取值范围决定了浮点数所含的有效数字位数。如果没有特殊要求,一般推荐使用double!

6、P33《建议:使用内置算术类型》值得一读!

二、字面值常量

只有内置类型存在字面值,没有类类型的字面值!

1、在char类型字面值前面加L就得到了wchar_t类型的宽字符字面值,如:

wchar_t A = L‘A‘;

2、转义字符可以通过‘\‘符号来表示,如:

\ooo             三个八进制数字表示字符的数字值

\xddd           十六进制数字表示字符的数字值

3、字符串字面值连接

[cpp] view plaincopyprint?

  1. //正确:
  2. std::cout << "A multi-line "
  3. "string literal "
  4. "using concatenation"
  5. << std::endl;
  6. std::cout << "Who goes with F\145rgus?\012"
  7. << std::endl;
  8. //错误:
  9. std::cout << "A multi-line " L "string literal " "using concatenation" << std::endl;
  10. std::cout << 3.14UL << std::endl;
//正确:
std::cout << "A multi-line "
              "string literal "
              "using concatenation"
              << std::endl;
std::cout << "Who goes with F\145rgus?\012"
            << std::endl;
//错误:
std::cout << "A multi-line " L "string literal " "using concatenation" << std::endl;
std::cout << 3.14UL << std::endl;

4、多行字面值

[cpp] view plaincopyprint?

  1. std::cout << "A multi-line " "string \
  2. literal " "using concatenation"
  3. << std::endl;
std::cout << "A multi-line " "string literal " "using concatenation"
          << std::endl;

P37

[cpp] view plaincopyprint?

  1. //习题2.10
  2. #include <iostream>
  3. int main()
  4. {
  5. std::cout << "\062\115\n"
  6. << "\062\t\115\n"
  7. << std::endl;
  8. return 0;
  9. }
//习题2.10
#include <iostream>

int main()
{
    std::cout << "\062\115\n"
              << "\062\t\115\n"
              << std::endl;
    return 0;
}

三、变量

P38

[cpp] view plaincopyprint?

  1. //习题2.11
  2. #include <iostream>
  3. int main()
  4. {
  5. std::cout << "Please input the base and the exponent:" << std::endl;
  6. int base,exponent;
  7. std::cin >> base >> exponent;
  8. int result = 1;
  9. for (int i = 0;i < exponent; ++i)
  10. {
  11. result *= base;
  12. }
  13. std::cout << result << std::endl;
  14. return 0;
  15. }
//习题2.11
#include <iostream>

int main()
{
	std::cout << "Please input the base and the exponent:" << std::endl;
	int base,exponent;
	std::cin >> base >> exponent;

	int result = 1;
	for (int i = 0;i < exponent; ++i)
	{
		result *= base;
	}
	std::cout << result << std::endl;

    return 0;
}

1、C++是一门静态类型语言,在编译时会作类型检查;静态类型检查机制能够帮助我们更早的发现错误。

2、变量提供了程序可以操作的有名字的存储区。变量的类型决定了变量的内存大小和布局,能够存储在该内存中的值的取值范围以及可应用在该变量上的操作集。

3、什么是对象:对象就是内存中具有类型的区域。(P40)

4、标识符不能包含两个连续的下划线,也不能以下划线开头后跟一个大写字母。

5、变量命名习惯:

1)变量名一般小写。

2)标识符应使用帮助记忆的名字。

3)包含多个词的标识符书写在每个词之间添加一个下划线。

4)命名习惯最重要的是保持一致!

P41

[cpp] view plaincopyprint?

  1. //习题2.14
  2. char _;         //错误
  3. bool catch-22;      //错误
  4. char 1_or_2 = ‘1‘;  //错误
  5. float Float = 3.14; //正确
//习题2.14
char _;			//错误
bool catch-22;		//错误
char 1_or_2 = '1';	//错误
float Float = 3.14;	//正确

6、定义对象

[cpp] view plaincopyprint?

  1. //可以以逗号分开的含有一个或者多个说明符列表
  2. //类型决定了分配给变量的存储空间大小和可以在其上执行的操作集合。
  3. double sales_price,avg_price;
	//可以以逗号分开的含有一个或者多个说明符列表
	//类型决定了分配给变量的存储空间大小和可以在其上执行的操作集合。
	double sales_price,avg_price;

1)初始化

C++支持两种格式的初始化:

a.复制初始化:int ival = 1024; //有多个初始化式时不能使用复制初始化!

b.直接初始化:int ival(1024); //直接初始化的方法更灵活且效率更高

【在C++中:初始化并不就是赋值:初始化是创建变量并给他赋值,赋值是擦除对象的当前值并且用新值代替】

2)初始化多个变量:

正确:double salary = 9999.99,wage(salary + 0.01);

P44

[cpp] view plaincopyprint?

  1. //习题2.15
  2. //该语句是错误的,既然指定mouth,day用八进制来初始化,就不要用数字‘9‘
  3. int mouth = 09,day = 07;
  4. //习题2.16
  5. //该语句正确
  6. double wage = 10;
  7. double salary = wage = 15;
//习题2.15
//该语句是错误的,既然指定mouth,day用八进制来初始化,就不要用数字'9'
int mouth = 09,day = 07;

//习题2.16
//该语句正确
double wage = 10;
double salary = wage = 15;

3)变量初始化规则

a.内置类型的变量是否初始化取决于变量定义的位置:在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。

【但是,未初始化的变量事实上都有一个值】

建议:每个内置类型的对象都要初始化。

b.类通过定义一个或多个构造函数来控制类对象的初始化。如果一个类有默认构造函数,则无论变量在哪儿定义,默认构造函数都会被调用。

4)声明和定义

C++通过extern关键字声明,向程序表明变量的类型和名字。因为extern是声明,所以不分配存储空间。

一个变量可以声明多次,但只能定义一次

如果声明有初始化式,那么它可以被当作是定义,即使有声明标记extern,如:

[cpp] view plaincopyprint?

  1. extern double PI = 3.14;    //只有当extern声明位于函数外部时,才可以含有初始化式,但是有些编译器还是不能通过编译。
extern double PI = 3.14;	//只有当extern声明位于函数外部时,才可以含有初始化式,但是有些编译器还是不能通过编译。

5)名字的作用域

大多数的作用域是通过花括号来定界的。

C++作用域可嵌套:

[cpp] view plaincopyprint?

  1. //在函数内定义一个与函数可能会用到的全局变量同名的局部变量总是不好的,局部变量最好使用不同的名字!
  2. #include <iostream>
  3. #include <string>
  4. std::string s1 = "hello";  // s1 has global scope
  5. int main()
  6. {
  7. std::string s2 = "world"; // s2 has local scope
  8. // uses global s1; prints ``hello world‘‘
  9. std::cout << s1 << " " << s2 << std::endl;
  10. //int类型的s1将屏蔽掉std::string类型的s1
  11. int s1 = 42; // s1 is local and hides global s1
  12. // uses local s1; prints ``42 world‘‘
  13. std::cout << s1 << " " <<  s2 << std::endl;
  14. return 0;
  15. }
//在函数内定义一个与函数可能会用到的全局变量同名的局部变量总是不好的,局部变量最好使用不同的名字!
#include <iostream>
#include <string> 

std::string s1 = "hello";  // s1 has global scope 

int main()
{
	std::string s2 = "world"; // s2 has local scope 

	// uses global s1; prints ``hello world''
	std::cout << s1 << " " << s2 << std::endl;   

	//int类型的s1将屏蔽掉std::string类型的s1
	int s1 = 42; // s1 is local and hides global s1 

	// uses local s1; prints ``42 world''
	std::cout << s1 << " " <<  s2 << std::endl;
	return 0;
}

6)在便零使用处定义变量

通常把一个对象定义在他首次使用的地方是一个很好的方法!

P48

[cpp] view plaincopyprint?

  1. //习题2.20下列程序会输出什么?
  2. #include <iostream>
  3. int main()
  4. {
  5. int i = 100,sum = 0;
  6. for (int i = 0;i != 10; ++i)
  7. {
  8. sum += i;
  9. }
  10. std::cout << "i = " << i << ", sum = " << sum << std::endl;
  11. return 0;
  12. }
  13. //答案:i = 100, sum = 45
时间: 2024-11-05 22:55:07

C++ Primer 学习笔记_3_变量和基本类型的相关文章

C++ Primer 学习笔记_5_变量和基本类型(续2)

 变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: [cpp] view plaincopyprint? enum {input, output, append}; const int input = 0; const int output = 1; const int append = 2; enum {input, output, append}; const int input = 0;

C++ Primer 学习笔记_4_变量和基本类型(续1)

 变量和基本类型 四.const限定符 [cpp] view plaincopyprint? #include <iostream> int main() { //for循环语句存在两个问题 for (int index = 0;index != 512; ++index) { //... } return 0; } /* *1.程序的可读性:存在魔数512[魔数:他的意义在上下文中并没有体现出来,好像这个数是魔术般变出来的] *2.程序的可维护性... */ #include <i

02.第二章_C++ Primer学习笔记_变量和基本类型

2.1  基本内置类型 2.1.1  算术类型 算术类型包括两类:整型和浮点型 2.2  变量 2.3  复合类型 2.4  const限定符 2.5  处理类型 2.6  自定义数据结构

C++ Primer(第五版)学习笔记_3_标准模板库vector(2)

C++ Primer(第五版)学习笔记_3_标准模板库vector(2) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 6.元素的插入 insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置. 要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标. #include <iostream> #include <vector> using namespa

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++ Primer 学习笔记_106_特殊工具与技术 --局部类

特殊工具与技术 --局部类 可以在函数体内部定义类,这样的类称为局部类.一个局部类定义了一个类型,该类型只在定义它的局部作用域中可见.与嵌套类不同,局部类的成员是严格受限的. 局部类的所有成员(包括函数)必须完全定义在类定义体内部,因此,局部类远不如嵌套类有用. 实际上,成员完全定义在类中的要求限制了局部类成员函数的复杂性.局部类中的函数很少超过数行代码,超过的话,阅读者会难以理解代码. 类似地,不允许局部类声明 static 数据成员,没有办法定义它们. 1.局部类不能使用函数作用域中的变量

C++ Primer 学习笔记_107_特殊工具与技术 --固有的不可移植的特征[上]

特殊工具与技术 --固有的不可移植的特征[上] C++从 C 语言继承来的不可移植特征:位域和 volatile 限定符.这些特征可使与硬件接口的直接通信更容易. C++ 还增加了另一个不可移植特征(从 C 语言继承来的):链接指示,它使得可以链接到用其他语言编写的程序. 一.位域 可以声明一种特殊的类数据成员,称为位域,来保存特定的位数.当程序需要将二进制数据传递给另一程序或硬件设备的时候,通常使用位域. 位域在内存中的布局是机器相关的. 位域必须是整型数据类型,可以是 signed 或 un

C++Primer学习笔记《三》

数组名其实就是一个常指针,指向数组元素中第一个的地址,在程序中如果要用指针遍历数组,不能直接用数组名来自增或自减,因为它是常量,一般先把数组名保存一份同类型的指针,然后再用这个指针来自增或是自减来实现遍历. 指针也是可以进行算术加法和减法的,但必须保证原地址和结果地址都是想同一个数组的元素或是指向数组的末端元素的下一个单元(类似end()). 指针的减法操作是有意义的,它表示两个指针的相对位置关系,减法结果是ptrdiff_t类型,和size_t类型一样,是一种机器相关的类型,size_t是无符

C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承

面向对象编程 --转换与继承.复制控制与继承 I.转换与继承 引言: 由于每一个派生类对象都包括一个基类部分,因此能够像使用基类对象一样在派生类对象上执行操作. 对于指针/引用,能够将派生类对象的指针/引用转换为基类子对象的指针/引用. 基类类型对象既能够作为独立对象存在,也能够作为派生类对象的一部分而存在,因此,一个基类对象可能是也可能不是一个派生类对象的部分,因此,没有从基类引用(或基类指针)到派生类引用(或派生类指针)的(自己主动)转换. 关于对象类型,尽管一般能够使用派生类型的对象对基类