Cpp知识点系列-类型转换

news/2024/4/26 5:36:47/文章来源:https://blog.csdn.net/qq_41461536/article/details/128089286

前言

在做题的时候发现了需要用到类型转换,于是在这里进行了简单的记录。

历史原因,慢慢整理着发现类型转换也能写老大一篇文章了。又花了时间来梳理一下就成了本文了。

cpp

之前使用的环境是DEV-C++ 5.4,而对应的GCC版本太低了。支持c++11需要GCC版本至少达到4.8.1才可以!

1

数据类型和运算符

四种基本数据类型

基本数据类型是分为四种的,分别是整型,浮点型,字符型和布尔型

四种基本类型

image-20201113122319295

从表2-1中可以看到,C++的基本数据类型有bool(布尔型)、char(字符型)、 int(整型),float(浮点型,表示实数) , double(双精度浮点型,简称双精度型)。除了bool型外,主要有两大类:整数和浮点数。

因为char型从本质上说也是整数类型,它是长度为1个字节的整数,通常用来存放字符的ASCII码。

其中关键字signed和 unsigned,以及关键字short 和long被称为修饰符

细节ISOC++标准并没有明确规定每种数据类型的字节数和取值范围,它只是规定它们之间的字节数大小顺序满足:

(signed/unsigned)char ≤ (unsigned)short ≤ (unsigned)int ≤ (unsigned) long

不同的编译器对此会有不同的实现。

面向32位处理器(IA-32)的C++编译器,通常将intlong两种数据类型皆用4个字节表示。

但一些面向64位处理器(IA-64或x86-64)的C++编译器中, int也是用4个字节表示, 但是long8个字节表示。

结构体类型

struct A {char c1;short s1;
};

这里不是主要说这个应用,而是分配字节的大小问题。

基础数据类型的字节长度很明显:

类型长度(字节)
char1
short2
int4
long4
float4
double8
long long8

然而,结构体的计算方式不是类似数组类型那样简单的累计,而是需要考虑到系统在存储结构体变量时的地址对齐问题

偏移量概念:偏移量指的是结构体变量中成员的地址和结构体变量地址的差

在实际中,存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则

(1)结构体变量中某成员的偏移量必须是该成员字长大小的整数倍(0被认为是任何数的整数倍)

(2)结构体大小必须是所有成员大小的公倍数。(按顺序以已经存在的最大字长为单位)

结构体大小等于最后一个成员的偏移量加上最后一个成员的大小

故而有以下几个例子:

struct A {char c1;//偏移量0 字长1char c2;//0+1=1 1double d1;//(1+1=2)+6=8 8//8+8=16是1,8的公倍数
};
struct B {char c1;//0 1double d1;//1+7=8 8char c2;//8+8=16  1//16+1=17不是1,8的公倍数,要扩到24才是
};
struct C {char c1;//0 1float f1;//1+3 4char c2;//8 1//8+1=9不是1,4的公倍数,扩到12才是
};

枚举类型

其实枚举类型的应用是很简单的,不过我个人应用的话更倾向于使用map类。

类似结构体的语法。

enum 枚举类型名 {变量值列表};

附上例子。

#include <iostream>using namespace std;
enum GameResult {WIN,LOSE,TIE,CANCEL
}; //下标依次为0,1,2,3
int main() {GameResult result;//声明变量时,可以不写关键字enumenum GameResult omit = CANCEL;//也可以在类型名前写enumfor (int count = WIN; count <= CANCEL; count++) {//枚举类型隐含类型转换为整型result = GameResult(count);//整型显式类型转换为枚举类型if (result == omit)cout << "The game was cancelled" << endl;else {cout << "The game was played ";if (result == WIN)cout << "and we won ! ";if (result == LOSE)cout << "and we lost . ";cout << endl;}}return 0;
}

注意:

WIN等是常量,不能对它们赋值。作用范围(严格来说是 main() 函数内部)内不能再定义与它们名字相同的变量。

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值(cpp->.i),枚举在编译阶段将名字替换成对应的值(.i->.s)。所以不能对枚举类型使用指针

可以再复习一下CPP编译运行的过程就更容易理解了。

ASCII表

建议直接访问在线网页:https://zh.cppreference.com/w/cpp/language/ascii

