C++ Primer Plus学习笔记
作者:互联网
C++ Primer Plus
第1章 预备知识
区分扩展名
-
C++程序使用.C或者.cpp作为扩展名,C程序使用.c作为扩展名
-
对于某些UINX系统,也可使用扩展名cc和cxx
-
DOS不区分大小写
源代码文件的扩展名
C++实现 | 源代码文件的扩展名 |
---|---|
UNIX | C、cc、cxx、c |
GNU C++ | C、cc、cxx、cpp、c++ |
Digital Mars | cpp、cxx |
Borland C++ | cpp |
Watcom | cpp |
Microsoft Visual C++ | cpp、cxx、cc |
Freestyle Code Warrior | cp、 cpp、 cc、cxx、c++ |
第2章 开始学习C++
1、C++语句
- 语句是要执行的操作
- C与C++使用终止符(terminator)而不是分隔符
- 终止符是一个分号(;)符,他是语句结束的标志,是语句的组成部分
- 声明语句:定义函数中使用的变量的名称和类型。
- 赋值语句:使用赋值运算符(=)给变量赋值。
- 消息语句:将消息发送给对象,激发某种行动。
- 函数调用:执行函数。被调用的函数执行完毕后,程序返回到函数调用语句后面的语句。
- 函数原型:声明函数的返回类型、函数接受的参数数量和类型。
- 返回语句:将一个值从被调用的函数那里返回到调用函数中。
2、C++注释
- C++注释以//打头,到行尾结束
- C++也能识别C的注释/**/
- 尽量使用C++风格注释
3、C++源代码风格
- 每条语句占一行
- 每个函数都有一个开始花括号和一个结束花括号,这两个花括号各占一行。
- 函数中的语句都相对于花括号进行缩进。
- 与函数名称相关的圆括号周围没有空白。
4、命名约定
有以下几种
- Myfunction( )
- myfunction( )
- myFunction( )
- my_function( )
- my_funct( )
选择取决于开发团体、使用的技术或库以及程序员个人的品位和喜好。
第3章 处理数据
1、变量名命名规则
- 在名称中只能使用字母字符、数字和下划线(_)。
- 名称的第一个字符不能是数字。
- 区分大写字符与小写字符。不能将C++关键字用作名称。
- 以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给实现,用作全局标识符。
- C++对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。
2、变量长度
-
bool,
-
short(short为short int的简称)至少16位(bit),两个字节(bytes),表示范围-3276832767*,*(*即*-2^152^15-1);
-
w_char(宽字符类型),可以表示扩展字符集,是一种整数类型,长度不确定
-
char,1byte=8bit;表示范围不确定,默认情况下无符号,是否有符号有C++实现决定
- signed char,表示范围-128~127
char fodo;//可能有符号,可能没符号 unsigned char bar;//无符号 signed char snark;//有符号
-
C++11新增类型
- char16_t:无符号,长16位
- char32_t:无符号,长32位
- C++11使用前缀u表示u表示char16_t字符串常量和字符常量,如:u'C'和u"be good";前缀U表示char32_t字符串常量和字符常量,如:U'C'和U"be good"
- 与wchar_t一样,char16_t和 char32_t也都有底层类型——一种内置的整型,但底层类型可能随系统而已。
-
int被设置为对目标计算机而言最为“自然”的长度,自然长度(natural size)指的是计算机处理起来效率最高的长度。int至少与short一样长,4byte=32bit,所能表示范围:-21474836482147483647*;*(*即*-2^312^31-1);
-
long(long为long int的简称)至少32位,且至少与int一样长,4byte=32bit,所能表示范围:-21474836482147483647*;*(*即*-2^312^31-1);
-
long long 至少64位,且至少与long一样长。
-
float,至少32位,指数范围至少是-37到37
-
double,至少48位,且不少于float,指数范围至少是-37到37
-
long double,位80、96或128位,指数范围至少是-37到37
可以从头文件cfloat或float.h中找到系统的限制。
注:wchar_t类型是一种整数类型,它有足够的空间,可以表示系统使用的最大扩展字符集。这种类型与另一种整型(底层(underlying)类型)的长度和符号属性相同。对底层类型的选择取决于实现,因此在一个系统中,它可能是unsigned short,而在另一个系统中,则可能是int。cin和 cout将输入和输出看作是char流,因此不适于用来处理 wchar_t类型。iostream头文件的最新版本提供了作用相似的工具——wcin和 wcout,可用于处理 wchar_t流。另外,可以通过加上前缀L来指示宽字符常量和宽字符串。
3、运算符sizeof
可对类型名或变量名使用sizeof运算符。
- 对类型名(如 int)使用sizeof运算符时,应将名称放在括号内;
- 对变量名(如n_short)使用该运算符,括号是可选的。
cout << "int is" << sizeof(int) << " bytes.\n";
cout << "short is " << sizeof n_short << " bytes.\n";
4、头文件limits
头文件climits 定义了符号常量来表示类型的限制。INT_MAX表示类型 int能够存储的最大值,对于Windows 7系统,为2147483 647。编译器厂商提供了climits文件,该文件指出了其编译器中的值。例如,在使用16位int 的老系统中,climits文件将INT_MAX定义为32767。下表对该文件中定义的符号常量进行了总结,其中的一些符号常量与还没有介绍过的类型相关。
符号常量 | 表示 |
---|---|
CHAR_BIT | char的位数 |
CHAR_MAX | char的最大值 |
CHAR_MIN | char的最小值 |
SCHAR_MAX | signed char的最大值 |
SCHAR_MIN | signed char的最小值 |
UCHAR_MAX | unsigned char的最大值 |
SHRT_MAX | short的最大值 |
SHRT_MIN | short的最小值 |
USHRT_MAX | unsigned short的最大值 |
INT_MAX | int的最大值 |
INT_MIN | int的最小值 |
UNIT_MAX | unsigned int的最大值 |
LONG_MAX | long的最大值 |
LONG_MIN | long的最小值 |
ULONG_MAX | unsigned long的最大值 |
LLONG_MAX | long long的最大值 |
LLONG_MIN | long long 的最小值 |
ULLONG_MAX | unsigned long long的最大值 |
5、C++11初始化方式
C++11使得大括号初始化器用于任何类型(可以使用等号,也可以不使用),这是一种通用的初始化语法。
int hamburgers = {24};//初始化方式一
int emus{7};//初始化方式二
int rheas = 12;//初始化方式三
6、无符号类型
-
unsigned char:所占内存大小:1byte=8bit;所能表示范围:0255*;*(02^8-1)
-
unsigned(unsigned int):所占内存大小:4byte=32bit; 能表示范围:04294967295*;*(*即*02^32-1)
-
unsigned long: 所占内存大小:4byte=32bit;所能表示范围:04294967295*;*(*即*02^32-1)
7、整型字面值
-
十进制
int chest = 10;
-
八进制:前缀为0
int inseam = 042;
-
十六进制:前缀为0x或0X
int waist = 0x42;
-
如果要以十六进制或八进制方式显示值,则可以使用cout的一些特殊特性。控制字符dec、oct和hex分别用于指示cout以十进制、八进制和十六进制格式显示整数。
cout << dec; //表示cout显示十进制数 ...... cout << oct; //表示cout显示八进制数 ...... cout << hex; //表示cout显示十六进制数 ......
8、确定常量的类型
- long:后缀为L或l,如:100L
- unsigned int:后缀为U或u,如:100U
- unsigned long:后缀为UL(LU,lu,ul),如100ul
- long long:后缀为LL或ll,如100LL
- unsigned long long:后缀为ULL(LLU,llu,ull),如100ull
接下来考察长度。在C++中,对十进制整数采用的规则,与十六进制和八进制稍微有些不同。对于不带后缀的十进制整数,将使用下面几种类型中能够存储该数的最小类型来表示: int、long或long long。在 int 为 16位、long 为 32位的计算机系统上,20000被表示为 int 类型,40000被表示为long类型,3000000000被表示为long long类型。对于不带后缀的十六进制或八进制整数,将使用下面几种类型中能够存储该数的最小类型来表示:int、unsigned int long、unsigned long、long long或unsigned long long.在将40000表示为long 的计算机系统中,十六进制数Ox9C40 ( 40000)将被表示为unsigned int。这是因为十六进制常用来表示内存地址,而内存地址是没有符号的,因此,usigned int 比 long更适合用来表示16位的地址。
9、C++转义字符
字符名称 | ASCII符号 | C++代码 | 十进制ASCII码 | 十六进制ASCII码 |
---|---|---|---|---|
换行符 | NL (LF) | \n | 10 | 0xA |
水平制表符 | HT | \t | 9 | 0x9 |
垂直制表符 | VT | \v | 11 | 0xB |
退格 | BS | \b | 8 | 0x8 |
回车 | CR | \r | 13 | 0xD |
振铃 | BEL | \a | 7 | 0x7 |
反斜杠 | \ | \\ | 92 | 0x5C |
问号 | ? | ? | 63 | 0x3F |
单引号 | ' | \' | 39 | 0x27 |
双引号 | " | \" | 34 | 0x22 |
10、const限定符
创建常量的通用格式
const type name = value;//在C++中尽量用const取代#define
常量指针:const修饰指针,指针指向可以变,指针指向的值不可以变
const int * p = &a;
指针常量:const修饰的是常量,指针指向不可以变,指针指向的值可以变
int * const p = &a;
const即修饰指针又修饰常量:指针指向不可以变,指针指向的值也不可以变
const int * const p = &a;
11、浮点数的表示
12.34//float
2.52e+8//E的表示法,+可省略,E大小写皆可
-18.32e-13//E的表示法,-不可省略
1)定点表示法
ostream方法 setf(),迫使输出使用定点表示法,以便更好地了解精度,它防止程序把较大的值切换为E表示法,并使程序显示到小数点后6位。参数 ios_base:.fixed 和ios_base::floatfield是通过包含iostream来提供的常量。
#include<iostream>
int main ()
{
using namespace std;
cout.setf(ios_base::fixed, ios_base::floatfield);
//迫使cout输出使用定点表示法,并使程序显示到小数点后6位
......
return 0 ;
}
2)浮点常量
- float:后缀为f或F,如:1.2f
- double:默认浮点数都是double,如:8,24和2.4E8
- long double:后缀为l或L,如1.234L
12、除法分支
-
整数/整数=整数(小数部分省略)
-
double/double = double
-
double/int = double
-
int/double = double
-
double/double = double
-
float/float = float
13、求模运算
求模符号:%
规则:只能为整数,x(x>=n)与n求模,求模后取值为小于n的整数,如:
//与二求模
for(int i=1;i<=10;i++){
//TODO
cout << i << "%2 = " << i%2 << " ";//与2求模,求模后取值0,1,为小于2的整数
}
cout << endl;
//与三求模
for(int i=1;i<=10;i++){
//TODO
cout << i << "%3 = " << i%3 << " ";//与3求模,求模后取值0,1,2,为小于3的整数
}
cout << endl;
14、类型转换
转换规则
C++11对这个校验表稍做了修改,下面是C++11版本的校验表,编译器将依次查阅该列表:
- 如果有一个操作数的类型是long double,则将另一个操作数转换为long double。
- 否则,如果有一个操作数的类型是double,则将另一个操作数转换为double。
- 否则,如果有一个操作数的类型是float,则将另一个操作数转换为float。
- 否则,说明操作数都是整型,因此执行整型提升。
- 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
- 如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。
- 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
- 否则,将两个操作数都转换为有符号类型的无符号版本。
有符号整型按级别从高到低依次为long long、long、int、short和 signed char。无符号整型的排列顺序与有符号整型相同。类型char、signed char和unsigned char的级别相同。类型bool 的级别最低。wchar_t、char16_t和char32_t 的级别与其底层类型相同。
强制类型转换
(typeName) value;//方法一,C语言版
typeName (value);//方法二,C++版,新格式的想法是,要让强制类型转换就像是函数调用一样
//C++还引入了4个强制类型转换运算符,对它们的使用要求更为严格
statistic_cast<typeName> (value)
15、C++11中的auto声明
C++11新增了一个工具,让编译器能够根据初始值的类型推断变量的类型。为此,它重新定义了auto的含义。auto是一个C语言关键字,但很少使用。在初始化声明中,如果使用关键字auto,而不指定变量的类型,编译器将把变量的类型设置成与初始值相同:
auto n = 100;//n为int
auto x = 1.5;//x为double
auto y = 1.3e12L;//y为long double
显式地声明类型时,将变量初始化0(而不是0.0)不会导致任何问题,但采用自动类型推断时,这却会导致问题。
第4章 复合类型
1、数组
//声明数组
typeName arrayName[arraySize];
表达式arraySize 指定元素数目,它必须是整型常数(如10)或const值,也可以是常量表达式(如8*sizeof ( int)),即其中所有的值在编译时都是已知的。具体地说,arraySize不能是变量,变量的值是在程序运行时设置的。然而,本章稍后将介绍如何使用new运算符来避开这种限制。
未完待续。。。
标签:符号,int,double,long,Plus,C++,类型,Primer 来源: https://www.cnblogs.com/ExclusiveOR/p/16103547.html