C++语言基础随笔

cpp笔记

 

一、linux系统编译:

1、最简单的编译:g++ hello.cpp -o hello(将cpp文件编译成可执行文件)

2、运行:./hello

 

二、数据类型

1、数据类型列表

 

类型

关键字

布尔型

bool

字符型

char

整型

int

浮点型

float

双浮点型

double

无类型

void

宽字符型

wchar_t

2、数据类型大小

 

char

1 个字节

-128 到 127 或者 0 到 255

unsigned char

1 个字节

0 到 255

signed char

1 个字节

-128 到 127

int

4 个字节

-2147483648 到 2147483647

unsigned int

4 个字节

0 到 4294967295

signed int

4 个字节

-2147483648 到 2147483647

short int

2 个字节

-32768 到 32767

unsigned short int

2 个字节

0 到 65,535

signed short int

2 个字节

-32768 到 32767

long int

8 个字节

-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

signed long int

8 个字节

-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

unsigned long int

8 个字节

0 to 18,446,744,073,709,551,615

float

4 个字节

+/- 3.4e +/- 38 (~7 个数字)

double

8 个字节

+/- 1.7e +/- 308 (~15 个数字)

long double

16 个字节

+/- 1.7e +/- 308 (~15 个数字)

wchar_t

2 或 4 个字节

1 个宽字符

3、数据类型转换

(一)自动转换规则:

1、若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

2、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。a、若两种类型的字节数不同,转换成字节数高的类型 。 b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型

3、所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。

4、char型和short型参与运算时,必须先转换成int型。

5、在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度:

(二)强制转换规则:

强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型:

4、其他数据类型

(一)typedef 声明: typedef int feet; (typedef type newname;),

只能对已存在的类型增加一个别名;

会有类型检查功能;

有作用域限制。

(二)#define 则是宏定义:#define WIDTH 5(#define identifier value)

发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换;

不进行任何检查;

没有作用域,只要在使用前宏定义就可以。

(三)enum枚举类型:变量的值只能在列举出来的值的范围内。默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。

enum color { red, green, blue } c;

c = blue;

5、特殊数据类型和操作:

(一)sizeof(XXX) 返回类型或变量占的字节数;

(二)wchar_t 就是 wide char type, 一种用来记录一个宽字符的数据类型 .

(三)ptrdiff_t 就是 pointer difference type, 一种用来记录两个指针之间的距离的数据类型

6、变量初始化值:

正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。

 

数据类型

初始化默认值

int

0

char

'\0'

float

0

double

0

pointer

NULL

 

 

 

 

三、基本语法

1、#include<iostream>:头文件

2、using namespace std; 告诉编译器使用std命名空间

3、int main() 主函数,程序从这里开始执行:在一些检查不是很严格的编译器中,比如 VC, VS 等,void 类型的 main 是允许的。不过在一些检查严格的编译器下,比如 g++, 则要求 main 函数的返回值必须为 int 型。

4、main函数中的return 0; 终止main函数,并向调用进程返回值0

5、cpp标识符不允许出现标点字符,比如 @、& 和 %(但是$可以用,甚至可以放在标识符前面),且区分大小写

 

四、程序注释

1、// 为单行注释

2、/* */可以跨行注释

3、特殊的注释方法:当if为true时,执行code1代码段,否则执行else代码段

#if condition

code1

#else

code2

#endif

 

五、变量作用域

1、extern定义已存在的全局变量,则可以使用该全局变量(当某全局变量定义在使用之后,则通过在使用前extern再定义此变量,则可正常使用)

2、存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和 static 变量

3、static 变量依然遵守变量的作用域,只是每次进入作用域时,static变量依然保持上次的数值。

4、Tips:

A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;

D、如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)

E、函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

 

六、常量

1、整数常量

(一)0x 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制

(二)整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

2、浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。

A. 当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。

float a = .03;

float b = 1;

float c = 1.03;

B. 当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。

float a = 1e-3;

float a = 1.2e-3; out: 0.0012

3、布尔常量

true, false。我们不应把 true 的值看成 1,把 false 的值看成 0

4、字符常量:

 

转义序列

含义

\\

\ 字符

\'

' 字符

\"

" 字符

\?

? 字符

\a

警报铃声

\b

退格键(delete)

\f

换页符

\n

换行符

\r

回车

\t

水平制表符

\v

垂直制表符

\ooo

一到三位的八进制数

\xhh . . .

一个或多个数字的十六进制数

5、定义常量:(请注意,把常量定义为大写字母形式,是一个很好的编程实践。)