有以下四个需要注意:

  • 空格 32

  • ‘0’ 48

  • ‘A’ 65

  • ‘a’ 97

    image-20201113125805916

运算符优先级

优先级运算符说明结合性
1::范围解析(命名空间)自左向右
2++ --后缀自增/后缀自减
()括号
[]数组下标
.成员选择(对象)
−>成员选择(指针)
3++ --前缀自增/前缀自减自右向左
+ −加/减
! ~逻辑非/按位取反
(type)强制类型转换
*取指针指向的值
&某某的地址
sizeof某某的大小
new, new[]动态内存分配/动态数组内存分配
delete, delete[]动态内存释放/动态数组内存释放
4.* ->*成员对象选择/成员指针选择自左向右
5* / %乘法/除法/取余
6+ −加号/减号
7<< >>位左移/位右移
8< <=小于/小于等于
> >=大于/大于等于
9== !=等于/不等于
10&按位与
11^按位异或
12|按位或
13&&与运算
14||或运算
15?:三目运算符自右向左
16=赋值
+= −=相加后赋值/相减后赋值
*= /= %=相乘后赋值/相除后赋值/取余后赋值
<<= >>=位左移赋值/位右移赋值
&= ^= |=位与运算后赋值/位异或运算后赋值/位或运算后赋值
17throw抛出异常
18逗号自左向右

关系运算符

image-20201113140859803

逻辑运算符

操作数在计算之前隐式转换为类型 bool,结果的类型为 bool。

非!

使用方式为从右向左

如果已转换的操作数是 false,则结果是 true;

如果已转换的操作数是 true,则结果是 false。

与&&

使用方式为从左至右。

如果所有的操作数都为 true,则逻辑“与”运算符 (&&) 返回布尔值 true,否则返回 false。

第一个操作数将完全计算,并且完成所有副作用,之后才会继续计算下一个逻辑“与”表达式。

如果第一个操作数的计算结果为 true(非零),才计算第二个操作数。

或||

使用方式为从左至右。

如果任一操作数为 true,则逻辑“或”运算符 (||) 返回布尔值 true;否则返回 false。

第一个操作数将完全计算,并且完成所有副作用,之后才会继续计算下一个逻辑“或”表达式。

仅当第一个操作数的计算结果为 false (0) 时,才计算第二个操作数。

算术运算符

加减乘除

  • 当两个数都是整数时,运算结果也是整数。

  • 当有一个数是小数时,运算结果是小数。

  • 对于除法,如果两个整数相除但又不能整除,则只保留整数部分,这跟将小数赋值给整数类型是一个道理。

取余

“%”是取余运算,只能用于整型操作数,表达式a%b的结果是a被b除的余数。“%”的优先级与“/”相同。

逗号运算符

在C++中,逗号也是一个运算符,它的使用形式为:表达式1,表达式2 求解顺序为先求解i,再求解⒉,最终结果为表达式2的值。

int x=0;
int y=(x=x+3,4,545);
cout<<y<<" "<<x;
// 545 3

结果是545 3

类型转换

C++基本类型(int,char等)的指针之间不能含有隐式转换,必须要用显示转换!

int类型四舍五入

因为题目要求保留一位有效数字,所以就先把这个数乘十,按照正负加减零点五,两次强制类型转换后,再除以十即可。今后碰见四舍五入问题以此类推!

double dou=39.65;
dou = (double)((int)(dou*10 + (dou<0?-0.5:0.5)))/10;

int和char

int转char之前,先将运算式中的每个字符都转换成ASCII码值,再进行计算,根据结果转换为字符(数值为该字符对应的ASCII码值)。

以下代码为例,其中c4的结果符合我们的预期要求。

void int_to_char(){int i = 5;char c1 = i;                  // 5 '\x05'无法打印char c2 = i - 0;              // 5 '\x05'无法打印char c3 = i - '0';            // -43 '\xd5'打印乱码char c4 = i + '0';            // 53 '5'可打印cout<<c4;
}

char转int之前,先将运算式中的每个字符都转换成ASCII码值,再进行计算。

以下代码为例,其中i3的结果符合我们的预期要求。

void char_to_int(){char c = '0';int i1 = c;                    // 48int i2 = c - 0;                // 48int i3 = c - '0';              // 0int i4 = c + '0';              // 96cout<<i3;
}

int和string

