C++ 数据类型
在C++编程中,数据类型用于定义变量可以存储的数据的性质以及在内存中占用的空间。每种数据类型都有其特定的内存占用大小和取值范围,编写代码时需要根据需求选择适当的数据类型来确保程序的正确性和效率。
1. 基本数据类型
C++提供了多种基本数据类型,每种类型都有一个关键词表示。这些类型包括:
- 布尔型(bool):用于表示真或假(true/false)。
- 字符型(char):用于存储单个字符。
- 整型(int):用于存储整数。
- 浮点型(float):用于存储小数,精度较低。
- 双浮点型(double):用于存储小数,精度高于float。
- 无类型(void):表示没有数据;通常用于函数返回不带任何值的情况。
- 宽字符型(wchar_t):用于存储Unicode字符,适合处理国际化字符集。
修饰符
C++允许对基本数据类型进行修饰,以改变其属性如符号、大小等。常见的修饰符有:
- signed:有符号,默认情况下大多数整型都为有符号。
- unsigned:无符号,只能表示非负值。
- short:表示短整型,通常占用更少的字节(如2字节)。
- long:表示长整型,通常占用更多字节(如4或8字节)。
内存占用和取值范围
文中提到的各种数据类型的内存占用和取值范围显示了不同数据类型的特性。例如,int通常在32位系统上占用4字节,而long long则占用8字节,用于存储大范围整数。
注意:不同操作系统和编译器可能会影响数据类型的大小,因此在跨平台开发时应谨慎处理。
在C++中,sizeof
运算符用于确定一个变量或数据类型在内存中所占用的字节数。它是编译时运算符,其结果在编译时就已经确定,而不是在运行时。
sizeof
的基本用法
sizeof
可以用于以下几种情况:
-
数据类型:
sizeof
可以直接应用于数据类型,返回该类型变量所占用的字节数。sizeof(int); // 返回 int 类型的字节数 sizeof(double); // 返回 double 类型的字节数
-
变量:
sizeof
也可以用于变量,返回该变量所占用的字节数。int a; sizeof(a); // 返回变量 a 的字节数
-
表达式:
sizeof
可以应用于表达式,但它不会计算表达式,而是返回表达式结果类型所占用的字节数。sizeof(1 + 2); // 返回 int 类型的字节数,因为 1 + 2 的结果是 int 类型
示例代码
//以下是一个使用 `sizeof` 的示例:
#include <iostream>
int main() {
std::cout << "Size of char: " << sizeof(char) << " byte(s)" << std::endl;
std::cout << "Size of int: " << sizeof(int) << " byte(s)" << std::endl;
std::cout << "Size of float: " << sizeof(float) << " byte(s)" << std::endl;
std::cout << "Size of double: " << sizeof(double) << " byte(s)" << std::endl;
int arr[10];
std::cout << "Size of array of 10 ints: " << sizeof(arr) << " byte(s)" << std::endl;
struct MyStruct {
int a;
char b;
double c;
};
std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " byte(s)" << std::endl;
return 0;
}
这段代码将输出各种数据类型和自定义结构体在当前平台上的内存占用情况。
注意事项
sizeof
运算符不会考虑变量的内容,它只关心类型。- 对于数组,
sizeof
返回整个数组所占用的字节数,而不是单个元素的大小。 - 对于指针,
sizeof
返回指针本身的大小,而不是它所指向的数据的大小。在大多数现代平台上,指针的大小通常是 4 字节(32 位系统)或 8 字节(64 位系统)。
了解sizeof
运算符对于理解内存布局和性能优化都是非常重要的。
2. typedef 声明
typedef用于定义新类型的别名。这使得代码更加可读。在某些情况下,我们可能会给复杂类型起一个简单的名字,以提高可维护性。
typedef int feet; // 创建一个别名
feet distance; // 使用别名创建整型变量
3. 枚举类型
枚举类型是一种自定义数据类型,适用于限制变量的取值范围。当变量可能只有几个固定值时,可以使用枚举来提高代码的可读性和安全性。
enum color { red, green = 5, blue }; // green 被赋值为5,blue 自动为6
4. 类型转换
C++支持多种类型转换,这些转换主要分为以下四类:
- 静态转换(static_cast):在编译时检查类型是否兼容,通常用于相似类型之间转换。
- 动态转换(dynamic_cast):在运行时进行类型检查,常用于多态性场景。
- 常量转换(const_cast):用于去掉对象的常量性。
- 重新解释转换(reinterpret_cast):直接将一种类型的指针转换为另一种类型,没有类型安全性,容易引发错误。
总结
理解C++中的数据类型是编写高效和可靠程序的基础。选择合适的数据类型能够帮助程序员避免潜在的错误并提高程序的性能。
2. C++ 中的标记类型
以下是 C++ 中常见的几种标记类型及其用途:
1. 标识符(Identifiers)
标识符用于为程序中的变量、函数、类或结构等实体命名,确保它们的唯一可识别性。选择恰当的标识符是编写易读、易维护代码的关键。
-
定义:标识符是赋予程序实体的唯一名称。
-
示例:
std::string first_name = "Raju";
命名规则:
-
必须以字母或下划线(_)开头。
-
可以包含字母(A-Z, a-z)、数字(0-9)和下划线(_)。
-
不能使用空格和特殊字符。
-
不能与关键字同名。
-
在其作用域内必须唯一。
-
区分大小写。
-
有效与无效标识符示例:
- 有效:
_name
,number89
,_surname_
- 无效:
#name
,2num
,first name
,string
- 有效:
2. 关键字(Keywords)
关键字是 C++ 语言的保留字,具有特定的语言意义和功能,不能用作标识符。
- 示例:
int
,class
,if
,while
等。 - 数量:C++ 中共有 95 个关键字。
3. 常量(Constants)
常量是在程序执行过程中其值不变的量。在 C++ 中,常量可以通过 const
关键字或 #define
预处理器定义。
- 使用
const
定义:const int MAX_VALUE = 100;
- 使用
#define
定义:#define PI 3.14159
4. 字符串(Strings)
字符串在 C++ 中不是基本数据类型,而是标准模板库(STL)中的一个类,用于处理文本数据。
- 声明:
std::string variableName;
- 初始化:
std::string greeting = "Hello, World!";
5. 特殊符号(Special Symbols)
特殊符号在 C++ 语法中具有特定的含义,用于执行各种编程任务。
常见符号:
- 分号(;):语句结束。
- 方括号([]):数组索引。
- 花括号({}):代码块。
- 冒号(:):范围解析、构造函数初始化。
- 点(.):成员访问。
- 等号(=):赋值。
- 双引号(" "):字符串字面量。
- 单引号(’ '):字符字面量。
6. 运算符(Operators)
运算符是C++语言的核心组成部分,它们用于执行各种操作,如算术运算、比较、赋值等。
1. 位运算符:
位运算符是C++中用于直接操作整数类型数据中各个位的运算符。位运算符通常用于底层编程,如系统编程、嵌入式开发、网络编程等,它们可以直接对内存中的位进行操作,从而实现高效的性能优化。
- 位与(
&
) - 位或(
|
) - 位异或(
^
) - 左移(
<<
) - 右移(
>>
)
1. 按位与(&)
描述:按位与运算符对两个操作数的每一位进行逻辑与操作。如果两个相应的位都为1,则结果位为1,否则为0。
语法:result = operand1 & operand2;
示例:
int a = 0b1010; // 二进制表示为 10
int b = 0b1100; // 二进制表示为 12
int result = a & b; // 结果为 0b1000,即 8
2. 按位或(|)
描述:按位或运算符对两个操作数的每一位进行逻辑或操作。如果两个相应的位中至少有一个为1,则结果位为1,否则为0。
语法:result = operand1 | operand2;
示例:
int a = 0b1010; // 二进制表示为 10
int b = 0b1100; // 二进制表示为 12
int result = a | b; // 结果为 0b1110,即 14
3. 按位异或(^)
描述:按位异或运算符对两个操作数的每一位进行逻辑异或操作。如果两个相应的位不同,则结果位为1,如果相同,则结果位为0。
语法:result = operand1 ^ operand2;
示例:
int a = 0b1010; // 二进制表示为 10
int b = 0b1100; // 二进制表示为 12
int result = a ^ b; // 结果为 0b0110,即 6
4. 按位取反(~)
描述:按位取反运算符对操作数的每一位进行取反操作。即将每一位的0变为1,1变为0。
语法:result = ~operand;
示例:
int a = 0b1010; // 二进制表示为 10
int result = ~a; // 结果为 0b0101,但在补码表示下为 -11
5. 左移(<<)
描述:左移运算符将操作数的所有位向左移动指定的位数。左移时,右侧空出的位用0填充。
语法:result = operand << num_bits;
示例:
int a = 0b1010; // 二进制表示为 10
int result = a << 2; // 结果为 0b101000,即 40
6. 右移(>>)
描述:右移运算符将操作数的所有位向右移动指定的位数。对于无符号类型,左侧空出的位用0填充;对于有符号类型,左侧空出的位通常用符号位(即最高位)的副本填充,这个过程称为算术右移。
语法:result = operand >> num_bits;
示例:
int a = 0b1010; // 二进制表示为 10
int result = a >> 1; // 结果为 0b0101,即 5
unsigned int b = 0b1010; // 二进制表示为 10
unsigned int result2 = b >> 1; // 结果也是 0b0101,即 5
注意事项
- 位运算符只能用于整数类型(包括字符类型),不能用于浮点类型。
- 使用位运算符时,操作数通常会被转换为补码形式。
- 在进行位移操作时,要确保位移的位数不超过操作数类型的位数限制,否则结果是未定义的。
- 位运算符通常与位掩码一起使用,以设置、清除或检查特定的位。
赋值运算符(如 =
):将右侧操作数的值赋给左侧操作数。
复合赋值运算符(如 +=
, -=
, *=
, /=
等):执行算术运算并赋值。
2. 一元运算符(Unary Operators)
一元运算符只作用于一个操作数。C++中的一元运算符包括:
- 递增运算符(
++
):增加操作数的值,然后返回增加后的值。- 前缀形式:
++x
,先增加再使用。 - 后缀形式:
x++
,先使用再增加。
- 前缀形式:
- 递减运算符(
--
):减少操作数的值,然后返回减少后的值。- 前缀形式:
--x
,先减少再使用。 - 后缀形式:
x--
,先使用再减少。
- 前缀形式:
- 逻辑非运算符(
!
):如果操作数为真(非零),则返回假(0);如果操作数为假,则返回真。 - 位非运算符(
~
):对操作数的每一位进行取反操作。 - 取地址运算符(
&
):返回操作数的内存地址。 - 间接寻址或解引用运算符(
*
):用于指针,返回指针指向的变量的值。 - 正号运算符(
+
):返回操作数的正值。 - 负号运算符(
-
):返回操作数的负值。 - 类型转换运算符(如
static_cast<type>
):将操作数转换为指定的类型。
3. 二元运算符(Binary Operators)
二元运算符作用于两个操作数。C++中的二元运算符包括:
算术运算符:
- 加法(
+
):返回两个操作数的和。 - 减法(
-
):返回两个操作数的差。 - 乘法(
*
):返回两个操作数的乘积。 - 除法(
/
):返回第一个操作数除以第二个操作数的结果。 - 取模(
%
):返回第一个操作数除以第二个操作数的余数。
关系运算符:
- 小于(
<
) - 大于(
>
) - 小于等于(
<=
) - 大于等于(
>=
) - 等于(
==
) - 不等于(
!=
)
逻辑运算符:
- 逻辑与(
&&
):如果两个操作数都为真,则结果为真。 - 逻辑或(
||
):如果至少有一个操作数为真,则结果为真。
4. 三元运算符(Ternary Operator)
C++中只有一个三元运算符,它是一个条件表达式,其形式如下:
三元运算符(? :
):
- 语法:
condition ? expression1 : expression2
- 如果
condition
为真,则返回expression1
的值;否则返回expression2
的值。
运算符的使用是C++编程的基础,理解和熟练运用各种运算符对于编写高效和正确的代码至关重要。
好的,这篇文章就分享到这里。如有任何遗漏或错误之处,欢迎指正,感谢您的阅读!希望这篇详细讲解能帮助您更好地理解C++的数据类型!