使用 #define 预处理器。#define identifier value,可以取消宏定义#undef,不取消又重定义的话,会弹出警告。

使用 const 关键字。系统只读不能写。const type variable = value;

 

七、输入输出

1、标准输入流:cin >> XXX;

2、getchar() C 库函数 int getchar(void) 从标准输入 stdin 获取一个字符(一个无符号字符),即可以获取终端上输入的内容。

3、输入一串以空格为间隔的数组:

int arr[10];

int i = 0;

char c;

cin >> arr[i++];

while((c=getchar())!='\n')

{

cin >> arr[i++];

}

 

八、cpp修饰符

1、类型限定符

const:只读不能写

volatile:修饰符 volatile 告诉编译器不需要优化volatile声明的变量,让程序可以直接从内存中读取变量。对于一般的变量编译器会对变量进行优化,将内存中的变量值放在寄存器中以加快读写效率。

explicit:可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。

2、无符号数转换为有符号数:

16 位整数(短整数)的情况下,十进制 50000 就是二进制 11000011 01010000 但在有符号的情况下,二进制最左边的 1,代表这整个数字是负数但是电脑是以补码形式来表示数字的,要获得原本的数字,首先要把整个二进制数 - 11100001101010000 - 1 = ‭1100001101001111‬ 然后,在把答案取反码 not ‭1100001101001111‬ = ‭0011110010110000‬ 把最终答案变成十进制,就是 15536 所以,一开始的二进制数 11000011 01010000,在有符号的情况下代表的就是 -15536。

 

九、运算符

1、算术运算符


假设变量 A 的值为 10,变量 B 的值为 20,则:

运算符

描述

实例

+

把两个操作数相加

A + B 将得到 30

-

从第一个操作数中减去第二个操作数

A - B 将得到 -10

*

把两个操作数相乘

A * B 将得到 200

/

分子除以分母

B / A 将得到 2

%

取模运算符,整除后的余数

B % A 将得到 0

++

自增运算符,整数值增加 1

A++ 将得到 11

--

自减运算符,整数值减少 1

A-- 将得到 9

2、

 

运算符

描述

实例

&

如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。

(A & B) 将得到 12,即为 0000 1100

|

如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。

(A | B) 将得到 61,即为 0011 1101

^

(异或,同0异1)

(A ^ B) 将得到 49,即为 0011 0001

~

二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0。

