开始C++

运算符

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 杂项运算符

算术运算符

关系运算符(==  !=  >  <  <=  >=)

逻辑运算符(&&  ||  !)

位运算符

位运算符作用于位,并逐位执行操作。&(按位与) |(按位或) 和 ^(按位异或) 的真值表如下所示:

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

 

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100

B = 0000 1101

—————–

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

 

运算符 描述 实例
& 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 (A & B) 将得到 12,即为 0000 1100
| 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 (A | B) 将得到 61,即为 0011 1101
^ 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 (A ^ B) 将得到 49,即为 0011 0001
~ 二进制补码运算符,具有”翻转”位效果,即0变成1,1变成0。 (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<< 二进制左移运算符。左操作数的值向左移动右操作数指定位数。 A << 2 将得到 240,即为 1111 0000
>> 二进制右移运算符。左操作数的值向右移动右操作数指定位数。 A >> 2 将得到 15,即为 0000 1111

 

赋值运算符

运算符 描述 实例
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A
<<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2
>>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2
&= 按位与且赋值运算符 C &= 2 等同于 C = C & 2
^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2
|= 按位或且赋值运算符 C |= 2 等同于 C = C | 2

杂项运算符

运算符 描述
sizeof sizeof 运算符返回变量的大小。例如,sizeof(a) 将返回 4,其中 a 是整数。
Condition ? X : Y 条件运算符。如果 Condition 为真 ? 则值为 X : 否则值为 Y。
, 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。
.(点)和 ->(箭头) 成员运算符用于引用类、结构和共用体的成员。
Cast 强制转换运算符把一种数据类型转换为另一种数据类型。例如,int(2.2000) 将返回 2。
& 指针运算符 & 返回变量的地址。例如 &a; 将给出变量的实际地址。
* 指针运算符 * 指向一个变量。例如,*var; 将指向变量 var。

 

 

源文件代码扩展名:.cpp或.cc

头文件代码扩展名:.h或.hpp

命名空间:大项目有很多程序员,可能会对不同的变量使用相同的变量名,命名空间用来区分不同的开发人员的命名空间,而C++标准库的命名空间是std(难怪每个程序都会有一个using namespace std;

STL(标准模板库)是标准库的子集,其包含大量类模板。

编译原理:编译器将cpp文件转换为对象文件,再由链接程序把所以对象文件和库函数等库文件整合起来生成可执行文件。

十六进制数:加0x或0X

负的二进制数怎么表示?设置符号位:

符号位是最左边的那一位。十进制数-8:使用负数的2的补码形式化成二进制数为:11111000

八进制:当计算机内存用36位字来衡量的时候八进制数很有用,可以把36位的二进制指定为12个八进制数字。不过这是很久以前的事情了。前导加0

Big-Endian(最重要的8位存储在地址最高位)和Little-Endian系统(最重要的8位存储在地址最低位)。

通用字符集UCS,代码32位,提供超20亿不同代码值。

Unicode:是一个标准,定义了一组字符和代码点(与UCS)相同,代码点值从0到0X10ffff。,提供多个编码方式,最常用的编码是UTF-8和UTF-16。

C++源字符是什么?三字符序列呢?

转义序列

运行如下程序:

#include “stdafx.h”
#include <iostream>
using namespace std;
int main()
{
cout << “\”Least\’said\’\\\n\t\tsoonest\’mended\’.\”” << endl;
system(“pause”);
return 0;
}

得到结果:”Least’said’\
soonest’mended’.”

思考!

二.基本数据类型

整数类型字节数:signed char(1)short/short int(2)int(4)long/long int(4)long long/long long int(8)

无符号整型加unsigned关键字,long类型后缀L,longlong则LL。组合的如UL,LU

整型字面量:整数的本身,十六进制的整型字面量用来描述RGB颜色,如0XFFFFFF表示白色。

size of运算符:得到某个字节数。

static_cast<>静态显式强制类型转换。

使用字符变量

wchar_t:一种基本类型

char16_t:UTF16编码

char32_t:UTF32编码

标准库里还提供了标准输入输出流wcin和wcout,来读写用于wchar_t类型的字符。

auto关键字:告诉编译器应该推断其类型。

lvalue和rvalue:b=++a(lvalue)b=a++(rvalue)

三.处理基本数据类型

运算符的优先级和相关性(结合性)

按位运算符,移位运算符(<<和>>)

注意:按位移动带符号的整数:向右移负整数的位,除去符号位,空出来的位补1,正整数补0。
按位反:~

按位与:&(常用于选择整数中特定的一个位或一组位)和关闭位/掩码

按位异或:^(用于图形编程,异或绘图)0xff0000

按位或:|(常用于选择整数中特定的多个位或一组位)

枚举类型:

enum class Day{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};Monday到Sunday值0-6

enum class Day{Monday=1,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};Monday到Sunday值1-7

enum class punctuation:char{Comma=’,’,Exclamation=’!’,Question=’?’};

 

size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。
例如:bitset的size操作返回bitset对象中二进制位中的个数,返回值类型是size_t。
例如:在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t。vector使用的下标实际也是size_t,源码是typedef size_t size_type。

 

数据类型和字长问题:

机器字长:是指计算机进行一次整数运算所能处理的二进制数据的位数(整数运算即定点整数运算),平时所说的32位系统即每次处理4个字节,也有64位和16位的等分别每次处理8和2个字节。

算术类型的存储空间按照机器而定。一般,short类型为半个机器字长,int为一个机器字长,long为1或2个机器字长,float为一个机器字长,double为两个字,long double用3或4个字长。C++标准规定的是每个算术类型的最小存储空间,但其并不阻止编译器用更大的存储空间。如果要保证移植性,使用__int16 __int32 __int64。

 

数据类型名称 字节 别名 取值范围
int * signed,signed int 操作系统决定,即与操作系统的"字长"有关
unsigned int * unsigned 由操作系统决定,即与操作系统的"字长"有关
__int8 1 char,signed char –128 到 127
__int16 2 short,short int,signed short int –32,768 到 32,767
__int32 4 signed,signed int –2,147,483,648 到 2,147,483,647
__int64 8 –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
bool 1 false 或 true
char 1 signed char –128 到 127
unsigned char 1 0 到 255
short 2 short int,signed short int –32,768 到 32,767
unsigned short 2 unsigned short int 0 到 65,535
long 4 long int,signed long int –2,147,483,648 到 2,147,483,647
long long 8 none (but equivalent to __int64) –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long 4 unsigned long int 0 到 4,294,967,295
enum * 由操作系统决定,即与操作系统的"字长"有关
float 4 3.4E +/- 38 (7 digits)
double 8 1.7E +/- 308 (15 digits)
long double 8 1.7E +/- 308 (15 digits)
wchar_t 2 __wchar_t 0 到 65,535

(P:指针的大小为定值4个字节)

(1)类型修饰符signed和unsigned用于修饰字符型和整形。

(2)类型修饰符short和long用于修饰字符型和整形。

(3)当用signed和unsigned、short和long修饰int整形时,int可省略。

(4)其中bool和wchar_t是C++特有的。

(5)除上表以外,C/C++都可以自定义枚举enum、联合union和struct结构体类型。

(6)以上sizeof通过Windows XP 32位平台测试,其中某些类型数据的字节数和数值范围由操作系统和编译平台决定。比如16位机上,sizeof(int) = 2,而32位机上sizeof(int) = 4;32位机上sizeof(long) = 4,而64位机上sizeof(long) = 8。除此之外,注意64位机上的pointer占8byte。

(7)void的字面意思是“无类型”,不能用来定义变量。void真正发挥的作用在于:<1> 对函数返回和函数参数的限定,例如自定义既不带参数也无返回值的函数voidMyFunc(void);<2>定义无类型通用指针void *,指向任何类型的数据。

(8)标准C++库及STL还提供了通用数据结构:字符串类string;向量类模板vector;双端队列类模板deque;链表类模板list;容器适配器堆栈类stack(实现先进后出的操作);容器适配器队列类queue(实现先进先出的操作);集合类set;多重集合类multiset;映射类map;多重映射类multimap;位集合bitset;迭代器iterator (类似指针的功能,对容器的内容进行访问)。

(9)在标准c++中,int的定义长度要依靠你的机器的字长,也就是说,如果你的机器是32位的,int的长度为32位,如果你的机器是64位的,那么int的标准长度就是64位,而vc中__int64是为在32机位机器长实现64位长度的整形数。

(10)关于32位平台下的int和long

long从字面上看,应该是64位才更合理,把long当成32位实在是一个历史的包袱。像C#那样新起炉灶的程序语言,由于没有需要支持老代码的问题,就把long当作64位来处理了。

在32位平台下,long是相对short而言,long(short)类型是long(short) int类型的简称,sizeof(long)= sizeof(int) = 4。int和long的范围虽然一样,但输入输出格式不同,printf int的格式为%d,而printf long的格式为%ld。

考虑到程序的可移植性,还是要将他们区分开来。但当要求的数值范围为4byte时,建议使用int类型,因为第一版的C语言只有一种类型,那就是int。

(11)在Win32API及MFC中为了使类型名称在语意上更明了,对以上基本类型进行了大量的typedef。例如WINDEF.H中的BYTE,WORD,DWORD。

 

深入理解函数的值传递和地址传递以及其他注意事项:

函数是c/c++特有的,数据类型关键字为void的函数可以不返回一个值,其他必须有一个或多个return语句。

值传递:实参将值传给形参,但是形参不能改变实参,是单向传递,即只能有实参向形参单向传递。

地址传递:双向传递机制,即为地址调用。

 

内联函数:其实就是在函数名之前加一个inline,作用是编译时把该函数体直接嵌入主调函数,又称内嵌函数或内置函数。优点可以节省运行时间但却增加目标程序长度,一般把规模很小(5个语句以下)声明为内联函数,注意如果有switch,for,while等复杂循环语句,编译器仍然把内联函数按照普通函数进行编译。

 

变量及函数的作用域与生存期:

1.动态存储

函数的形参和局部变量(未加static)属于动态存储方式(堆或栈),变量修饰符auto和register(寄存器变量)属于动态存储

2.静态存储

是不是经常看到static等修饰词,static是静态的意思,

static+局部变量=静态局部变量   生存期延长,作用域不变

static+全局变量=静态全局变量  作用域受限只能被当前文件使用,不能extern

3.你还会看到extern

extern是需要外部变量在另一个文件访问的时候用的修饰符,什么是外部变量呢?没有static的全局变量就是外部变量,在A中的外部变量m,若在B中访问m,在m前加extern即可。

同理,按函数的作用域可分为外部函数(extern机制)和内部函数(又称静态函数 static机制)

 

编译预处理:

编译预处理有三种:宏定义,文件包含,条件编译

1.宏定义:

作用是实现文本替换,有两种:不带参数和带参数

不带参数一般用 #define 宏名 字符串                      如#define PI 3.14

或const 类型 宏名 字符串                    const int PI 3.14

带参数的宏定义

#define 宏名(参数列表)字符串                              #define S(a,b) a-b

 

 

例题:

#define DOUBLE(x) x+x
int
i = 5*DOUBLE(5);
最终 i=30.而不是50;

2.文件包含: 顾名思义

 

3.条件编译:

#ifdef        #else            #endif           #ifndef         #elif         等关键字

有印象即可