学习c++第01天

news2024/11/18 11:39:26

学习c++的第01天

  • 前言
    • 1、变量是声明?
    • 2.建议定义数据都对其进行初始化
    • 3.有符号数和无符号数
    • 4.进制间的相互转换
    • 5.原反补码
    • 6.const 、register 、volatile和typedef关键字
    • 7.数据类型的自动转换
    • 8.左移<< &右移操作>>
    • 9.将data的指定位数进行0、1转化的应用
    • 10.循环语句
      • while 中的break与continue
    • 11.goto跳转语句
    • 12.数组
  • 总结


前言

日期:2023年6月28日`学习内容:C++数据类型&运算符&原反补码
记录我比较模糊的内容,与其他语言相似的不做记录

1、变量是声明?

  • 变量的定义:创建即开辟空间
  • 变量的使用;对已存在变量的读写
  • 变量的声明 :对变量的类型名称进行声明,但是不为其开辟空间
    提前声明关键字:extern
//提前:变量声明 需要加extern修饰 extern int data;
void test03()
{
	//先使用
    cout<<"data="<<data<<endl;
}
//后定义
int data = 0;

2.建议定义数据都对其进行初始化

字符型初始化’\0’
代码如下(示例):

char ch = '\0';
int num = 0;
float f = 0.0f;
double d = 0.0;

3.有符号数和无符号数

字符型初始化’\0’
代码如下(示例):

//有符号数
int num; //默认省去signed
signed int num ;
//无符号数
unsigned int num;

以一个字节为例:
无符号数范围:
0000 0000 ~ 1111 1111
0 ~ 255
有符号数范围:
1111 1111 ~ 1000 0000 ;0000 0000 ~ 0111 1111
-128 ~ -0 0 ~ 127
因为-0 不好表示所以将其看做-128
所以无符号数的范围为:
-128 ~ 0 ~ 127


4.进制间的相互转换

  • 十进制转成二进制、八进制、十六进制全部使用短除法

在这里插入图片描述

  • 二进制、八进制、十六进制转十进制使用为次幂的方法
  • 二进制转成八进制、十六进制
    八进制对应3位
    十六进制对应4位
  • 八进制和十六进制转二进制
  • 八进制转十六进制(二进制位中介)
  • 十六进制转八进制(二进制位中介)

5.原反补码

  • 计算机以补码的形式进行存储
    • 负数在计算机以补码的方式存储,非负数在计算机以原码的方式存储
  • 补码
    原码->反码->补码
  • 无符号数和有符号数的正数(都为正数) 原码=反码=补码
  • 有符号数的负数
    • 反码 = 符号位不变其他位取反
    • 补码 = 反码 + 1
      -123原码:1111 1011
      -123反码:1000 0100
      -123补码:1000 0101
  • 计算机从存储的补码,取出数据的过程:
    • 补码 -> 反码 -> 原码
    • 方式一:先取反再加1
      • 补码 - >反码 = 符号为不变其他位取反
      • 反码 - > 原码 = +1
    • 方式二:先减1再取反
      • 补码 -1 再取反 得原码
  • 补码的意义
    • 统一了0的编码

      • +0补码:0000 0000 -0补码:0000 0000
    • 将减法运算变成加法运算

      • 假如没有补码 10 - 6
      10: 0000 1010 
      -6: 1000 0110 
      -------------------
      1001 0000---->-16结果有问题
      
      • 假如有补码 10 - 6
      10: 0000 1010 
      -6: 1111 1010 
      -------------------
      0000 0100---->4
      

6.const 、register 、volatile和typedef关键字

  • const:修饰普通变量
//const修饰data为只读变量 data的本质是变量 //只读变量 只能被初始化 不能被赋值
const int data=100;
data = 10;//err

如果以常量初始化 const修饰的只读变量 那么 只读变量的值 事先存放在“符号常量表中” 不会立即给data 开辟空间,当对data取地址时,系统才会为data开辟空间

const int data=100;
int *p = (int *)&data;
*p = 2000;
cout<<"*p = "<<*p<<endl;//2000
cout<<"data = "<<data<<endl;//100
register:
  • register:修饰寄存器变量
    如果变量 别高频繁使用 会自动将变量存储在寄存器中 目的:提高访问效率 如果用户想将变量 直接放入寄存器中 可以加register修饰
    只是尽量放到寄存器当中
register int data=0;//data将放入寄存器中 //尽量不要对寄存器变量取地址
&data;
//register修饰的变量 只是尽量放入寄存器中
  • volatile :强制访问内存
volatile int data=0;//对data的访问 必须冲内存访问
  • typedef:给已有的类型重新取别名
    不能创建新类型。
    将长且复杂的类型名 取一个短小的名称。 typedef作用的步骤:
    1、先用 已有的类型 定义一个普通的变量
    2、用别名 替换 变量名
    3、在整个表达式最前方 加typedef
    使用代码示例:
//INT32就是int类型的别名 typedef int INT32;
INT32 data;
int num;//已有的类型任然有效

typedef int MYARRAY[5];
MYARRAY arr;

typedef int *MYP;
MYP p;//int *p; p的类型就是int *类型

7.数据类型的自动转换

  • 基本原则就是为了防止数据精度丢失,低精度与高精度运算,会直接转换成高精度
    在这里插入图片描述
  • 有符号的负数与无符号数进行运算时有大坑(会直接将有符号数的1负数位转换成无符号数进行运算) 代码示例如下:
int data1 = -10;
unsigned int data2 = 6;
if(data1+data2>0)
{
cout<<">0"<<endl;//结果输出 }
else
{
    cout<<"<=0"<<endl;
}
  • int和double参加运算 会将int转成从double类型
  • char和short类型 只要参加运算 都会将自己转换成int类型

8.左移<< &右移操作>>

左移操作:
左移

如果:data=0000 0001 如果:data=0000 0001 如果:data=0000 0001 如果:data=0000 0001 ...... 如果:data=0000 0001
data=data<<0;  data=0000 0001 == 1==data*2^0
data=data<<1;  data=0000 0010 == 2==data*2^1
data=data<<2;  data=0000 0100 == 4==data*2^2
data=data<<3;  data=0000 1000 == 8==data*2^3
data=data<<6;  data=0100 0000 == 64==data*2^6

右移操作:
在这里插入图片描述
算术右移、逻辑右移 都是编译器决定,用户无法确定。 无符号数:右边丢弃 左边补0
有符号数:
正数:右边丢弃 左边补0 负数:右边丢弃 左边补0(逻辑右移)
负数:右边丢弃 左边补1(算术右移) 编写代码测试 编译器为那种右移:

如果:data=1000 0000 data=data>>0; data=1000 0000 == 128==data除以2^0
如果:data=1000 0000 data=data>>1; data=0100 0000 == 64==data除以2^1
如果:data=1000 0000 data=data>>2; data=0010 0000 == 32==data除以2^2
如果:data=1000 0000 data=data>>3; data=0001 0000 == 16==data除以2^3
...... 
如果:data=1000 0000 data=data>>6; data=0000 0010 == 2==data除以2^6

9.将data的指定位数进行0、1转化的应用

案例1:data为1字节 将data的第3,4为清0 其他位保持不变。

data= data & 1110 0111
      1110 0111 == ~(0001 1000) == ~(0001 0000 | 0000 1000)
      ==~(0000 0001<<4 | 0000 0001<<3)
      == ~(0x01<<4 | 0x01<<3);
data &= ~(0x01<<4 | 0x01<<3);//推荐

案例2:data为1字节 将data的第5,6为置1 其他位保持不变

data = data | 0110 0000
    0110 0000==0100 0000 | 0010 0000==0000 0001<<6 | 0000 0001<<5
    == 0x01<<6 | 0x01<<5
data |=(0x01<<6 | 0x01<<5);//推荐

案例3:data为1字节 将data的第3,4位清0, 5,6置1 其他位保持不变

data = data & ~(0x01<<3|0x01<<4) | (0x01<<5|0x01<<6);

10.循环语句

  • 常见的基本与Java一样

while 中的break与continue

  • break 跳出循环
  • continue 直接进入下次循环,在下面的例子中会造成死循环
int i=1;
int sum = 0;
while(i<=100)
{
   if(i == 50)
       continue;
   sum += i;//sum = sum+i;
i++; }
cout<<sum<<endl;//没有结果 while是死循环 反复从i=1 开始
  • 循环选择的使用建议
    • 知道循环次数,用for
    • 只知道循环退出条件,建议用while

11.goto跳转语句

在这里插入图片描述

12.数组

- 这里与Java不同的是没有方法是直接来获取数组的长度的

  • 一维数组的获取长度
int arr[5] = {0} //推荐这样进行初始化
int length = sizeof(arr)/sizeof(arr[0]) // 获取数组的长度
//sizeof() 是用来获取数的占用字节数
sizeof(arr)/sizeof(arr[0]) //数组占用的总字节数/单个位置所占用的字节 
//就是数组的长度
  • 二维数组获取长度
int arr[3][4] = {{1,2,3,4},{1,2,3,4},{1,2,3,4}};
int row = sizeof(arr)/sizeof(arr[0]); //获取行
int clo = sizeof(arr[0])/sizeof(arr[0][0]); //获取列
// 数组遍历
for(int i = 0 ;i<row ;i++){
	for(int j = 0 ;j<clo ;j++){
		cout<<arr[i][j];
	}
}
  • 一维数组初始化 与 二维数组初始化
    初始化推荐如下:
int arr[3] = {0};//{0,0,0}
int arr2[2][3]={0} // {{0,0,0},{0,0,0}}

这下面可以不用看了:

//一维数组
int arr[4] = {1,2,3,4} //全部初始化
int arr[4] = {1,2,3} //部分初始化 {1,2,3,0}
int arr[]={10,20,30,40,50}; //元素个数由初始化个数决定
int arr[4]={0};//将第0个元素初始化为0 其他未被初始化自动补0 推荐 
int arr[4]={10};//10 0 0 0 
int arr[4]={[2]=10, [3]=30};//指定下标初始化 {0 0 10 30}
//二维数组
//分段初始化 (没有初始化到的默认为0)
int arr[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; //完全初始化 只能省略行数
int arr[][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };//完全初始化只能省略行数标
int arr[3][4]={ {1,2}, {5,6}, {9,10,11} };//部分初始化 其他值为0
//连续初始化 
int arr[3][4]={ 1,2,3,4, 5,6,7,8, 9,10,11,12};//完全初始化
int arr[][4]={1,2,3,4, 5,6,7,8, 9,10,11,12}; //可以省略行数
int arr[3][4]={ 1,2, 5,6, 9,10,11};//部分初始化

案例:

int arr1[3][4]={ {1,2}, {5,6}, {9,10,11}  };
int arr2[3][4]={ 1,2, 5,6, 9,10,11};
arr1[1][2] +arr2[1][2] == 11 // arr1[1][2] = 0 ;arr2[1][2] = 11
  • 字符数字初始化:使用右边 默认带’\0’
  • 其他是字符数组知识点 去看课件吧
    在这里插入图片描述

总结

这是自学C++第一天 认为需要注意的知识点,目前还是和java很相似的,感觉还没到难点!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaee 使用监听器统计当前在线用户列表

ServletContextListener 和 HttpSessionBindingListener 需要配和使用 TestServletContextListener package com.yyy.listener;import java.util.ArrayList; import java.util.List;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import …

复现论文ChineseBERT(ONTONOTES数据集)

记录一下自己复现论文《ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information》的过程&#xff0c;最近感觉老在调包&#xff0c;一天下来感觉什么也没干&#xff0c;就直播记录一下跑模型的过程吧 事前说明&#xff0c;这是跑项目的实况&#xff0c;如…

实用类详解

第二章 实用类介绍 目录 第二章 实用类介绍 1.枚举 2.包装类及其构造方法 3.Math类 4.Random类 5.String类 总结 内容仅供学习交流&#xff0c;如有问题请留言或私信&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 有空您就点点赞 1.枚举 枚举指由一…

python-注册nacos服务

一、首页 Nacos&#xff08;Naming and Configuration Service&#xff09;是一个用于实现服务注册和发现的开源项目。Nacos注册服务的主要作用是帮助微服务架构中的各个服务实例进行注册和发现&#xff0c;以便于服务之间的通信和协作&#xff0c;另外&#xff0c;也可以在nac…

基于高性能的STM32G031K4T6、STM32G031K6T6、STM32G031K8T6(ARM微控制器)64MHz 闪存 32-LQFP

STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用&#xff0c;并可随时用于物联网 (IoT) 解决方案。这些微控制器具有很高的集成度&#xff0c;基于高性能ARM Cortex-M0 32位RISC内核&#xff0c;工作频率高达64MHz。该器件包含内存保护单元 (MPU)、高速嵌入式内…

大数据赋能交通业务管理——远眺智慧交通集成管控系统

随着交通管理需求的不断提升&#xff0c;原有系统管理模式的缺点逐渐显露&#xff0c;各业务系统的相互独立、各自为战&#xff0c;成为交通管理人员全局把控交通资源、实现交通综合管控的壁垒。 智慧交通集成管控平台通过统一标准&#xff0c;集成交警各类业务系统、整合相关数…

libevent(6)windows上使用iocp网络模型

windows操作系统上不能使用epoll模型&#xff0c;只能使用iocp网络模型。这里我把怎么在windows上使用iocp的代码直接贴上&#xff1a; #include <iostream> #include <signal.h> #include <event2/event.h> #include <event2/listener.h> #include &l…

【Linux从入门到放弃】冯诺依曼体系机构、操作系统及管理的本质

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《Linux从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 文…

技术小知识:WAN和LAN区别 ①

1、WAN是外网接接入入口&#xff0c;一般指&#xff1a;外网&#xff0c;广域网&#xff0c;公网。 2、LAN是局域网输出接口&#xff0c;一般指&#xff1a;内网&#xff0c;家庭公司局域网。 局域网是小规模&#xff0c;近距离的一种内部范围网络布局。 外网要跨越的通讯商中…

【GESP】2023年06月图形化一级 -- 去旅行

文章目录 去旅行1. 准备工作2. 功能实现3. 设计思路与实现&#xff08;1&#xff09;角色、舞台背景设置a. 角色设置b. 舞台背景设置 &#xff08;2&#xff09;脚本编写a. 角色&#xff1a;Avery Walking 4. 评分标准 去旅行 1. 准备工作 &#xff08;1&#xff09;删除默认小…

不要错过这所211,专业课简单!保护一志愿,人称电力黄埔军校!

一、学校及专业介绍 华北电力大学&#xff08;North China Electric Power University&#xff09;&#xff0c;简称华电&#xff08;NCEPU&#xff09;&#xff0c;是中华人民共和国教育部直属、由国家电网有限公司等12家特大型电力集团和中国电力企业联合会组成的理事会与教育…

Java容器介绍及其操作方法

一、List ArrayList&#xff0c;LinkedList 特有的函数 <class T> get(int index) 获取下标为index的元素 <class T> set(int index, <class T> element) 改变某个元素 void add(int index, <class T> element) 在下标为index处插入元素…

API信息

API 接口渗透测试

Neo4j的简单使用

1、创建节点 CREATE (:Person {name: Alice, age: 25, city: London}) CREATE (:Person {name: Bob, age: 30, city: New York}) CREATE (:Person {name: Charlie, age: 35, city: Paris})CREATE (:Interest {name: Music}) CREATE (:Interest {name: Sports}) CREATE (:Inter…

Redis实战案例9-封装Redis工具类

1. 封装Redis工具类 方法一和三主要解决缓存穿透的问题&#xff1b; 方法二和四主要解决缓存击穿的问题&#xff1b; 2. 方法一和三 缓存穿透的封装&#xff1b; private final StringRedisTemplate stringRedisTemplate; public CacheClient(StringRedisTemplate stringRedisT…

炫技亮点 Spring Websocket idle check原理

文章目录 原理配置附件Java_websocket空闲检测原理 Spring Websocket 是基于 WebSocket 协议的实现&#xff0c;它提供了一种在客户端和服务器之间实时双向通信的方式。其中&#xff0c;idle check&#xff08;空闲检查&#xff09;是一种机制&#xff0c;用于检测 WebSocket 连…

新项目,不妨采用这种架构分层,很优雅!

大家好&#xff0c;我是飘渺。今天继续更新DDD&微服务的系列文章。 在专栏开篇提到过DDD&#xff08;Domain-Driven Design&#xff0c;领域驱动设计&#xff09;学习起来较为复杂&#xff0c;一方面因为其自身涉及的概念颇多&#xff0c;另一方面&#xff0c;我们往往缺乏…

CF449D Jzzhu and Numbers 题解

题意 给定 A 1 . . . . A n A_1....A_n A1​....An​&#xff0c;选任意个数使得它们异或和为 0 0 0&#xff0c;求方案数。 思路 很朴素的想法是枚举每个数&#xff0c;然后进行 0-1 背包方案数统计&#xff0c;时间复杂度 O ( n n ) O(n \times n) O(nn)。 而根据前面几…

linux——解压和压缩

目录 1.压缩格式 2. tar命令 3.tar命令压缩 4. tar解压 5. zip命令压缩文件 6. unzip 命令解压 7. 总结 1.压缩格式 2. tar命令 3.tar命令压缩 4. tar解压 5. zip命令压缩文件 6. unzip 命令解压 7. 总结

DragGAN windows 部署逼坑指南

可参看B站视频&#xff1a;【DragGAN开源】DragGAN win11 部署逼坑指南_哔哩哔哩_bilibili 报错信息如下&#xff1a; Setting up PyTorch plugin "bias_act_plugin"... Failed! ninja is required to load c extensions 环境配置&#xff1a; cuda:12.1visual …