(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。

<<

二进制左移运算符。左操作数的值向左移动右操作数指定的位数。

A << 2 将得到 240,即为 1111 0000

>>

二进制右移运算符。左操作数的值向右移动右操作数指定的位数。

A >> 2 将得到 15,即为 0000 1111

 

十、指针

 

1、指针的定义:指针是一个变量,其值是另一个变量的内存位置的直接地址;和其他变量一样,必须在使用前声明:type *var-name;以下为有效声明:

int *ip; /* 一个整型的指针 */

double *dp; /* 一个 double 型的指针 */

float *fp; /* 一个浮点型的指针 */

char *ch; /* 一个字符型的指针 *

说明:以上的指针值都是一样的,都是一个代表内存地址长的十六进制数,不同的是只是所指向的变量或常量的数据类型不同。

 

2、

&variable: 取该变量的内存地址

*point: 取该指针所指向变量的值,即取该地址的变量值

eg: 输出:1

int *point; 0xbfc601ac

int b=1; 0xbfc601ac

point = &b; 1

 

cout << b << endl;

cout << &b << endl;

cout << point << endl;

cout << *point << endl;

 

十一、循环部分

1、break:

C++ 中 break 语句有以下两种用法:

A。当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。

B。它可用于终止 switch 语句中的一个 case。

【注意】如果您使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。

2、continue:

C++ 中的 continue 区别于break 语句。但它不是强迫终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

A。对于 for 循环,continue 语句会导致执行条件测试和循环增量部分(即,跳到for的i++或i++语句上)

B。对于 while 和 do...while 循环,continue 语句会导致程序控制回到条件上。

 

十二、判断语句

1、switch

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。

switch(expression){

case constant-expression :

statement(s);

break; // 可选的

case constant-expression :

statement(s);

break; // 可选的

 

// 您可以有任意数量的 case 语句

default : // 可选的

statement(s);

}

switch 语句必须遵循下面的规则:

A.switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。

B.在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。

C.case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量。

D.当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。

E.当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。

F.不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。

G.一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。

 

2、?:运算符

Exp1 ? Exp2 : Exp3;

? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个 ? 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个 ? 表达式的值。

 

十三、函数

1、函数传递

(1)传值调用:修改函数内的形式参数不会影响实际参数。

(2)指针调用:向函数传递参数的指针调用方法,把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

eg:

void test(int *x);

 

int main()

{

int value = 0;

cout << "old value " << value<<endl;

test(&value);

cout << "new value " << value<<endl;

return 0;

}

void test(int *x)

{

*x = 10;//取地址为x的实际值,则value值由0变为10

}

(3)引用调用:向函数传递参数的引用调用方法,把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

eg:(对比于指针调用)

int main()

{

int value = 0;

cout << "old value " << value<<endl;

test(value);

cout << "new value " << value<<endl;

return 0;

}

 

void test(int &x)

{

x = 10;//取地址为x的实际值

}

2、Lambda 函数与表达式:适用于定义小函数块

 

十四、数字

1、C++ 数学运算:需要引用数学头文件 <cmath>

 

 

序号

函数 & 描述

1

double cos(double);
该函数返回弧度角(double 型)的余弦。

2

double sin(double);
该函数返回弧度角(double 型)的正弦。

3

double tan(double);
该函数返回弧度角(double 型)的正切。

4

double log(double);
该函数返回参数的自然对数。

5

double pow(double, double);
假设第一个参数为 x,第二个参数为 y,则该函数返回 x 的 y 次方。

6

double hypot(double, double);
该函数返回两个参数的平方总和的平方根,也就是说,参数为一个直角三角形的两个直角边,函数会返回斜边的长度。

7

double sqrt(double);
该函数返回参数的平方根。

8

int abs(int);
该函数返回整数的绝对值。

9

double fabs(double);
该函数返回任意一个十进制数的绝对值。

10

double floor(double);
该函数返回一个小于或等于传入参数的最大整数。

 

2、输出随机数

int j;

//设置种子

srand((unsigned)time(NULL));

j = rand();

cout << j <<endl;

 

十五、头文件

(1)cmath:数学操作

(2)ctime:时间操作

(3)cstdlib:是一些常用的函数,但是又不知道把它们放到哪里合适,因此就都放到了stdlib.h这个头文件中。stdlib.h可以提供一些函数与符号常量

4)cstring:c语言字符串操作

5)sting:cpp字符串操作

 

十六、数组

定义Int a[5];

1、数组名是一个指向数组中第一个元素的常量指针:以下结果相同,都是输出数组第一个元素的地址

cout << "list adress "<<a<<endl;

cout << "list adress "<<&a[0]<<endl;

2、传递数组给函数

1)方式1:指针传递 :void myFunction(int *param)

2)方式2:void myFunction(int param[10])

3)方式3:void myFunction(int param[])

3、函数返回数组: 通过返回数组第一个元素的指针(内存地址)

如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数int * myFunction()

eg:

int *test(int *arr);

int main()

{

int a[5] = {0,1,2,3,4};

int *return_arr;//其指针用来存放函数返回的数组指针

return_arr = test(a);//传入数组第一个元素地址

cout << return_arr[1] <<endl;

}

int *test(int *arr)//指针arr的值为a的第一个元素地址

{return arr;//返回数组指针}

 

十七、字符串

 

c语言中字符串操作<cstring>

序号

函数 & 目的

1

strcpy(s1, s2);
复制字符串 s2 到字符串 s1。

2

strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。

3

strlen(s1);
返回字符串 s1 的长度。

4

strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。

5

strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。

6

strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

 

cpp语言中字符串操作

eg:

int main ()

{

string str1 = "Hello";

string str2 = "World";

string str3;

int len ;

// 复制 str1 到 str3

str3 = str1;

cout << "str3 : " << str3 << endl;

// 连接 str1 和 str2

str3 = str1 + str2;

cout << "str1 + str2 : " << str3 << endl;

// 连接后,str3 的总长度

len = str3.size();

cout << "str3.size() : " << len << endl;

return 0;}

 

十八、数据结构:它允许您存储不同类型的数据项。

1、定义结构:

struct type_name {

member_type1 member_name1;

member_type2 member_name2;

member_type3 member_name3;

.

.

} object_names;

2、结构作为函数参数:

注意其中函数形参定义:void printBook( struct Books book ),Books为结构体名称,book为定义的结构体变量,实体化结构体。

3、指向结构的指针

(1)定义指针:struct Books *struct_pointer;

(2)取结构体地址:struct_pointer = &Book1;// Book1是结构体 Books的实体

(3)使用指向该结构的指针访问结构的成员:struct_pointer->title;

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值