- 基本数据类型
- 整数类型(Integral Types)
int
(整型)- 这是最常用的整数类型,通常用于存储一般范围的整数值。在32位系统中,
int
类型一般占用4个字节,取值范围大约是 - 2147483648到2147483647。例如,int age = 25;
用于存储人的年龄。
- 这是最常用的整数类型,通常用于存储一般范围的整数值。在32位系统中,
short
(短整型)- 占用的内存空间比
int
小,通常为2个字节,适用于存储范围较小的整数。例如,short temperature = -10;
可用于存储温度等范围相对较小的整数,其取值范围大约是 - 32768到32767。
- 占用的内存空间比
long
(长整型)- 用于存储较大范围的整数。在32位系统中,
long
通常占用4个字节,和int
大小相同,但在64位系统中,long
可能占用8个字节,取值范围更宽。例如,long population = 10000000000L;
(注意后面的L
后缀用于表示长整数常量)可用于存储人口数量等较大的整数值。
- 用于存储较大范围的整数。在32位系统中,
long long
(长长整型)- 这是C++11新增的类型,一般占用8个字节,能存储更大范围的整数。例如,
long long bigNumber = 9223372036854775807LL;
(注意后面的LL
后缀用于表示长长整数常量),其取值范围大约是 - 9223372036854775808到9223372036854775807。
- 这是C++11新增的类型,一般占用8个字节,能存储更大范围的整数。例如,
unsigned
修饰符(无符号整数类型)- 当在整数类型前加上
unsigned
时,变量只能存储非负整数,其取值范围从0开始。例如,unsigned int count = 0;
用于计数等场景,unsigned int
在32位系统中的取值范围是0到4294967295。
- 当在整数类型前加上
- 浮点数类型(Floating - Point Types)
float
(单精度浮点数)- 占用4个字节的内存,用于存储单精度浮点数。例如,
float height = 1.75f;
(注意后面的f
后缀用于表示单精度浮点数常量)用于存储人的身高。float
类型的有效数字位数相对较少,大约为6 - 7位。
- 占用4个字节的内存,用于存储单精度浮点数。例如,
double
(双精度浮点数)- 占用8个字节的内存,能提供更高的精度,用于存储双精度浮点数。例如,
double pi = 3.141592653589793;
用于存储圆周率等需要高精度的数值。double
类型的有效数字位数大约为15 - 16位。
- 占用8个字节的内存,能提供更高的精度,用于存储双精度浮点数。例如,
long double
(长双精度浮点数)- 占用的字节数和精度因编译器和系统而异,通常比
double
有更高的精度。例如,在一些系统中,long double
可能占用10或16个字节,用于特殊的高精度计算场景。
- 占用的字节数和精度因编译器和系统而异,通常比
- 字符类型(Character Types)
char
(字符型)- 用于存储单个字符,占用1个字节的内存。例如,
char grade = 'A';
用于存储学生成绩等级等单个字符。字符在内存中是以ASCII码(美国信息交换标准代码)或者其他字符编码(如UTF - 8)的形式存储的,在ASCII码中,字符'A'
对应的十进制值是65。
- 用于存储单个字符,占用1个字节的内存。例如,
wchar_t
(宽字符型)- 用于存储宽字符,通常用于处理Unicode字符。其大小和编码方式取决于编译器和系统,一般占用2或4个字节。例如,
wchar_t unicodeChar = L'你';
(注意前面的L
前缀用于表示宽字符常量)用于存储中文字符等宽字符。
- 用于存储宽字符,通常用于处理Unicode字符。其大小和编码方式取决于编译器和系统,一般占用2或4个字节。例如,
- 整数类型(Integral Types)
- 复合数据类型
- 数组(Arrays)
- 定义和初始化:数组是一组相同类型的数据元素的集合。例如,
int numbers[5];
定义了一个包含5个int
类型元素的数组。可以在定义时进行初始化,如int anotherNumbers[3] = {1, 2, 3};
。数组的元素通过下标访问,下标从0开始,例如numbers[0]
表示数组numbers
的第一个元素。 - 用途:用于存储和处理一组相关的数据。例如,存储学生的成绩
int scores[30];
,或者存储图像的像素颜色值等。
- 定义和初始化:数组是一组相同类型的数据元素的集合。例如,
- 结构体(Structures)
- 定义和组成:结构体是一种用户自定义的数据类型,它可以包含不同类型的数据成员。例如:
定义了一个名为struct Student { int id; char name[20]; float gpa; };
Student
的结构体,包含学生的学号、姓名和平均绩点。可以通过Student student1; student1.id = 1; strcpy(student1.name, "John"); student1.gpa = 3.5;
来创建和初始化结构体变量。- 用途:用于将多个相关的数据组合在一起,方便管理和操作。例如,在处理学生信息、员工信息等复杂的数据结构时非常有用。
- 联合体(Unions)
- 定义和特点:联合体是一种特殊的复合数据类型,它的所有成员共享同一块内存空间。例如:
定义了一个名为union Data { int i; float f; char c; };
Data
的联合体。在某一时刻,联合体只能存储其中一个成员的值。例如,Data data; data.i = 10;
此时内存中存储的是整数10,如果接着使用data.f = 3.14;
,那么之前存储的整数10就会被覆盖,内存中存储的是浮点数3.14。- 用途:主要用于节省内存空间,当多个数据类型不会同时使用时,可以使用联合体。例如,在某些嵌入式系统或者对内存要求苛刻的场景中,对于一些可能是不同类型但不会同时出现的数据可以使用联合体来存储。
- 枚举(Enums)
- 定义和取值:枚举是一种用户自定义的数据类型,用于定义一组命名的常量。例如:
定义了一个名为enum Color { RED, GREEN, BLUE };
Color
的枚举类型,其中包含RED
、GREEN
和BLUE
三个枚举常量。默认情况下,RED
的值为0,GREEN
的值为1,BLUE
的值为2,也可以显式地指定枚举常量的值,如enum Color {RED = 1, GREEN = 2, BLUE = 3};
。- 用途:用于提高程序的可读性。例如,在一个图形绘制程序中,使用枚举
Color
来表示颜色,比使用整数0、1、2来表示不同颜色更加清晰,并且可以防止非法的值被使用。
- 数组(Arrays)
- 指针类型(Pointer Types)
- 定义和表示:指针是一个变量,其值是另一个变量的地址。例如,
int num = 10; int* ptr = #
,这里ptr
是一个指针,它存储了变量num
的地址。指针的类型必须与它所指向的变量类型相匹配,如int*
指向int
类型的变量,float*
指向float
类型的变量。 - 用途:可以用于动态内存分配、访问数组元素、函数参数传递等多种场景。例如,在动态内存分配中,
int* dynamicArray = new int[5];
可以创建一个包含5个int
类型元素的动态数组。在函数参数传递中,使用指针可以在函数内部修改函数外部变量的值。
- 定义和表示:指针是一个变量,其值是另一个变量的地址。例如,
- 引用类型(Reference Types)
- 定义和特性:引用是一个别名,它必须在定义时初始化,并且之后不能再引用其他对象。例如,
int originalVariable = 10; int& referenceVariable = originalVariable;
,这里referenceVariable
是originalVariable
的引用,对referenceVariable
的操作实际上就是对originalVariable
的操作。 - 用途:常用于函数参数传递,避免函数参数的拷贝,提高效率。例如,
void function(int& parameter) {...}
,在函数内部对parameter
的操作会直接影响到传递进来的变量。
- 定义和特性:引用是一个别名,它必须在定义时初始化,并且之后不能再引用其他对象。例如,
表达式
- 基本算术运算符
- C++提供了基本的算术运算符,包括加法(
+
)、减法(-
)、乘法(*
)、除法(/
)和取模(%
)。 - 加法和减法:例如,
int a = 5 + 3;
计算结果为8
,int b = 10 - 4;
结果为6
。这些运算符可以用于整数、浮点数等数值类型。 - 乘法和除法:
int c = 2 * 3;
得到6
,对于除法,int d = 10 / 3;
在整数除法中结果为3
,因为整数除法会舍去小数部分。如果是浮点数相除,如double e = 10.0 / 3.0;
结果为3.333333
(具体精度取决于数据类型)。 - 取模:取模运算符
%
返回除法运算的余数。例如,int f = 10 % 3;
结果为1
,常用于判断一个数是否能被另一个数整除等场景。
- C++提供了基本的算术运算符,包括加法(
- 算术表达式中的类型转换
- 自动类型转换(隐式类型转换):当不同类型的数据进行算术运算时,C++会自动进行类型转换。一般是将取值范围较小的类型转换为取值范围较大的类型。例如,在表达式
int a = 3; double b = 2.5; double c = a + b;
中,a
会自动转换为double
类型后再进行加法运算,结果c
为5.5
。 - 强制类型转换(显式类型转换):可以使用
(type)
或type()
(对于一些类型转换函数)的形式进行强制类型转换。例如,int a = (int)3.7;
结果为3
,将double
类型的3.7
强制转换为int
类型,会舍去小数部分。不过,强制类型转换可能会导致数据精度丢失或其他错误,应谨慎使用。
- 自动类型转换(隐式类型转换):当不同类型的数据进行算术运算时,C++会自动进行类型转换。一般是将取值范围较小的类型转换为取值范围较大的类型。例如,在表达式
- 关系表达式
- 关系运算符
- C++中的关系运算符用于比较两个值的大小关系,包括等于(
==
)、不等于(!=
)、大于(>
)、小于(<
)、大于等于(>=
)和小于等于(<=
)。 - 例如,
int a = 5; int b = 3; bool c = a > b;
这里c
的值为true
,因为5
大于3
。关系表达式的结果是bool
类型,即true
或false
。
- C++中的关系运算符用于比较两个值的大小关系,包括等于(
- 使用场景和注意事项
- 关系表达式常用于条件判断,如
if
语句和while
语句等。例如,if (a == b) {... }
判断a
和b
是否相等。需要注意的是,在使用==
和!=
时,容易与赋值运算符=
混淆。例如,if (a = b)
是一个赋值操作,会将b
的值赋给a
,并且整个表达式的值为a
的值,通常这不是我们想要的比较操作,应该仔细检查代码以避免这种错误。
- 关系表达式常用于条件判断,如
- 关系运算符
- 逻辑表达式
- 逻辑运算符
- C++有三种逻辑运算符:逻辑与(
&&
)、逻辑或(||
)和逻辑非(!
)。 - 逻辑与(
&&
):只有当两个操作数都为true
时,结果才为true
。例如,bool a = true; bool b = false; bool c = a && b;
结果为false
。逻辑与运算符还有一个短路特性,即当第一个操作数为false
时,不会计算第二个操作数,因为结果已经确定为false
。 - 逻辑或(
||
):只要两个操作数中有一个为true
,结果就为true
。例如,bool d = a || b;
结果为true
。逻辑或运算符也有短路特性,当第一个操作数为true
时,不会计算第二个操作数,因为结果已经确定为true
。 - 逻辑非(
!
):用于对一个bool
值取反。例如,bool e =!a;
结果为false
。
- C++有三种逻辑运算符:逻辑与(
- 逻辑表达式的嵌套和优先级
- 逻辑表达式可以嵌套使用,例如,
bool f = (a && b) || (!c);
。在计算逻辑表达式时,逻辑非!
的优先级最高,其次是逻辑与&&
,最后是逻辑或||
。可以使用括号来改变运算顺序,以确保表达式按照期望的方式计算。
- 逻辑表达式可以嵌套使用,例如,
- 逻辑运算符
- 赋值表达式
- 赋值运算符
- 基本的赋值运算符是
=
,用于将一个值赋给一个变量。例如,int a = 5;
将5
赋给变量a
。此外,还有复合赋值运算符,如+=
、-=
、*=
、/=
和%=
。例如,a += 3;
等价于a = a + 3;
,这些复合赋值运算符可以简化代码并提高代码的执行效率。
- 基本的赋值运算符是
- 赋值表达式的左值和右值概念
- 在赋值表达式中,左边的操作数必须是一个左值,即可以出现在赋值运算符左边的表达式,它通常是一个变量。右边的操作数可以是一个右值,即可以出现在赋值运算符右边的表达式,它可以是一个常量、变量或表达式的结果。例如,
5 = a;
是错误的,因为5
是一个常量,不是左值。
- 在赋值表达式中,左边的操作数必须是一个左值,即可以出现在赋值运算符左边的表达式,它通常是一个变量。右边的操作数可以是一个右值,即可以出现在赋值运算符右边的表达式,它可以是一个常量、变量或表达式的结果。例如,
- 赋值运算符
- 条件表达式(三目运算符)
- 语法和功能
- 条件表达式的语法为
condition? expression1 : expression2
,其中condition
是一个条件(关系表达式或逻辑表达式等),如果condition
为true
,则计算expression1
并返回其结果,否则计算expression2
并返回其结果。 - 例如,
int a = 5; int b = 3; int max = (a > b)? a : b;
这里max
的值为5
,因为a > b
为true
,所以返回a
的值。条件表达式可以在一些简单的条件判断场景中替代if - else
语句,使代码更加简洁。
- 条件表达式的语法为
- 语法和功能
- 逗号表达式
- 语法和计算顺序
- 逗号表达式的语法是
expression1, expression2,..., expressionN
,它会从左到右依次计算每个表达式的值,最后返回最后一个表达式的值。 - 例如,
int a = (1 + 2, 3 * 4);
先计算1 + 2
,然后计算3 * 4
,最后a
的值为12
,因为逗号表达式返回最后一个表达式的值。逗号表达式通常用于在一个表达式中执行多个操作,但只关心最后一个操作的结果的场景。
以下是各类C++表达式对应的代码示例,方便你更好地理解它们的用法:
- 逗号表达式的语法是
- 语法和计算顺序
算术表达式示例
#include <iostream>
int main() {
// 加法运算
int num1 = 5;
int num2 = 3;
int sum = num1 + num2;
std::cout << "加法结果:" << sum << std::endl;
// 减法运算
int diff = num1 - num2;
std::cout << "减法结果:" << diff << std::endl;
// 乘法运算
int product = num1 * num2;
std::cout << "乘法结果:" << product << std::endl;
// 整数除法运算
int divResult1 = 10 / 3;
std::cout << "整数除法结果:" << divResult1 << std::endl;
// 浮点数除法运算
double num3 = 10.0;
double num4 = 3.0;
double divResult2 = num3 / num4;
std::cout << "浮点数除法结果:" << divResult2 << std::endl;
// 取模运算
int remainder = 10 % 3;
std::cout << "取模结果:" << remainder << std::endl;
// 自动类型转换示例
int intValue = 5;
double doubleValue = 2.5;
double result = intValue + doubleValue;
std::cout << "自动类型转换结果:" << result << std::endl;
// 强制类型转换示例
double doubleNum = 3.7;
int convertedNum = (int)doubleNum;
std::cout << "强制类型转换结果:" << convertedNum << std::endl;
return 0;
}
关系表达式示例
#include <iostream>
int main() {
int a = 5;
int b = 3;
// 大于关系判断
bool greater = a > b;
std::cout << "a大于b的判断结果:" << (greater? "true" : "false") << std::endl;
// 等于关系判断,注意这里容易误写成赋值(=),要格外小心
bool equal = a == b;
std::cout << "a等于b的判断结果:" << (equal? "true" : "false") << std::endl;
return 0;
}
逻辑表达式示例
#include <iostream>
int main() {
bool a = true;
bool b = false;
// 逻辑与运算示例
bool andResult = a && b;
std::cout << "逻辑与结果:" << (andResult? "true" : "false") << std::endl;
// 逻辑或运算示例
bool orResult = a || b;
std::cout << "逻辑或结果:" << (orResult? "true" : "false") << std::endl;
// 逻辑非运算示例
bool notResult =!a;
std::cout << "逻辑非结果:" << (notResult? "true" : "false") << std::endl;
// 逻辑表达式嵌套示例
bool nestedResult = (a && b) || (!a);
std::cout << "嵌套逻辑表达式结果:" << (nestedResult? "true" : "false") << std::endl;
return 0;
}
赋值表达式示例
#include <iostream>
int main() {
int a = 5;
// 基本赋值运算
std::cout << "初始a的值:" << a << std::endl;
a = 10;
std::cout << "赋值后a的值:" << a << std::endl;
// 复合赋值运算示例
int b = 3;
b += 2; // 等价于b = b + 2;
std::cout << "b += 2后的结果:" << b << std::endl;
b *= 3; // 等价于b = b * 3;
std::cout << "b *= 3后的结果:" << b << std::endl;
return 0;
}
条件表达式(三目运算符)示例
#include <iostream>
int main() {
int num1 = 5;
int num2 = 3;
int max = (num1 > num2)? num1 : num2;
std::cout << "两数中的较大值:" << max << std::endl;
return 0;
}
逗号表达式示例
#include <iostream>
int main() {
int result = (1 + 2, 3 * 4);
std::cout << "逗号表达式结果:" << result << std::endl;
return 0;
}
这些示例涵盖了不同类型的C++表达式,你可以将代码复制到C++编译器中运行,观察实际的输出结果,进一步掌握各表达式的特点和用法。