C++笔记(自用)

/

C++基础


一、初学C++


1、第一个程序

// 头文件
#include <iostream>
//命名空间
using namespace std ;
// 主函数
int main () {
    cout << "HEllO" << endl ;
    return 0 ;
}

2、注释

单行注释
// 这是一行注释
多行注释
/*
这是一行注释
这也是一行注释
这又是一行注释
*/

3、变量

会变的量

变量的定义

数据类型 变量名 = 初始值


4、常量

不会变的量

#define
// 将代码中所有的 x 替换成 "你好" 以此类推
#define x "你好"

易错点

#define x 1+2
int main () {
    cout << x * x ;
}
/*	输出结果为 5 
	而非 9
原因:
	将 cout << x*x ; 中的 x 替换为 1+2
	等价为 cout << 1+2*1+2 ;
	而非 cout << 3*3 ; 或cout << (1+2)*(1+2) ;
*/
const 修饰符
// 定义 x 为不可修改的量
const int x = 1 ;

5、关键字

不能用作标识符


6、标识符

变量或常量的名字

由 下划线( _ ) 、英文字母( a ~ z 、A ~ Z )、数字组成

严格区分大小写

例如:

a3_

_Sa89

不能是:

2ds_


二、数据类型


1、整型

字节数表示大小表示范围
short2字节2^16-2^15 ~ 2^15-1
int4字节2^32-2^31 ~ 2^31-1
long4字节2^32-2^31 ~ 2^31-1
long long8字节2^64-2^63 ~ 2^63-1
数值溢出
short a = 32768 ; // 输出结果为 -32768

在这里插入图片描述


2、sizeof 关键字

获取一个数据类型或者一个量所占字节数

int a;
sizeof(short) ;	 	  // 输出2
sizeof(a) ;			  // 输出4

3、浮点型(实型)

字节数精度
float4字节
double8字节
浮点数判断相等

​ 因为浮点数有误差,所以不能直接用 ==来判相等

​ 例如: x == 1

#include <cmath>	
#define eps 1e-7
double x ;
if (fabs(x-1) < eps) {	// fsbs 取绝对值
    
}

4、字符型

 char a = 'x' ;	// 字符用单引号括起来

占用字节数为 1

ASCLL码

​ 字符以整型存储在内存中,本质上是一个数值,每一个字符对应一个 ASCLL码

转义字符

简单来说就是在一些字符前加 “ \ ” 使它具有其他意义

在这里插入图片描述


5、字符串

// c风格
char 变量名[] = "字符串常量" ; // 实际为 "字符串常量\0"
char a[] = "hello" ;		 // 输出为 hello
sizeof(a) ; 				// 输出为 6

// c++风格
#include <cstring>
string b = "world" ;		 // 输出为 world
cout << b + ";" ;			 // 输出为 world;

6、布尔类型

bool flag1 = true ;			// 1
bool flag2 = false ;		// 0
cout << flag1 ;			    // 输出为 整数1

占用字节数 1


7、数据的输入

整型的输入
int a ;
cin >> a ;
浮点型的输入
double b ;
cin >> b ;
字符型的输入
char c ;
cin >> c ;
字符串的输入
#include <string>
string d ;
cin >> d ;
布尔型的输入
bool e ;
cin >> e;

三、运算符


1、加减乘除运算符

int a = 1 , b =  1 ;
a + b ;			// 2
a - b ;			// 0
a * b ;			// 1
a / b ;			// 1

2、取模运算符(取余)

取模符号与被除数一致

int a = 100 , b = 9 ;
a % b ;			// 1

3、递增递减运算符

int i = 1 ;
i++ ;				// i = i + 1 ;
++i ;				// i = i + 1 ;

int x = i++ ;		 // 1 先把值给到x,再递增
int y = ++i ;		 // 2 先递增,再把值给到y(效率稍高) 

4、赋值运算符

int x = 1 ;
int y = 2 ;
x = y ;				// 将 y 的值赋值给 x 

x += y ;			// x = x + y (加减乘除取模都适用)

5、比较运算符

输出为布尔值