void int_to_string() {int a = 100;string b = "";b = to_string(a);//string库,但需要c++11的支持cout<<b;
}

活着是另外一个方式

void string_to_int() {int a = 1;string b = "100abbc";a = atoi(b.c_str());//标准库,但是会忽略字符串中的字母,只保留数字cout<<a<<endl;a = stoi(b);//string库,但需要c++11的支持cout<<a;
}

如果不支持c++11的话,可以参考博客。

#include<sstream>
#include<string>
int a = 10;
stringstream ss;ss.str("");//重复调用一个对象的话要清空,clear函数只是重置状态。
ss << a;
string str = ss.str();

int和bool

int和bool类型之间存在隐式转换.

注意,直接输出bool类型的时候,控制台上结果为1或0

需要加上一个标志符来输出true或者false

void bool_to_int() {bool a = true, b = false;cout << "a=" << a << " , b=" << b << endl;cout << "a=" << boolalpha << a << " , b=" << b << endl;
}

image-20220828230919429

string、char *、char[]

string转char*

主要有三种方法可以将string转换为const char*类型,分别是:data()、c_str()、copy()。

  • data()方法

void stringt_to_char_data() {string str = "hello";const char *p1 = str.data();//不可修改cout << p1 << endl;char *p2 = (char *) str.data();//可修改p2[1]++;cout << p2;
}
  • c_str()方法

void stringt_to_char_c_str() {string str="world";const char *p1 = str.c_str();//不可修改cout << p1 << endl;char * p2=(char*)str.c_str();//可修改p2[1]++;cout << p2;
}
  • copy()方法

    可能会报安全性错误,自行解决即可。注意手动加结束符!!!

void stringt_to_char_copy() {string str = "hmmm";char p[10];str.copy(p, 3, 0);//这里3代表复制几个字符,0代表复制的位置,p[3] = '\0';//注意手动加结束符!!!cout << p;
}

char * 转string

可以直接赋值。

string s;
char *p = "helloworld";
s = p;

string转char[]

for循环遍历输入。

string pp = "helloworld";
char p[20];
int i;
for( i=0;i<pp.length();i++)p[i] = pp[i];
p[i] = '\0';                  //手动添加结束符

char[]转string

可以直接赋值。

string s;
char p[20] = "helloworld";
s = p;

char[]转char*

可以直接赋值。

char pp[20] = "helloworld";
char* p = pp;
12

char*转char[]

主要有两种方法可以将char*转换为char[]类型,分别是:strcpy()、循环遍历。

  • strcpy()方法

可能会报安全性错误,自行解决即可。

char arr[20];
char* tmp = "helloworld";
strcpy(arr, tmp);
  • 循环遍历

char arr[20];
char* tmp = "helloworld";
int i = 0;
while (*tmp != '\0')arr[i++] = *tmp++;
arr[i] = '\0';             //手动添加结束符

进制转换

int main() {int PrintVal = 9;/*按整型输出,默认右对齐*/printf("%d\n", PrintVal);/*按整型输出,补齐4位的宽度,补齐位为空格,默认右对齐*/printf("%4d\n", PrintVal);/*按整形输出,补齐4位的宽度,补齐位为0,默认右对齐*/printf("%04d\n", PrintVal);/*按16进制输出,默认右对齐*/printf("%x\n", PrintVal);/*按16进制输出,补齐4位的宽度,补齐位为空格,默认右对齐*/printf("%4x\n", PrintVal);/*按照16进制输出,补齐4位的宽度,补齐位为0,默认右对齐*/printf("%04x\n", PrintVal);/*按8进制输出,默认右对齐*/printf("%o\n", PrintVal);/*按8进制输出,补齐4位的宽度,补齐位为空格,默认右对齐*/printf("%4o\n", PrintVal);/*按照8进制输出,补齐4位的宽度,补齐位为0,默认右对齐*/printf("%04o\n", PrintVal);return 0;
}

结果如下:

例子

运算符例子1

#include <iostream>#define endl '\n'
using namespace std;int main() {int a, b, c, x, y;a = 1;b = 2;c = 0;cout << a++ - 1 << endl;//后缀自增运算符优先级大于加减运算符 cout << (a && b || !c) << endl;//a和b相与结果为真 cout << b / ++a << endl;//2除以3商0 x = ++a || ++b && ++c;//或运算被a=4短路 cout << a << b << c << x << endl;a = b = c = -1;y = ++a && ++b && ++c;//与运算被a=0短路 cout << a << b << c << y << endl;return 0;
}

