学习c++第01天

学习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 01111110 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 00000110 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.hqwc.cn/news/1416.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity | HDRP高清渲染管线学习笔记:HDRP Custom Pass

目录 一、Custom Pass Volume组件介绍 1.Mode&#xff08;模式&#xff09; 2.Injection Point&#xff08;注入点&#xff09; 3.Priority 4.Fade Radius 5.custom passes 二、查看Custom Pass的渲染阶段 Custom Pass允许你执行以下操作&#xff08;官方文档&#xff0…

基于改进ISODATA算法的负荷场景曲线聚类MATLAB程序

参考文献&#xff1a; 基于机器学习的短期电力负荷预测和负荷曲线聚类研究_张辰睿&#xff08;硕士论文&#xff09; 参考其第三章 主要内容&#xff1a; 主要包含四种聚类算法&#xff0c;K-means聚类、ISODATA聚类、L-ISODATA聚类及K-L-ISODATA聚类&#xff0c;并且包含了…

【玩转Linux操作】Linux服务管理

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;服务(service)管理⭐service管理指令 &…

(0017) H5-vue创建项目vue init webpack

1、初始化项目 1、vue 命令讲解 vue list &#xff1a;查看可以基于那些模板创建vue应用vue init <template-name> <project-name>init&#xff1a;表示要用vue-cli来初始化项目 <template-name>&#xff1a;表示模板名称&#xff0c;vue-cli官方提供的5种…

输入框设置placeholder的文字居中

<input classlogin-form-pwd placeholder请输入商家登录密码 placeholder-class"center"></input> .center{ text-align: center; }

ChatGLM-6B微调p tuning v2和lora对比

官方项目地址&#xff1a;https://github.com/THUDM/ChatGLM-6B 参考本人之前的博客下载ChatGLM-6B模型&#xff1a; https://blog.csdn.net/Acecai01/article/details/131221676 设备 一张3090Ti&#xff0c; 24G显卡 实验目的 通过微调的方法&#xff0c;训练ChatGLM-6B模…

oracle 重复启动监听程序故障

又是一起 oracle 无法连接问题&#xff0c;检查配置都是正常的。 原来是碰到一个oralce的bugl了。 还真就是这个问题&#xff0c;子进程一kill掉&#xff0c;就恢复了。

《算法设计与分析》学习笔记

目录 算法基本概念 算法的定义 算法复杂度分析 渐近记号 ①渐近上界记号O ②渐近下界记号Ω ③渐近紧确界记号 Θ ④非渐近紧确上界记号o ⑤非渐近紧确下界记号ω 渐进记号极限定义 分治 分治步骤 递归树 ​编辑代入法 主方法 改变变量 二叉树 堆 建堆 堆排…

Nvidia官方视频编解码性能

NVIDIA VIDEO CODEC SDK | NVIDIA Developer 1080P解码性能&#xff1a; 720P解码性能&#xff1a; 详细的参见官方的链接地址&#xff0c;对于GPU的解码fps能力&#xff0c;可以作为评估参照&#xff01;

Apikit 自学日记:发起文档测试-RPC

以DUBBO接口为例&#xff0c;进入某个DUBBO协议的API文档详情页&#xff0c;点击文档上方 测试 标签&#xff0c;即可进入 API 测试页&#xff0c;系统会根据API文档的定义的请求报文自动生成测试界面并且填充测试数据。 对RPC/DUBBO接口发起测试 填写请求报文参数值 此测试D…

SpringBoot整合MybatisPlus 自动生成controller、mapper、entity、service

首先创建SpringBoot项目 选择依赖 把application的后缀改为.yml&#xff0c;方便些。 pom.xml&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w…

开源工具系列8:Spring Security

Spring Security 是一套认证授权框架, 支持认证模式如 HTTP BASIC 认证头 (基于 IETF RFC-based 标准), HTTP Digest 认证头 ( IETF RFC-based 标准), Form-based authentication (用于简单的用户界面), OpenID 认证等, Spring Security使得当前系统可以快速集成这些验证机制亦…