符号意义
==等于
!=不等于
>大于
<小于
>=大于等于
<=小于等于
int a = 1 ;
int b = 2 ;
cout << (a == b) ;		//输出为 0

6、逻辑运算符

输出为布尔值

符号意义
&&逻辑与(有假必假)
||逻辑或(有真必真)
!逻辑非

7、逗号运算符

输出值为逗号表达式最右边的值

注意:逗号运算符优先级非常低

int a(1), b(2), c(3);
cout << (a, b, c);		// 3

8、位运算符

符号意义
&位与(有0必0)
|位或(有1必1)
^异或
~按位取反
<<左移运算
>>右移运算
位与
int a = 0b1010;   // 10 二进制数前加 0b 表示二进制
int b = 0b0110;	  // 6
//      0b0010    // 2
cout << (a & b);  // 2
位或
int a = 0b1010;   // 10 
int b = 0b0110;	  // 6
//      0b1110    // 14
cout << (a | b)   // 14
异或

相同为0,不同为1

int a = 0b1010;   // 10 
int b = 0b0110;	  // 6
//      0b1100    //12

cout << (a ^ b); //12
按位取反
int a = 0b1;	
/*
int类型占四个字节,也就是32位,即
a = 0b00000000000000000000000000000001
*/
int b = (~a);
/*
a = 0b00000000000000000000000000000001
b = 0b11111111111111111111111111111110
*/

左移运算
int a = 0b11;	// 3
a = (a << 1);   // 将a左移一位,
// 0b110        // 6
cout << a;     // 6

    
x << y;         // 将x左移y位

数值计算:

x << y

x = x * 2 ^ y

右移运算
// 1、正数的右移
int a = 0b111;	// 7
a = (a >> 1);   // 将a右移一位,
// 0b011        // 3
cout << a;     // 3

    
x >> y;         // 将x右移y位

数值计算:

x >> y

x = x / 2 ^ y


四、程序控制流程结构


1、if else语句
if (表达式)		// 如果表达式成立,执行语句1
    语句1
else   			  // 如果表达式不成立,执行语句2
    语句2

2、else if语句
if (表达式1)		// 哪个表达式成立就执行那个语句,都不成立则执行语句4
    语句1
else if (表达式2)  			 
    语句2
else if (表达式3)
    语句3
    
......
    
else
    语句4

3、条件运算符
表达式1 ?表达式2 :表达式3;
// 如果表达式1为真,则执行表达式2,返回值为表达式2的值
// 如果表达式1为假,则执行表达式3,返回值为表达式3的值

4、switch语句
switch (表达式) {
    case 整型常量1:
    	语句1
    	break;
    case 整型常量2:
    	语句2
    	break;
    case 整型常量3:
    	语句3
    	break;
    default:
        语句4
}

语句中必须加 break,若不加 break ,发生以下情况

int n = 1;
switch (n) {
    case 0:
        cout << "零";
    case 1:
        cout << "一";
    case 2:
        cout << "二";
    default:
        cout << "不知道";
}
//运行结果为:一二不知道

5、while语句
while(表达式){			//如果表达式为真,则执行语句1	
    语句1
}

6、do…while语句
do{ 				  // 至少执行一次语句1	
    语句1
}while (表达式);

7、for循环
for (表达式1 ;表达式2 ;表达式3) {
    语句1
}
执行流程图
表达式1
表达式2
语句1
结束循环
表达式3

8、break

跳出循环

while (表达式1) {
    语句1;
    break;
}
表达式1
语句1
break
结束循环

9、continue

跳出本次循环

while (表达式1) {
    语句1;
    continue;
    语句2;
}
表达式1
语句1
continue
结束循环
语句2未执行

五、数组


1、 一维数组
一维数组的定义
数据类型 数组名[数字/常量表达式]

数组内所有元素类型相同

数组名为变量名,不能同名,且满足标识符规则

数组下标是从 [0] 开始

括号内不能为变量,如 int a = 10; int b[n];

一维数组的初始化
int a[10] = {0};
// 0 0 0 0 0 0 0 0 0 0

int a[10] = {1,2,3,4,5};
// 1 2 3 4 5 0 0 0 0 0 
##### 数组的访问
数组名[下标]   // 下标从 0 开始