image-20201113103823373

运算符例子2

int main() {int a = 4, b=3,c=2,d=1;int x, y = 0;x=a<b ? a+1 : c<d ? c+1 : d+1;//先判断a<b,再判断c<d,最后返回d+1 cout <<x <<endl;cout <<(a+ b, b + c,c+ d) <<endl;//返回最后一个c+dy += a+=b+= c+ d;//从右向左 cout<<y<<endl;return 0;
}

image-20201113114428361

感谢

源码文件

gitee:https://gitee.com/JunKuangKuang/KeenCPPTest-all/tree/main/basic/transition

github:https://github.com/JunKuangKuang/KeenCPPTest-all/tree/main/basic/transition

更新记录

2022.8.28更新:clang-1316.0.21.2.5,诶嘿嘿嘿……

忘了啥时候更新的了:重新使用了TDM-GCC 9.2 真香!

更早以前:后来我重新下载了新版本的,GCC更新为4.9的了。现在不让下载4.9的版本了,又重新下载了6版本使用。

感谢

感谢现在努力的我

  1. 参考《C++语言程序设计(第4版)》(郑莉,董渊)

  2. C++ int转string的多种方式

  3. c++中int与char相互转换

  4. printf按8进制、10进制、16进制输出以及高位补0

  5. C++逻辑运算符基本用法整理

  6. C++运算符优先级表

  7. c++中string、char *、char相互转换

  8. C++解决sizeof求结构体大小的问题

  9. C语言枚举类型

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

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

相关文章

智慧环卫管理系统解决方案(垃圾分类)

1.1 垃圾分类管理子系统 1.1.1 公众参与互动平台 可为客户量身打造微信公众号&#xff0c;搭建互动交流的平台&#xff0c;更好的调动居民参与垃圾分类的热情。 1.1.1.1 分类指导 将目前城市的垃圾处理情况、垃圾分类现状、分类的意义&#xff0c;以数据来说明垃圾分类的…

【设计】OOA、OOD、OOP

这三者都是 OO&#xff08;Object-Oriented&#xff09;领域的思想。 一般我们我们接到产品经理的需求后&#xff0c;开发阶段分这样几个步骤&#xff1a; 可行性预研阶段&#xff0c;此阶段评估需求是否合理&#xff0c;能否实现&#xff1b;OOA阶段&#xff0c;此阶段分析用…

语文课内外杂志语文课内外杂志社语文课内外杂志社2022年第14期目录

幼儿教育《语文课内外》投稿&#xff1a;cn7kantougao163.com 家园协同视域下幼儿心理危机的预防与干预对策 曹锭1-3 幼小衔接阶段幼儿时间观念的培养对策 陈晶晶4-6 有效支持 助力幼儿在书海中徜徉 胡玲珊7-9 东西部幼儿园结对帮扶,助力乡村教育扶贫——以广州市人民政府机关幼…

多线程(2)

文章目录前言 &#xff1a;1.Thread类 &#xff1a;1.1 Thread类常见的构造方法1.2 Thread的几个常见属性1.3 中断一个线程1.4 等待一个线程-join()1.5 获取当前线程引用1.6 休眠当前线程2.线程状态前言 &#xff1a; 简单回顾上文知识点 上文我们了解了 线程是为解决并发编程引…

Java数据审计工具:Envers and JaVers比较

在Java世界中&#xff0c;有两种数据审计工具&#xff1a;Envers和JaVers。 Envers已经存在了很长时间&#xff0c;它被认为是主流。 JaVers提供全新的方法和技术独立性。 如果您考虑哪种工具更适合您的项目&#xff0c;本文是一个很好的起点。 本文分为三个部分。首先&#x…

[附源码]计算机毕业设计springboot餐馆点餐管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【新知实验室-TRTC开发】实时音视频之欢度世界杯

目录 一、什么是TRTC 二、用5分钟跑通一个demo 1、开通腾讯云-TRTC 2、获取demo必须的两把钥匙 2.1输入应用名称 2.2下载对应的源码包&#xff08;手机、web、小程序等&#xff09; 2.3拿到钥匙 2.4完成 三、搭建一起看世界杯应用 1、解压源码&#xff08;耗时30S&#x…

