先导:
目录
一、整形
二、浮点型
!保留指定小数位数
三、布尔类型
关系运算
逻辑运算
C++逻辑运算四句口诀
四、字符型
ASCll码
C++中的字符表示
字符比较
ASCII中的常用转换
大小写转换
转换成0~25
五、数据类型隐式转换
1. 隐式转换的通用规则
2. 隐式转换的优先级
示例:算术运算时的隐式转换
3. 整数提升(Integer Promotion)
4. 算术转换(Arithmetic Conversion)
一、整形
我们平常最常见的整形是int,它占4个字节 ,也就是32比特,可表示的范围为~
,如果是 unsigned int,即没有负数区间,表示范围为
~
。
cout << sizeof(int) << endl << sizeof(1234)输出:
4
4
如果我们存储的数字范围超过int了,那么我们就可以使用long long。long long占8个字节
cout << sizeof(123456789123456789) << endl << sizeof(long long);输出:
8
8
有的时候我们需要把int转换为long long,我们可以将一个数字乘上1LL或者加上后缀ll或LL。
cout << sizeof(1234 * 1LL);
输出:
8
在实际编程过程中,如果需要多次使用 long long,我们可以通过 typedef 关键字将 long long 重命名为 ll
使用格式:typedef long long ll;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a;
int main(){cin >> a;cout << sizeof(a);return 0;
}
输出:
8
另外,在C++ primer是这样规定的:sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long),但是各个数据类型的具体长度,则是由编译器自行决定的。
在我们考试的系统中,short 占 2 个字节,long 占 8 个字节。
二、浮点型
名称 | 数据类型 | 字节数 | 数据范围 | 有效位数 |
---|---|---|---|---|
单精度浮点数 | float | 4B | -3.4e38~3.4e38 | 6~7位 |
双精度浮点数 | double | 8B | -1.7e308~1.7e308 | 15~16位 |
长双精度浮点数 | long double | 16B | -1.2e4932~1.2e4932 | 18~19位 |
float 占 4 字节,保留有效位数 7 位,double 占 8 字节,保留有效位数 16 位。一般在算法竞赛中,我们都使用 double。
其中,浮点型默认为double类型,跟long long一样,也可以通过后缀f、F(单精度浮点型)、L(长双精度浮点型)。
cout << sizeof(1.11) << endl;
cout << sizeof(1.11f) << endl;
cout << sizeof(1.11F) << endl;
cout << sizeof(1.11L) << endl;输出:
8
4
4
16
!保留指定小数位数
注意:
- 使用setprecision保留小数位数时,需要引入头文件
#include <iomanip>
- 必须加 fixed,否则实际输出位数可能会小于指定保留位数。
- 以上所有格式化控制符只对紧跟在其后的数据有作用。
#include <iostream>
#include <iomanip>
using namespace std;
const double P = 3.1415;
int main(){cout << P << endl;cout << setprecision(5) << P << endl; //错误示范,此处必须要加fixedcout << setprecision(6) << 3.14159265358 << endl;cout << fixed << setprecision(3) << P << endl;cout << fixed << setprecision(5) << P << endl;return 0;
}
输出为:
3.1415
3.1415
3.14159
3.142
3.14150
三、布尔类型
名称 | 数据类型 | 字节数 | 数值范围 |
---|---|---|---|
布尔 | bool | 1B | true或false |
布尔变量声明和赋值:
bool a = true, b = false;
bool a, b;
bool a = 0, b = 1;
//注意,同之前的一样,每个变量只能被定义声明一次,这里只是为了方便演示
输出的bool类型,并不会输出true或者false,而是输出1或0,其中,true是1,false是0。一个非零数定义成bool的时候为true,但输出是1!!!
cout << bool(0.2) << endl; //输出:1
bool a = -1, b = 0;
cout << a << " " << b; //输出:1 0
int c = bool(3), d = false;
cout << c << " " << d << endl; //输出1 0
关系运算
大小关系 | C++关系运算符 | 数学符号 |
---|---|---|
大于 | > | |
小于 | < | |
大于等于 | >= | |
小于等于 | <= | |
等于 | == | |
不等于 | != |
重点来了:
数值A 关系运算符 数值B(表达式的值:布尔值)
什么意思呢?让我们来看几个例子
比如表达式
1 > 2
1显然比2小,所以这个表达式的值为false(否)
(a = 3) == 3
这个式子中,先把a赋值成了3,再判断a是不是等于3,这个结果肯定是true
有一个比较容易判断错的式子:(1 < 2)== false
这个式子的值为false。首先,我们先解析括号中的式子:1<2,这个式子的结果肯定为真,而真与假矛盾了,所以这个式子肯定为假
记住这个四句口诀,轻松搞定多重关系运算符的真假判断:
🎯 口诀速记
- 括号优先算(先算括号内)
- 比较从左看(同级从左到右)
- 赋值返右边(
=
返回赋值结果) - 真值对比干(
true/false
直接比)
🌰 例子秒懂
(a=3)==3
→ 真(口诀3:赋值返右边,a=3
返回3
,再比3==3
)(1<2)==false
→ 假(口诀1+4:先算1<2
得true
,再比true==false
)
**⚡ 避坑提醒**
- 小心**赋值
=
和比较==
**别混淆! - 遇到
<
、>
等比较符,从左到右依次算。
用这口诀,再复杂的表达式也能秒拆解! ✨
逻辑运算
逻辑运算符 | 含义 |
---|---|
&& | 逻辑与,如果两个表达式的值都为真,就返回真,否则,就返回假 |
|| | 逻辑或,两个表达式有一个表达式的值为真,就返回真 |
! | 逻辑非,如果表达式为真,就返回假。表达式为假,就返回真 |
逻辑运算真值表(1表示表达式的值为真,0表示假):
A | B | A && B | A || B | A ! B |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 1 |
重点又又又来了🙂:
布尔值A 逻辑运算符 布尔值B(表达式的值:布尔值)
大家一定要牢记于心,我们来看看一些例题:
判断一个数a是否满足,有很多初学者会这样写:
2 <= a <= 17
但这是大错特错的,在C++中,程序是顺序执行的,它会先执行2<=a,不论结果如何,返回的一定是一个布尔值,可布尔值如何跟17进行比较,所以我们要用上逻辑运算符,这样写:
2 <= a && a <= 17
只有两种条件都满足了,也就是满足了,结果才为真。
判断一个数是否是3或5的倍数:
a % 3 == 0 || a % 5 == 0
C++逻辑运算四句口诀
- "非先算,与或后"(
!
>&&
>||
) - "或一真,与全真"(
||
一真即真,&&
全真才真) - "区间判,与相连"(
a>=2 && a<=17
) - "整除判,或相连"(
num%3==0 || num%5==0
)
🌰 例子秒懂
!flag && (x>5)
→ 先算!flag
,再算&&
(口诀1)age>=18 || score>90
→ 满足一个即真(口诀2)2<=a && a<=17
→ 区间必须用&&
(口诀3)n%3==0 || n%5==0
→ 3或5的倍数(口诀4)
⚡ 核心:优先级+短路求值+区间写法,四句搞定所有逻辑判断! ✨
在写逻辑表达式时,一定要注意优先级,如果优先级靠后的那个运算符,一定要加括号!
对于布尔类型,需要研究的知识有很多,这对于以后的基础都非常重要,小编之后也会带着大家一起练习。
四、字符型
字符常量是由单个字符组成,所有字符采用 ASCII 编码,通用 ASCII 编码共有 128 个字符。在程序中通常用一对单引号将单个字符括起来表示一个字符常量。如:'a','0','A'。
名称 | 数据类型 | 字节数 | 数据范围 |
---|---|---|---|
字符 | char | 1B | -128~127 |
无符号字符 | unsigned char | 1B | 0~255 |
ASCll码
ASCII码:它是一种基础的字符编码标准,用7位二进制数(即0~127的十进制范围)表示128个字符。
- 标准ASCII(0~127):
- 0~31:控制字符(如换行
\n
、制表符\t
、回车\r
等)。 - 32~126:可打印字符:
- 32:空格(
- 48~57:数字
0
到9
- 65~90:大写字母
A
到Z
- 97~122:小写字母
a
到z
- 其他:标点符号(如
!
,@
,#
等)。
- 32:空格(
- 127:删除控制字符(DEL)。
- 0~31:控制字符(如换行
- 扩展ASCII(128~255):非标准,依赖系统(如Windows-1252),表示特殊符号(如
é
,©
等)。
C++中的字符表示
char a = 'A';//存储ASCII值65
cout << a << endl;
char a = 65;//定义a在ASCII中为A
cout << a;输出:
A
A
我们可以使用转义字符,来实现一些输出(不要求掌握后两个)
名称 | 字符形式 | 值 |
---|---|---|
换行 | \n | 0X0A |
水平制表 | \t | 0X09 |
反斜杠 | \\ | 0X5C |
#include <bits/stdc++.h>
using namespace std;
int main(){cout << "大家好\n我是\t小猫\\";return 0;
}
大家可以运行看看
字符比较
这部分就要用到之前讲过的关系运算了,大家可以复习一下。(注意,这里我们所讲的是字符,不是字符串,字符串之间的比较方式为字典序)
字符比较和数字之前的比较一样,都是返回表达式的值为真还是假,但是字符比较的不是字符,而是ASCII中字母所代表的数字,举一些例子:
- 表达式'a'>'b'的值,a在ASCII中为97, b为98,a应该比b小,这个表达式的值为假
- '0'<'2',这个的值显然为真,因为48<50
在这里要补充一点,字符和字符之间是可以进行运算的,参与运算的也是每个字母代表的ASCII值,结果也是数字,如'b'+1的结果是99。
ASCII中的常用转换
大小写转换
我们可以根据ASCII中的规律进行大小写转换,我们可以发现,大写字母和小写字母之间ASCII值只差了32(注意,小写字母转化成大写字母时,需要减去32,反之,则加上32),这样,就实现了C++中的大小写转换。
#include <bits/stdc++.h>
using namespace std;
int main(){char a = 'A';char b = a + 32;cout << a << endl << b;return 0;
}
转换成0~25
有时,我们为了看起来更方便一些,可以把字母转换成对应的0~25。怎么操作呢?对于小写字母,我们只要把对应的字母减去一个'a';对于大写字母,我们我们只要把对应的字母减去一个'A'
#include <bits/stdc++.h>
using namespace std;
int main(){char a = 'C';cout << a - 'A' << endl;char b = 'c';cout << b - 'a' << endl;
}
注意!!!ASCII只针对于英文,中文无效
五、数据类型隐式转换
隐式转换是指在编程语言中,由编译器自动执行的类型转换过程,而无需显式指定。这种转换是为了保持操作的一致性,使不同类型的数据能够在一些特定的上下文中进行运算或操作。隐式转换通常涉及到较小范围数据类型向较大范围数据类型的转换,以避免数据丢失或提高精度。
1. 隐式转换的通用规则
隐式转换通常发生在以下情况:
- 赋值时(
=
) - 算术运算时(
+
,-
,*
,/
) - 函数调用时(参数类型不匹配)
- 初始化时(如
int x = 3.14;
)
编译器会按照从低精度到高精度、从小范围到大范围的原则自动转换数据类型,以避免数据丢失。
2. 隐式转换的优先级
C++的隐式转换遵循类型提升(Type Promotion)规则,优先级如下(从低到高):
数据类型 | 提升方向 | 示例 |
---|---|---|
bool | → int | true → 1 , false → 0 |
char , short | → int | 'A' → 65 |
int | → unsigned int | -1 → 4294967295 (32位系统) |
int | → long | int → long (如果 int 范围不足) |
int | → float | 5 → 5.0f |
float | → double | 3.14f → 3.14 |
double | → long double | 3.14 → 3.14L |
示例:算术运算时的隐式转换
int a = 5;
float b = 3.14f;
auto result = a + b; // int → float(a提升为float)
cout << result; // 输出 8.14(float类型)
3. 整数提升(Integer Promotion)
在算术运算中,比 int
小的整型(如 char
、short
)会被提升为 int
:
char c = 'A'; // ASCII 65
short s = 100;
auto sum = c + s; // char → int, short → int(运算结果为int)
cout << sum; // 输出 165(int类型)
4. 算术转换(Arithmetic Conversion)
如果两个操作数类型不同,C++会按照以下规则转换:
- 如果有一个操作数是
long double
,另一个转换为long double
。 - 否则,如果有一个操作数是
double
,另一个转换为double
。 - 否则,如果有一个操作数是
float
,另一个转换为float
。 - 否则,进行整数提升(
char
/short
→int
),然后按以下规则转换:- 如果一个是
unsigned long
,另一个转换为unsigned long
。 - 如果一个是
long
,另一个是unsigned int
:- 如果
long
能表示所有unsigned int
值,则unsigned int
→long
。 - 否则,两者都转换为
unsigned long
。
- 如果
- 如果一个是
long
,另一个转换为long
。 - 否则,如果一个是
unsigned int
,另一个转换为unsigned int
。 - 否则,两者都转换为
int
。
- 如果一个是
这就是所以内容了,内容较多,大家需要多多理解。下期我们一起练习,掌握它😄
整篇文章码字不易,大家能不能点个赞💗呢,谢谢
有什么问题可以在评论区讨论👬
备注:文章中有部分图片来自于百度