2、二维数组
##### 二维数组的定义
数据类型 数组名[行][列]
二维数组的初始化
int a[3][3] = {0};
/* 0 0 0
   0 0 0
   0 0 0 */

int a [3][3] = {{1,2},{0},{3}};
/* 1 2 0
   0 0 0
   3 0 0 */

数组名代表数组元素的首地址


六、函数


1、函数的定义
返回值类型 函数名 (参数列表) {
    函数体
    return 表达式;		// 	返回值
}

// 定义一个加法函数
int add (int a , int b) {
    int c = a + b;
    return c;
}

2、函数的调用
#include <iostream>
using namespace std;

// add函数的定义
int add (int a , int b) {
    int c = a + b;
    return c;
}

int main () {
    
    int a = 1;
    int b = 2;
    int c = add (a , b); 		// 调用add函数
    cout << c << endl;
    return 0;
}

3、函数的值传递
#include <iostream>
using namespace std;

// 定义一个函数 
void function (int num) {
	//改变num的值
	num = 100;
}
 
int main () {
	int number;
	number = 1;
	function (number);				// 将number的值传递给num
	cout << number << endl;			// 1	number的值未改变
	return 0;
}

这样的值传递只能把一个函数中的值传递给另一个函数,当该值在被调函数中发生改变时,在原来的函数中并不会发生改变。


4、 函数的声明
#include <iostream>
using namespace std;

int add (int a , int b);        // 函数的声明
//int add (int ,int);    		// 也可以这样写


int main () {
    
    int a = 1;
    int b = 2;
    int c = add (a , b); 		// 调用add函数
    cout << c << endl;
    return 0;
}

int add (int a , int b) {		// add函数的定义
    int c = a + b;
    return c;
}

七、指针


1、指针和地址
一般数据类型
int a = 1;
int b = 2;
int c = 3;
内存地址0x000000000x000000010x00000002
变量值123
变量名abc
指针数据类型
int *Pa = &a;	
int *Pb = &b;
int *Pc = &c;
内存地址0x000000030x000000040x00000005
变量值0x000000000x000000010x00000002
变量名papbpc

2、指针的定义
数据类型 *指针变量名;

int *p;
*p = &a;		// &a 对a取地址
*p = &b;		// 指针可多次赋值

3、解引用
*指针变量名 = 数值;

*pa = 7		// 等同于 a = 7

4、 * 和 & 的关系

* 与 & 互逆

*&a = *(&a) = *pa = a
&*pa = &(*pa) = &a = pa

5、指针的内存

​ 只跟操作系统有关:

​ 在32位操作习题中占用4个字节

​ 在64位操作习题中占用8个字节


6、空指针和野指针

空指针不指向任何实际的对象或者函数

int *p = NULL;		// 空指针 无法解应用

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

int *p = (int *)0x1232423	// 指向一个垃圾内存

八、结构体


1、结构体的定义
struct 结构体名 { 结构体成员变量列表 };
    
    
// 定义一个结构体
struct Book {
    string name;
    double price;
};

// 1、创建结构体
Book c;
c.name = "c语言程序设计";
c.price = 39.99;

cout << c.name << ' ' << C.price << endl;	// c语言程序设计 39.99


// 2、通过初始化列表创建结构体
Book c = {"c语言程序设计" , 39.99};

cout << c.name << ' ' << C.price << endl;	// c语言程序设计 39.99


// 3、在定义时直接创建

struct Book {
    string name;
    double price;
}c;
    
c.name = "c语言程序设计";
c.price = 39.99;

cout << c.name << ' ' << C.price << endl;	// c语言程序设计 39.99

2、结构体数组
结构体名  结构体变量名[元素个数] = { {} , {} , {} , ...}

//创建一个结构体数组
Book books[3] = {
    {"c语言程序设计" , 39.99},
    {"Python程序设计" ,9.99},
    {"C++程序设计" , 99.99}	
};

3、结构体指针
Book c = {"c语言程序设计" , 39.99};
Book *p = &c;
p -> name = "c++";	// 指针访问用 "->" 代替 "."

cout << c.name << ' ' << C.price << endl;	// c++ 39.99

  • 26
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值