[附源码]计算机毕业设计springboot房屋租赁系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MySQL为自动编号的字段赋值

insert users values(NULL,ming,fasdfasdfasd,22,1); 或者 insert users values(DEFAULT,ming,fasdfasdfasd,22,1);

网络的根基

hi 大家好&#xff0c;上个周末带小伙伴&#xff0c;一起复习了一遍网络协议&#xff0c;对网络协议的核心知识进行梳理&#xff0c;希望大家早日掌握这些核心知识&#xff0c;打造自己坚实的基础&#xff0c;为自己目标慢慢积累&#xff0c;等到自己春天的到来。详细点击查看…

zabbix拓扑图和聚合图形

目录 一、环境准备 1、搭建zabbix基础环境 2、创建被监控主机 二、拓扑图 1、拓扑图作用 2、拓扑图绘制步骤 三、聚合图形 1、聚合图形的作用 2、创建聚合图形 一、环境准备 1、搭建zabbix基础环境 zabbix基础环境部署参照&#xff1a;zabbix基础环境部署_桂安俊kyli…

Day14--商品详情-渲染商品详情的数据并优化详情页的显示

提纲挈领&#xff1a; 那么如何在小程序中将这些html的字符串渲染成这莫好看的结构呢&#xff1f; 官方文档&#xff1a;【使用uni-ui组件库中的rich-text组件】 1.渲染商品详情信息 我的操作&#xff1a; 1》在页面结构中&#xff0c;使用 rich-text 组件&#xff0c;将带有…

计算机网络第五章知识点回顾(自顶向下)

1. 网络层控制面 1.1 网络层功能 1.2选路问题 选路问题的描述&#xff1a; 给定一组路由器和连接路由器的链路&#xff0c;寻找一条从源路由器到目的路由器的最佳路径。 1.3 什么是最佳路径&#xff1f; 1.4 图抽象 1.5 选路算法分类 1.6 链路状态&#xff08;LS&#xff0…

[附源码]计算机毕业设计springboot飞越青少儿兴趣培训机构管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

手把手教你构建一个前端路由

涉及知识点&#xff1a;location对象、history对象 文章目录基础概念什么是路由如何实现前端路由涉及问题前端路由实现方式1. hash方式2. history方式3. debug&#xff1a;本地起服务报错扩展&#xff1a;封装路由类Routerhashhistory基础概念 什么是路由 路由是一组映射关系…

51单片机学习笔记4 新建工程及点亮LED实战

51单片机学习笔记4 新建工程及点亮LED实战一、使用keil新建工程二、项目设置1. 点击魔术棒&#xff0c;钩选Output-Create Hex File2. 设置仿真器三、编写代码1. 尝试编译代码2. 点亮LED的代码3. GPIO引脚介绍4. GPIO内部结构P0端口&#xff1a;P1 端口四、软件仿真一、使用kei…

[附源码]SSM计算机毕业设计校园爱心支愿管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

台积电跪舔美国,日本却醒悟了而选择独立发展芯片产业

近期台积电大举包机10架将精英人才和设备转往美国引发争议&#xff0c;然而这个时候日本却选择了独立发展芯片产业的道路&#xff0c;摆脱美国的限制&#xff0c;显然日本清醒地认识到依赖美国不会有好结果。台积电之前还在左右摇摆&#xff0c;希望既能继续获得美国芯片的订单…

字符串压缩(一)之ZSTD

一、zstd压缩与解压 ZSTD_compress属于ZSTD的Simple API范畴&#xff0c;只有压缩级别可以设置。 ZSTD_compress函数原型如下&#xff1a; size_t ZSTD_compress(void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel) ZSTD_decompress函数原…

全网首发克莱斯勒东南大捷龙jeep道奇DIY数码碟盒增加USB和蓝牙播放音乐功能使用原车接口无损改装

文章目录前言碟盒功能1、设计指标3、外观设计4、PCB设计5、程序设计6、调试7、大捷龙车机尾插接口定义公头东南大捷龙车机白色插头模块与白色插头连接方法8、安装方法9、 使用方法9.1 CD车机按钮功能定义11、 联系我前言 ​ 之前写过四篇关于车机增加音频输入的方法。 1、07宝…